⛏️ index : haiku.git

/*
 * Copyright 2011, Ingo Weinhold, ingo_weinhold@gmx.de.
 * Distributed under the terms of the MIT License.
 */
#ifndef ATTRIBUTE_INDEX_H
#define ATTRIBUTE_INDEX_H


#include "Index.h"
#include "NodeListener.h"


class AttributeIndexer;
struct AttributeIndexTreeKey;
struct AttributeIndexTreeValue;


class AttributeIndex : public Index, private NodeListener {
public:
								AttributeIndex();
	virtual						~AttributeIndex();

			status_t			Init(Volume* volume, const char* name,
									uint32 type, size_t keyLength);

	virtual	int32				CountEntries() const;

private:
	virtual	void				NodeAdded(Node* node);
	virtual	void				NodeRemoved(Node* node);
	virtual	void				NodeChanged(Node* node, uint32 statFields,
									const OldNodeAttributes& oldAttributes);

protected:
	virtual	AbstractIndexIterator* InternalGetIterator();
	virtual	AbstractIndexIterator* InternalFind(const void* key,
									size_t length);

private:
			typedef AttributeIndexTreeKey TreeKey;
			typedef AttributeIndexTreeValue TreeValue;
			struct TreeDefinition;
			struct NodeTree;

			struct IteratorPolicy;
			class Iterator;
			class IteratorList;
			friend class Iterator;
			friend struct IteratorPolicy;

			friend class AttributeIndexer;

private:
			void				_AddIteratorToUpdate(Iterator* iterator);

private:
			NodeTree*			fNodes;
			IteratorList*		fIteratorsToUpdate;
			AttributeIndexer*	fIndexer;
};


#endif	// ATTRIBUTE_INDEX_H