dlist.inc

Go to the documentation of this file.
00001 
00029 #ifndef ABA_DLIST_INC
00030 #define ABA_DLIST_INC
00031     
00032   template<class Type>
00033   inline ABA_DLIST<Type>::ABA_DLIST(ABA_GLOBAL *glob)
00034   :  
00035     glob_(glob),  
00036     first_(0),  
00037     last_(0)
00038   {  }
00039 
00040 
00041   template<class Type>
00042   ABA_DLIST<Type>::~ABA_DLIST()
00043   {
00044      ABA_DLISTITEM<Type> *item = first_;
00045      ABA_DLISTITEM<Type> *del;
00046     
00047      while (item) {
00048        del = item;
00049        item = item->succ_;
00050        delete del;
00051      }
00052   }
00053 
00054   template <class Type>
00055   ostream& operator<<(ostream &out, const ABA_DLIST<Type> &list)
00056   {
00057     ABA_DLISTITEM<Type> *item = list.first_;
00058 
00059     while (item != 0) {
00060       out << *item << " ";
00061       item = item->succ();
00062     }
00063     out << endl;
00064     return out;
00065   }
00066 
00067   template<class Type> 
00068   void ABA_DLIST<Type>::append(const Type &elem)
00069   {
00070     ABA_DLISTITEM<Type> *item = new ABA_DLISTITEM<Type>(elem, last_, 0);
00071     if (first_ == 0) first_ = item;
00072     else last_->succ_ = item;
00073     last_ = item;
00074   }
00075 
00076   template <class Type>
00077   int ABA_DLIST<Type>::extractHead(Type &elem)
00078   {
00079     int status;
00080     if ((status = firstElem(elem))) return status;
00081     
00082     ABA_DLISTITEM<Type> *second = first_->succ_;
00083 
00084     delete first_;
00085     first_ = second;
00086     // FIX fixes bug reported by Christophe Meyer
00087     if (first_ == 0) last_ = 0;
00088 
00089     return status;
00090   }
00091 
00092   template <class Type>
00093   int ABA_DLIST<Type>::removeHead()
00094   {
00095     if (first_) {
00096       ABA_DLISTITEM<Type> *second = first_->succ_;
00097 
00098       delete first_;
00099       first_ = second;
00100       // FIX fixes bug reported by Christophe Meyer
00101       if (first_ == 0) last_ = 0;
00102       return 0;
00103     }
00104     else return 1;
00105   }
00106 
00107   template <class Type>
00108   void ABA_DLIST<Type>::remove(ABA_DLISTITEM<Type> *item)
00109   {
00110     if (item == 0) return;
00111 
00113 
00114     if (first_ == item) {
00115       first_ = item->succ_;
00116       if(first_ != 0) first_->pred_ = 0;
00117     }
00118     else
00119      item->pred_->succ_ = item->succ_;
00120 
00122   
00123     if (last_ == item) {
00124       last_ = item->pred_;
00125       if (last_ != 0) last_->succ_ = 0;
00126     }
00127     else
00128       item->succ_->pred_ = item->pred_;
00129     
00130     delete item;
00131   }
00132 
00133   template<class Type>
00134   void ABA_DLIST<Type>::remove(const Type &elem)
00135   {
00136     ABA_DLISTITEM<Type> *item = first_;
00137 
00138     while (item != 0) {
00139       if (item->elem_ == elem) {
00140         remove(item);
00141         return;
00142       }
00143       item = item->succ_;
00144     }
00145   }
00146 
00147   template<class Type>
00148   inline ABA_DLISTITEM<Type>* ABA_DLIST<Type>::first() const
00149   {
00150     return first_;
00151   }
00152 
00153   template<class Type>
00154   inline ABA_DLISTITEM<Type>* ABA_DLIST<Type>::last() const
00155   {
00156     return last_;
00157   }
00158 
00159   template<class Type>
00160   inline bool ABA_DLIST<Type>::empty() const
00161   {
00162     return first_ == 0 ? true : false;
00163   }
00164 
00165   template <class Type>
00166   inline int ABA_DLIST<Type>::firstElem(Type &elem) const
00167   {
00168     if (empty()) return 1;
00169     elem = first()->elem();
00170     return 0;
00171   }
00172   
00173 #endif   // ABA_DLIST_INC

Generated on Tue Aug 14 18:09:53 2007 for ABACUS by  doxygen 1.5.1