1/*
2 * Copyright 2007, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * All rights reserved. Distributed under the terms of the MIT license.
4 */
5#ifndef INDEX_H
6#define INDEX_H
7
8#include <SupportDefs.h>
9
10#include "String.h"
11
12class AbstractIndexEntryIterator;
13class Entry;
14class IndexEntryIterator;
15class Node;
16class Volume;
17
18// Index
19class Index {
20public:
21	Index(Volume *volume, const char *name, uint32 type,
22		  bool fixedKeyLength, size_t keyLength = 0);
23	virtual ~Index();
24
25	status_t InitCheck() const;
26
27	Volume *GetVolume() const		{ return fVolume; }
28	void GetVolume(Volume *volume)	{ fVolume = volume; }
29
30	const char *GetName() const		{ return fName.GetString(); }
31	uint32 GetType() const			{ return fType; }
32	bool HasFixedKeyLength() const	{ return fFixedKeyLength; }
33	size_t GetKeyLength() const		{ return fKeyLength; }
34
35	virtual int32 CountEntries() const = 0;
36
37	bool GetIterator(IndexEntryIterator *iterator);
38	bool Find(const uint8 *key, size_t length,
39			  IndexEntryIterator *iterator);
40
41	// debugging
42	void Dump();
43
44protected:
45	virtual AbstractIndexEntryIterator *InternalGetIterator() = 0;
46	virtual AbstractIndexEntryIterator *InternalFind(const uint8 *key,
47													 size_t length) = 0;
48
49protected:
50	Volume		*fVolume;
51	status_t	fInitStatus;
52	String		fName;
53	uint32		fType;
54	size_t		fKeyLength;
55	bool		fFixedKeyLength;
56};
57
58// IndexEntryIterator
59class IndexEntryIterator {
60public:
61	IndexEntryIterator();
62	IndexEntryIterator(Index *index);
63	~IndexEntryIterator();
64
65	Entry *GetCurrent();
66	Entry *GetCurrent(uint8 *buffer, size_t *keyLength);
67	Entry *GetPrevious();
68	Entry *GetNext();
69	Entry *GetNext(uint8 *buffer, size_t *keyLength);
70
71	status_t Suspend();
72	status_t Resume();
73
74private:
75	void SetIterator(AbstractIndexEntryIterator *iterator);
76
77private:
78	friend class Index;
79
80	AbstractIndexEntryIterator	*fIterator;
81};
82
83#endif	// INDEX_H
84