1/* 2 * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef ATTRIBUTE_INDEX_H 6#define ATTRIBUTE_INDEX_H 7 8 9#include "Index.h" 10#include "NodeListener.h" 11 12 13class AttributeIndexer; 14struct AttributeIndexTreeKey; 15struct AttributeIndexTreeValue; 16 17 18class AttributeIndex : public Index, private NodeListener { 19public: 20 AttributeIndex(); 21 virtual ~AttributeIndex(); 22 23 status_t Init(Volume* volume, const char* name, 24 uint32 type, size_t keyLength); 25 26 virtual int32 CountEntries() const; 27 28private: 29 virtual void NodeAdded(Node* node); 30 virtual void NodeRemoved(Node* node); 31 virtual void NodeChanged(Node* node, uint32 statFields, 32 const OldNodeAttributes& oldAttributes); 33 34protected: 35 virtual AbstractIndexIterator* InternalGetIterator(); 36 virtual AbstractIndexIterator* InternalFind(const void* key, 37 size_t length); 38 39private: 40 typedef AttributeIndexTreeKey TreeKey; 41 typedef AttributeIndexTreeValue TreeValue; 42 struct TreeDefinition; 43 struct NodeTree; 44 45 struct IteratorPolicy; 46 class Iterator; 47 class IteratorList; 48 friend class Iterator; 49 friend struct IteratorPolicy; 50 51 friend class AttributeIndexer; 52 53private: 54 void _AddIteratorToUpdate(Iterator* iterator); 55 56private: 57 NodeTree* fNodes; 58 IteratorList* fIteratorsToUpdate; 59 AttributeIndexer* fIndexer; 60}; 61 62 63#endif // ATTRIBUTE_INDEX_H 64