#pragma once #ifndef BLOBSTORE_IMPLEMENTATIONS_ONBLOCKS_DATATREE_H_ #define BLOBSTORE_IMPLEMENTATIONS_ONBLOCKS_DATATREE_H_ #include #include #include namespace blockstore { class Key; } namespace blobstore { namespace onblocks { namespace datanodestore { class DataNodeStore; class DataInnerNode; class DataLeafNode; class DataNode; } namespace datatreestore { class DataTree { public: DataTree(datanodestore::DataNodeStore *nodeStore, std::unique_ptr rootNode); virtual ~DataTree(); std::unique_ptr addDataLeaf(); void removeLastDataLeaf(); const blockstore::Key &key() const; void flush() const; private: datanodestore::DataNodeStore *_nodeStore; std::unique_ptr _rootNode; std::unique_ptr addDataLeafAt(datanodestore::DataInnerNode *insertPos); cpputils::optional_ownership_ptr createChainOfInnerNodes(unsigned int num, datanodestore::DataLeafNode *leaf); std::unique_ptr addDataLeafToFullTree(); void deleteLastChildSubtree(datanodestore::DataInnerNode *node); void deleteSubtree(const blockstore::Key &key); void deleteChildrenOf(const datanodestore::DataNode &node); void deleteChildrenOf(const datanodestore::DataInnerNode &node); void ifRootHasOnlyOneChildReplaceRootWithItsChild(); DISALLOW_COPY_AND_ASSIGN(DataTree); }; } } } #endif