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