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
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
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