00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00038 #ifndef __SimpleSplayTree_h
00039 #define __SimpleSplayTree_h
00040
00041 #ifdef __GNUC__
00042 #pragma interface
00043 #endif
00044
00045 #include "_generic.h"
00046 #include "AbstractSplayTree.h"
00047 #include "compare.h"
00048
00049 template <class T>
00050 class SimpleSplayTree;
00051
00052
00058 template <class T>
00059 class SimpleSplayTreeItem
00060 {
00061 friend class AbstractSplayTree<SimpleSplayTreeItem<T>,T>;
00062 friend class SimpleSplayTree<T>;
00063
00064 public:
00065
00067 int Size() {return size;}
00069 void write(ostream& os) {os << Key;}
00071 int counter() {return ctr;}
00073 T& key() {return Key;}
00075 int compare(const T& key)
00076 {return ::compare(Key,key);}
00077
00078 private:
00079
00081 T Key;
00083 int ctr;
00084
00086 SimpleSplayTreeItem<T> *left;
00088 SimpleSplayTreeItem<T> *right;
00090 int size;
00091
00093 SimpleSplayTreeItem(const T* Key_) : Key(*Key_), ctr(1),left(0),right(0),
00094 size(0) {}
00095 };
00096
00097
00098
00099 template <class T>
00100 class SimpleSplayTree : public AbstractSplayTree<SimpleSplayTreeItem<T>,T>
00101 {
00102 public:
00103
00105 SimpleSplayTree(const char* nameBuff = "Unnamed")
00106 : AbstractSplayTree<SimpleSplayTreeItem<T>,T>(nameBuff),
00107 duplicate_flag(true), check_duplicates_flag(true) {}
00108
00110 bool& duplicate() {return duplicate_flag;}
00112 bool& check_duplicates() {return check_duplicates_flag;}
00113
00114 protected:
00115
00117 bool duplicate_flag;
00119 bool check_duplicates_flag;
00120
00122 SimpleSplayTreeItem<T>* insert(T* key);
00124 void extract(SimpleSplayTreeItem<T>* item, bool& status);
00125
00126 };
00127
00128
00129 template <class T>
00130 SimpleSplayTreeItem<T>* SimpleSplayTree<T>::insert(T* key)
00131 {
00132 tree = exec_splay(key,tree);
00133 SimpleSplayTreeItem<T>* treeitem = top();
00134
00135 duplicate_flag = false;
00136 if (check_duplicates_flag && (treeitem != NULL)) {
00137 if (treeitem->compare(*key)==0) {
00138 treeitem->ctr++;
00139 duplicate_flag = true;
00140 return treeitem;
00141 }
00142 }
00143 return AbstractSplayTree<SimpleSplayTreeItem<T>,T>::insert(key);
00144 }
00145
00146
00147 template <class T>
00148 void SimpleSplayTree<T>::extract(SimpleSplayTreeItem<T>* item, bool& status)
00149 {
00150 if (check_duplicates_flag) {
00151 tree = exec_splay(&(item->key()),tree);
00152 SimpleSplayTreeItem<T>* treeitem = top();
00153 if (treeitem && (treeitem->compare(item->key()) == 0)) {
00154 treeitem->ctr--;
00155 if (treeitem->ctr > 0) {
00156 status=true;
00157 return;
00158 }
00159 }
00160 }
00161 AbstractSplayTree<SimpleSplayTreeItem<T>,T>::extract(item,status);
00162 }
00163
00164 #endif