164 lines
3.6 KiB
Plaintext
164 lines
3.6 KiB
Plaintext
#ifndef _BSPTREE_BTREE_HPP_
|
|
#define _BSPTREE_BTREE_HPP_
|
|
#ifndef _COMMON_ASSERT_HPP_
|
|
#include <common/assert.hpp>
|
|
#endif
|
|
#ifndef _COMMON_WINDOWS_HPP_
|
|
#include <common/windows.hpp>
|
|
#endif
|
|
#ifndef _COMMON_PUREVECTOR_HPP_
|
|
#include <common/pvector.hpp>
|
|
#endif
|
|
#ifndef _COMMON_BLOCK_HPP_
|
|
#include <common/block.hpp>
|
|
#endif
|
|
#ifndef _COMMON_SMARTPOINTER_HPP_
|
|
#include <common/pointer.hpp>
|
|
#endif
|
|
#ifndef _BSPTREE_TREENODE_HPP_
|
|
#include <bsptree/treenode.hpp>
|
|
#endif
|
|
|
|
template <class T>
|
|
class BTree
|
|
{
|
|
public:
|
|
BTree(void);
|
|
virtual ~BTree();
|
|
DWORD leaves(void)const;
|
|
WORD insert(const T &someItem,DWORD dupsOk=FALSE);
|
|
WORD insert(PureVector<T> &vectorItems);
|
|
void remove(const T &someItem);
|
|
BOOL searchItem(T &someItem);
|
|
BOOL searchItem(T &someItem,SmartPointer<T> &nodeItem);
|
|
BOOL updateItem(T &someItem);
|
|
void treeItems(PureVector<T> &vectoredItems)const;
|
|
void treeItems(Block<T> &blockItems)const;
|
|
void remove(void);
|
|
protected:
|
|
virtual TreeNode<T> *insertNode(TreeNode<T> *lpRootNode,TreeNode<T> *lpCurrentNode,const T &itemData);
|
|
virtual TreeNode<T> *insertNodeDuplicate(TreeNode<T> *lpRootNode,TreeNode<T> *lpCurrentNode,const T &itemData);
|
|
virtual T *searchNode(TreeNode<T> *lpRootNode,const T &someItem);
|
|
virtual TreeNode<T> *deleteBTree(TreeNode<T> *lpRootNode);
|
|
TreeNode<T> *rootNode(void)const;
|
|
TreeNode<T> *rootNode(TreeNode<T> *lpRootNode);
|
|
private:
|
|
BTree(const BTree<T> &someBTree);
|
|
BTree<T> &operator=(const BTree<T> &someBTree);
|
|
void leaves(DWORD leaves);
|
|
void remove(const T &someItem,TreeNode<T> *pCurrNode,TreeNode<T> *pParentNode);
|
|
void retrieveNodes(TreeNode<T> *lpRootNode,PureVector<T> &vectoredNodes,WORD &vectorIndex)const;
|
|
void retrieveNodes(TreeNode<T> *lpRootNode,Block<T> &blockNodes)const;
|
|
|
|
TreeNode<T> *mlpRootNode;
|
|
DWORD mLeaves;
|
|
};
|
|
|
|
template <class T>
|
|
inline
|
|
BTree<T>::BTree(void)
|
|
: mlpRootNode(0), mLeaves(0)
|
|
{
|
|
}
|
|
|
|
template <class T>
|
|
inline
|
|
BTree<T>::BTree(const BTree<T> &/*someBTree*/)
|
|
: mlpRootNode(0), mLeaves(0)
|
|
{ // private implementation
|
|
}
|
|
|
|
template <class T>
|
|
inline
|
|
BTree<T>::~BTree()
|
|
{
|
|
remove();
|
|
}
|
|
|
|
template <class T>
|
|
inline
|
|
BTree<T> &BTree<T>::operator=(const BTree<T> &/*someBTree*/)
|
|
{ // private implementation
|
|
return *this;
|
|
}
|
|
|
|
template <class T>
|
|
inline
|
|
WORD BTree<T>::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 <class T>
|
|
inline
|
|
BOOL BTree<T>::searchItem(T &someItem)
|
|
{
|
|
T *lpTempItem=(searchNode(mlpRootNode,someItem));
|
|
if(lpTempItem){someItem=*lpTempItem;return TRUE;}
|
|
else return FALSE;
|
|
}
|
|
|
|
template <class T>
|
|
inline
|
|
BOOL BTree<T>::searchItem(T &someItem,SmartPointer<T> &nodeItem)
|
|
{
|
|
T *lpTempItem=(searchNode(mlpRootNode,someItem));
|
|
if(lpTempItem){nodeItem=lpTempItem;return TRUE;}
|
|
return FALSE;
|
|
}
|
|
|
|
template <class T>
|
|
inline
|
|
void BTree<T>::remove(void)
|
|
{
|
|
mlpRootNode=deleteBTree(mlpRootNode);
|
|
leaves(0);
|
|
}
|
|
|
|
template <class T>
|
|
inline
|
|
TreeNode<T> *BTree<T>::rootNode(void)const
|
|
{
|
|
return mlpRootNode;
|
|
}
|
|
|
|
template <class T>
|
|
inline
|
|
TreeNode<T> *BTree<T>::rootNode(TreeNode<T> *lpRootNode)
|
|
{
|
|
remove();
|
|
return mlpRootNode=lpRootNode;
|
|
}
|
|
|
|
template <class T>
|
|
inline
|
|
DWORD BTree<T>::leaves(void)const
|
|
{
|
|
return mLeaves;
|
|
}
|
|
|
|
template <class T>
|
|
inline
|
|
void BTree<T>::leaves(DWORD leaves)
|
|
{
|
|
mLeaves=leaves;
|
|
}
|
|
#if defined(_MSC_VER)
|
|
#include <bsptree/btree.tpp>
|
|
#endif
|
|
#endif
|
|
|
|
|