#ifndef _BSPTREE_BTREE_HPP_ #define _BSPTREE_BTREE_HPP_ #ifndef _COMMON_ASSERT_HPP_ #include #endif #ifndef _COMMON_WINDOWS_HPP_ #include #endif #ifndef _COMMON_PUREVECTOR_HPP_ #include #endif #ifndef _COMMON_BLOCK_HPP_ #include #endif #ifndef _COMMON_SMARTPOINTER_HPP_ #include #endif #ifndef _BSPTREE_TREENODE_HPP_ #include #endif template class BTree { public: BTree(void); virtual ~BTree(); DWORD leaves(void)const; WORD insert(const T &someItem,DWORD dupsOk=FALSE); WORD insert(PureVector &vectorItems); void remove(const T &someItem); BOOL searchItem(T &someItem); BOOL searchItem(T &someItem,SmartPointer &nodeItem); BOOL updateItem(T &someItem); void treeItems(PureVector &vectoredItems)const; void treeItems(Block &blockItems)const; void remove(void); protected: virtual TreeNode *insertNode(TreeNode *lpRootNode,TreeNode *lpCurrentNode,const T &itemData); virtual TreeNode *insertNodeDuplicate(TreeNode *lpRootNode,TreeNode *lpCurrentNode,const T &itemData); virtual T *searchNode(TreeNode *lpRootNode,const T &someItem); virtual TreeNode *deleteBTree(TreeNode *lpRootNode); TreeNode *rootNode(void)const; TreeNode *rootNode(TreeNode *lpRootNode); private: BTree(const BTree &someBTree); BTree &operator=(const BTree &someBTree); void leaves(DWORD leaves); void remove(const T &someItem,TreeNode *pCurrNode,TreeNode *pParentNode); void retrieveNodes(TreeNode *lpRootNode,PureVector &vectoredNodes,WORD &vectorIndex)const; void retrieveNodes(TreeNode *lpRootNode,Block &blockNodes)const; TreeNode *mlpRootNode; DWORD mLeaves; }; template inline BTree::BTree(void) : mlpRootNode(0), mLeaves(0) { } template inline BTree::BTree(const BTree &/*someBTree*/) : mlpRootNode(0), mLeaves(0) { // private implementation } template inline BTree::~BTree() { remove(); } template inline BTree &BTree::operator=(const BTree &/*someBTree*/) { // private implementation return *this; } template inline WORD BTree::insert(const T &someItem,DWORD dupsOk) { DWORD itemCount(leaves()); if(dupsOk) { if(!mlpRootNode)leaves(leaves()+(0!=(mlpRootNode=insertNodeDuplicate(mlpRootNode,mlpRootNode,someItem)))); else leaves(leaves()+(0!=insertNodeDuplicate(mlpRootNode,mlpRootNode,someItem))); } else { if(!mlpRootNode)leaves(leaves()+(0!=(mlpRootNode=insertNode(mlpRootNode,mlpRootNode,someItem)))); else leaves(leaves()+(0!=insertNode(mlpRootNode,mlpRootNode,someItem))); } return (!(itemCount==leaves())); } template inline BOOL BTree::searchItem(T &someItem) { T *lpTempItem=(searchNode(mlpRootNode,someItem)); if(lpTempItem){someItem=*lpTempItem;return TRUE;} else return FALSE; } template inline BOOL BTree::searchItem(T &someItem,SmartPointer &nodeItem) { T *lpTempItem=(searchNode(mlpRootNode,someItem)); if(lpTempItem){nodeItem=lpTempItem;return TRUE;} return FALSE; } template inline void BTree::remove(void) { mlpRootNode=deleteBTree(mlpRootNode); leaves(0); } template inline TreeNode *BTree::rootNode(void)const { return mlpRootNode; } template inline TreeNode *BTree::rootNode(TreeNode *lpRootNode) { remove(); return mlpRootNode=lpRootNode; } template inline DWORD BTree::leaves(void)const { return mLeaves; } template inline void BTree::leaves(DWORD leaves) { mLeaves=leaves; } #if defined(_MSC_VER) #include #endif #endif