00001
00015 #ifndef INC_MI32_BALANCEDTREE_H
00016 #define INC_MI32_BALANCEDTREE_H
00017
00018 #ifndef INC_MI32_BTREEFUN_H
00019 #include <mi32/btreefun.h>
00020 #endif
00021
00022
00023 #ifndef INC_MI32_ERRCODES_H
00024 #include <mi32/errcodes.h>
00025 #endif
00026
00027 #ifndef INC_MI32_ERRHANDLER_H
00028 #include <mi32/errhandler.h>
00029 #endif
00030
00031
00033 template <typename _ITEMTYPE> class BALANCEDTREE {
00034 public:
00035
00037 class DUMP {
00038 public:
00039 virtual ERRVALUE v_DumpItem (const _ITEMTYPE& item, INT32 TagNum) = 0;
00040 };
00041
00043 class TEST {
00044 public:
00045 virtual ~TEST () {}
00046 virtual int v_TestItems (const _ITEMTYPE& p1, const _ITEMTYPE& p2) { return ((p1 < p2) ? -1 : ((p2 < p1) ? 1 : 0)); }
00047 };
00048
00049 private:
00050 #ifndef GENERATING_DOXYGEN_OUTPUT
00051 static int DumpFunc (void* p1, INT32* tagnum, void* ud) {
00052 return (static_cast<DUMP*>(ud)->v_DumpItem(*static_cast<_ITEMTYPE*>(p1), *tagnum));
00053 }
00054
00055 static int TestFunc (const void* p1, const void* p2, void* ud) {
00056 return (static_cast<TEST*>(ud)->v_TestItems(*static_cast<const _ITEMTYPE*>(p1), *static_cast<const _ITEMTYPE*>(p2)));
00057 }
00058 #endif // GENERATING_DOXYGEN_OUTPUT
00059
00060 public:
00061
00063 BALANCEDTREE (
00064 ) : m_BTreeHandle(0) {}
00065
00067 ~BALANCEDTREE (
00068 ) {
00069 if (m_BTreeHandle != 0) {
00070 delete static_cast<TEST*>(BTreeGetUserData(m_BTreeHandle));
00071 BTreeFree(m_BTreeHandle);
00072 }
00073 }
00074
00076 ERRVALUE Allocate (
00077 INT32 InitialNumItems,
00078 TEST Test = TEST()
00079 ) {
00080 m_BTreeHandle = BTreeAlloc(InitialNumItems, sizeof(_ITEMTYPE), TestFunc, new TEST(Test));
00081 if (m_BTreeHandle == 0) return (SetErrPosnC(EOutOfMemory));
00082 return (0);
00083 }
00084
00086 ERRVALUE Clear (
00087 ) { return (BTreeClear(m_BTreeHandle)); }
00088
00091 INT32 FindAndInsertKey (
00092 _ITEMTYPE& Item,
00093 INT32 CurTagNum,
00094 bool& AddedItem
00095 ) {
00096 int add = 0;
00097 INT32 retval = BTreeFindKey(m_BTreeHandle, &Item, CurTagNum, &add);
00098 AddedItem = (add != 0);
00099 return (retval);
00100 }
00101
00103 bool IsAllocated (
00104 ) const { return (m_BTreeHandle != 0); }
00105
00108 INT32 LocateKey (
00109 const _ITEMTYPE& Item
00110 ) { return (BTreeSearchKey(m_BTreeHandle, const_cast<_ITEMTYPE*>(&Item))); }
00111
00113 ERRVALUE TraverseTree (
00114 DUMP& Dump
00115 ) { return (BTreeDumpT(m_BTreeHandle, DumpFunc, &Dump)); }
00116
00117 private:
00118 #ifndef GENERATING_DOXYGEN_OUTPUT
00119 void *m_BTreeHandle;
00120
00121 BALANCEDTREE (const BALANCEDTREE& rhs);
00122 BALANCEDTREE& operator=(const BALANCEDTREE& rhs);
00123 #endif // GENERATING_DOXYGEN_OUTPUT
00124 };
00125
00126 #endif // INC_MI32_BALANCEDTREE_H