00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00029 #ifndef __GenericSplayTree_h
00030 #define __GenericSplayTree_h
00031
00032 #ifdef __GNUC__
00033 #pragma interface
00034 #endif
00035
00036 #include "_generic.h"
00037 #include "AbstractSplayTree.h"
00038
00039 template <class T>
00040 class UTILIB_API GenericSplayTree;
00041
00042
00046 template <class T>
00047 class UTILIB_API GenericSplayTreeItem
00048 {
00049 friend class AbstractSplayTree<GenericSplayTreeItem<T>,T>;
00050 friend class GenericSplayTree<T>;
00051
00052 public:
00053
00055 int Size() {return size;}
00057 void write(ostream& os) {Keyptr->write(os);}
00059 T& key() {return *Keyptr;}
00061 int compare(const T& key)
00062 {return Keyptr->compare(key);}
00063
00064 private:
00065
00067 T* Keyptr;
00069 int ctr;
00070
00072 GenericSplayTreeItem<T> *left;
00074 GenericSplayTreeItem<T> *right;
00076 int size;
00077
00079 GenericSplayTreeItem(T* key_ptr_) : Keyptr(key_ptr_), ctr(1), left(0),
00080 right(0), size(0) {}
00081 };
00082
00083
00084
00085 template <class T>
00086 class UTILIB_API GenericSplayTree : public AbstractSplayTree<GenericSplayTreeItem<T>,T>
00087 {
00088 public:
00089
00091 explicit GenericSplayTree(const char* nameBuff = "Unnamed")
00092 : AbstractSplayTree<GenericSplayTreeItem<T>,T>(nameBuff),
00093 duplicate_flag(true), check_duplicates_flag(true) {}
00094
00096 bool& duplicate() {return duplicate_flag;}
00098 bool& check_duplicates() {return check_duplicates_flag;}
00099
00100 protected:
00101
00103 bool duplicate_flag;
00105 bool check_duplicates_flag;
00106
00111 GenericSplayTreeItem<T>* insert(T* key);
00116 void extract(GenericSplayTreeItem<T>* item, bool& status);
00117
00118 };
00119
00120
00121 template <class T>
00122 GenericSplayTreeItem<T>* GenericSplayTree<T>::insert(T* key)
00123 {
00124 tree = exec_splay(key,tree);
00125 GenericSplayTreeItem<T>* treeitem = top();
00126
00127 duplicate_flag = false;
00128 if (check_duplicates_flag && (treeitem != NULL)) {
00129 if (treeitem->compare(*key)==0) {
00130 treeitem->ctr++;
00131 duplicate_flag = true;
00132 return treeitem;
00133 }
00134 }
00135 return AbstractSplayTree<GenericSplayTreeItem<T>,T>::insert(key);
00136 }
00137
00138
00139 template <class T>
00140 void GenericSplayTree<T>::extract(GenericSplayTreeItem<T>* item, bool& status)
00141 {
00142 if (check_duplicates_flag) {
00143 tree = exec_splay(&(item->key()),tree);
00144 GenericSplayTreeItem<T>* treeitem = top();
00145 if (treeitem && (treeitem->compare(item->key()) == 0)) {
00146 treeitem->ctr--;
00147 if (treeitem->ctr > 0) {
00148 status=true;
00149 return;
00150 }
00151 }
00152 }
00153 AbstractSplayTree<GenericSplayTreeItem<T>,T>::extract(item,status);
00154 }
00155
00156
00157
00158 #endif