Files
Work/bsptree/BTREE.BAK
2024-08-07 09:12:07 -04:00

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