#ifndef _BSPTREE_BTREE_HPP_ #define _BSPTREE_BTREE_HPP_ #ifndef _COMMON_ASSERT_HPP_ #include #endif #ifndef _COMMON_WINDOWS_HPP_ #include #endif #ifndef _COMMON_ARRAY_HPP_ #include #endif #ifndef _COMMON_BLOCK_HPP_ #include #endif #ifndef _COMMON_ARRAY_HPP_ #include #endif #ifndef _COMMON_SMARTPOINTER_HPP_ #include #endif #ifndef _BSPTREE_TREENODE_HPP_ #include #endif template class BTree { public: BTree(void); virtual ~BTree(); BTree &operator=(const BTree &someBTree); DWORD leaves(void)const; WORD insert(const T &someItem,DWORD dupsOk=FALSE); WORD insert(Array &vectorItems); void remove(const T &someItem); BOOL searchItem(T &someItem); BOOL find(T &someItem); BOOL searchItem(const T &someItem); BOOL searchItem(const T &someItem,SmartPointer &nodeItem); BOOL searchItems(const T &someItem,Block > &nodeItems); BOOL updateItem(T &someItem); void treeItems(Block &blockItems)const; void treeItems(Array &arrayItems)const; BOOL lastItemInserted(SmartPointer &lastItemInserted); 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 bool searchNodeDuplicate(TreeNode *lpRootNode,const T &someItem,Block > &items); virtual TreeNode *deleteBTree(TreeNode *lpRootNode); TreeNode *rootNode(void)const; TreeNode *rootNode(TreeNode *lpRootNode); void leaves(DWORD leaves); private: BTree(const BTree &someBTree); void remove(const T &someItem,TreeNode *pCurrNode,TreeNode *pParentNode); void retrieveNodes(TreeNode *lpRootNode,Array &arrayNodes,DWORD &arrayIndex)const; void retrieveNodes(TreeNode *lpRootNode,Block &blockNodes)const; TreeNode *mlpRootNode; TreeNode *mlpLastNodeInserted; DWORD mLeaves; }; template inline BTree::BTree(void) : mlpRootNode(0), mlpLastNodeInserted(0), mLeaves(0) { } template inline BTree::BTree(const BTree &/*someBTree*/) : mlpRootNode(0), mlpLastNodeInserted(0), mLeaves(0) { // private implementation } template inline BTree::~BTree() { remove(); } 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::find(T &someItem) { return searchItem(someItem); } 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(const T &someItem) { T *lpTempItem=(searchNode(mlpRootNode,someItem)); if(lpTempItem)return TRUE; return FALSE; } template inline BOOL BTree::searchItem(const T &someItem,SmartPointer &nodeItem) { T *lpTempItem=(searchNode(mlpRootNode,someItem)); if(lpTempItem){nodeItem=lpTempItem;return TRUE;} return FALSE; } template inline BOOL BTree::searchItems(const T &someItem,Block > &nodeItems) { return searchNodeDuplicate(mlpRootNode,someItem,nodeItems); } template inline void BTree::remove(void) { mlpRootNode=deleteBTree(mlpRootNode); mlpLastNodeInserted=0; leaves(0); } template inline TreeNode *BTree::rootNode(void)const { return mlpRootNode; } template inline TreeNode *BTree::rootNode(TreeNode *lpRootNode) { remove(); return mlpRootNode=lpRootNode; } template inline BOOL BTree::lastItemInserted(SmartPointer &lastItemInserted) { if(!mlpLastNodeInserted)return FALSE; lastItemInserted=&mlpLastNodeInserted->item(); return TRUE; } 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