xref: /haiku/src/add-ons/kernel/file_systems/packagefs/indices/Index.h (revision 56430ad8002b8fd1ac69b590e9cc130de6d9e852)
1 /*
2  * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef INDEX_H
6 #define INDEX_H
7 
8 
9 #include <string.h>
10 
11 #include <SupportDefs.h>
12 
13 #include <util/OpenHashTable.h>
14 
15 #include "String.h"
16 #include "StringKey.h"
17 
18 
19 class AbstractIndexIterator;
20 class IndexIterator;
21 class Node;
22 class Volume;
23 
24 
25 static const size_t kMaxIndexKeyLength = 256;
26 
27 
28 class Index {
29 public:
30 								Index();
31 	virtual						~Index();
32 
33 			status_t			Init(Volume* volume, const char* name,
34 									uint32 type, bool fixedKeyLength,
35 									size_t keyLength = 0);
36 
37 			Volume*				GetVolume() const		{ return fVolume; }
38 
39 			const String&		Name() const			{ return fName; }
40 			uint32				Type() const			{ return fType; }
41 			bool				HasFixedKeyLength() const
42 									{ return fFixedKeyLength; }
43 			size_t				KeyLength() const		{ return fKeyLength; }
44 
45 	virtual	int32				CountEntries() const = 0;
46 
47 			bool				GetIterator(IndexIterator& iterator);
48 			bool				Find(const void* key, size_t length,
49 									IndexIterator& iterator);
50 									// sets the iterator to the first value
51 									// >= key
52 
53 			Index*&				IndexHashLink()
54 									{ return fHashLink; }
55 
56 			// debugging
57 			void				Dump();
58 
59 protected:
60 	virtual	AbstractIndexIterator* InternalGetIterator() = 0;
61 	virtual	AbstractIndexIterator* InternalFind(const void* key,
62 									size_t length) = 0;
63 									// returns an iterator pointing to the first
64 									// value >= key
65 
66 protected:
67 			Index*				fHashLink;
68 			Volume*				fVolume;
69 			String				fName;
70 			uint32				fType;
71 			size_t				fKeyLength;
72 			bool				fFixedKeyLength;
73 };
74 
75 
76 class IndexIterator {
77 public:
78 								IndexIterator();
79 								~IndexIterator();
80 
81 			bool				HasNext() const;
82 			Node*				Next();
83 			Node*				Next(void* buffer, size_t* _keyLength);
84 
85 			status_t			Suspend();
86 			status_t			Resume();
87 
88 private:
89 			void				SetIterator(AbstractIndexIterator* iterator);
90 
91 private:
92 			friend class Index;
93 
94 private:
95 			AbstractIndexIterator* fIterator;
96 };
97 
98 
99 // #pragma mark - IndexHashDefinition
100 
101 
102 struct IndexHashDefinition {
103 	typedef StringKey	KeyType;
104 	typedef	Index		ValueType;
105 
106 	size_t HashKey(const StringKey& key) const
107 	{
108 		return key.Hash();
109 	}
110 
111 	size_t Hash(const Index* value) const
112 	{
113 		return value->Name().Hash();
114 	}
115 
116 	bool Compare(const StringKey& key, const Index* value) const
117 	{
118 		return key == value->Name();
119 	}
120 
121 	Index*& GetLink(Index* value) const
122 	{
123 		return value->IndexHashLink();
124 	}
125 };
126 
127 
128 typedef BOpenHashTable<IndexHashDefinition> IndexHashTable;
129 
130 
131 #endif	// INDEX_H
132