SimpleSplayTree.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 // SimpleSplayTree.h
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) {    // it's already there
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