GenericSplayTree.h

00001 /*  _________________________________________________________________________
00002  *
00003  *  UTILIB: A utility library for developing portable C++ codes.
00004  *  Copyright (c) 2001, Sandia National Laboratories.
00005  *  This software is distributed under the GNU Lesser General Public License.
00006  *  For more information, see the README file in the top UTILIB directory.
00007  *  _________________________________________________________________________
00008  */
00009 
00010 // 
00011 // GenericSplayTree.h
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) {     // it's already there
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