| [4486] | 1 | /*! | 
|---|
| [5068] | 2 |  * @file list.h | 
|---|
 | 3 |  * a File that includes a List-template | 
|---|
 | 4 |  */ | 
|---|
| [2636] | 5 |  | 
|---|
| [5836] | 6 | #ifndef _T_LIST_H | 
|---|
 | 7 | #define _T_LIST_H | 
|---|
| [2036] | 8 |  | 
|---|
| [3860] | 9 | #include "compiler.h" | 
|---|
 | 10 | #ifndef NULL | 
|---|
| [4499] | 11 | #define NULL 0                                       //!< this will define NULL | 
|---|
| [3860] | 12 | #endif | 
|---|
| [2036] | 13 |  | 
|---|
| [5115] | 14 | template<class T> class tIterator; | 
|---|
| [2036] | 15 |  | 
|---|
| [4574] | 16 | //! a list element of the tList, | 
|---|
| [3652] | 17 | template<class T> struct listElement | 
|---|
| [2077] | 18 | { | 
|---|
| [4488] | 19 |   listElement*        prev;                          //!< pointer to the previous listElement in the list | 
|---|
 | 20 |   T*                  curr;                          //!< pointer to the list payload/container | 
|---|
 | 21 |   listElement*        next;                          //!< pointer to the next listElement | 
|---|
| [3652] | 22 | }; | 
|---|
| [2077] | 23 |  | 
|---|
| [4488] | 24 | /** | 
|---|
| [4836] | 25 |  *  the list template class | 
|---|
| [4497] | 26 |  | 
|---|
 | 27 |    you will use this as a generic list for all type of objects | 
|---|
| [5229] | 28 |  */ | 
|---|
| [4574] | 29 | template<class T> class tList | 
|---|
| [2822] | 30 | { | 
|---|
| [5115] | 31 |   friend class tIterator<T>; | 
|---|
 | 32 |  | 
|---|
| [5229] | 33 |   public: | 
|---|
 | 34 |     tList (); | 
|---|
 | 35 |     ~tList (); | 
|---|
| [2822] | 36 |  | 
|---|
| [5229] | 37 |     void add(T* entity); | 
|---|
 | 38 |     void addAtBeginning(T* entity); //!< @todo This should be made with an ENUM | 
|---|
| [5403] | 39 |     void addAtIteratorPosition(T* entity, tIterator<T>* itereator); | 
|---|
| [5229] | 40 |     void remove(const T* entity); | 
|---|
| [5400] | 41 |     void removeFromLast(const T* entity); | 
|---|
| [5229] | 42 |     void removeLast(); | 
|---|
 | 43 |     void flush(); | 
|---|
 | 44 |     T* firstElement() const; | 
|---|
 | 45 |     T* lastElement() const; | 
|---|
 | 46 |     bool isEmpty() const; | 
|---|
 | 47 |     unsigned int getSize() const; | 
|---|
 | 48 |     bool inList(T* entity) const; | 
|---|
 | 49 |     tIterator<T>* getIterator() const; | 
|---|
 | 50 |     T* nextElement(T* toEntity); | 
|---|
 | 51 |     T* toArray(); | 
|---|
| [3652] | 52 |  | 
|---|
| [5229] | 53 |   private: | 
|---|
 | 54 |     unsigned int       size;             //!< the size (lenght) of the list | 
|---|
 | 55 |     listElement<T>*    first;            //!< pointer to the first element | 
|---|
 | 56 |     listElement<T>*    last;             //!< pointer to the last element | 
|---|
 | 57 |     listElement<T>*    currentEl;        //!< pointer to the current element | 
|---|
| [2822] | 58 | }; | 
|---|
 | 59 |  | 
|---|
 | 60 |  | 
|---|
| [4497] | 61 | /** | 
|---|
| [4836] | 62 |  *  the constructor | 
|---|
| [5229] | 63 |  */ | 
|---|
| [2822] | 64 | template<class T> | 
|---|
| [5229] | 65 |     inline tList<T>::tList () | 
|---|
| [2822] | 66 | { | 
|---|
| [5229] | 67 |   this->currentEl = NULL; | 
|---|
| [2822] | 68 |   this->first = NULL; | 
|---|
 | 69 |   this->last = NULL; | 
|---|
 | 70 |   this->size = 0; | 
|---|
 | 71 | } | 
|---|
 | 72 |  | 
|---|
| [4497] | 73 |  | 
|---|
 | 74 | /** | 
|---|
| [4836] | 75 |  *  the deconstructor | 
|---|
| [4497] | 76 |  | 
|---|
| [5229] | 77 |    this will delete only the list. ATTENTION: the list is deleted, but the objects in the list will remain | 
|---|
 | 78 |  */ | 
|---|
| [2822] | 79 | template<class T> | 
|---|
| [5229] | 80 |     inline tList<T>::~tList () | 
|---|
| [3553] | 81 | { | 
|---|
 | 82 |   this->currentEl = this->first; | 
|---|
| [5229] | 83 |   listElement<T>* le; | 
|---|
| [3553] | 84 |   while(this->currentEl != NULL) | 
|---|
| [5229] | 85 |   { | 
|---|
 | 86 |     le = this->currentEl->next; | 
|---|
 | 87 |     delete this->currentEl; | 
|---|
 | 88 |     this->currentEl = le; | 
|---|
 | 89 |   } | 
|---|
| [3553] | 90 |   this->first = NULL; | 
|---|
 | 91 |   this->last = NULL; | 
|---|
| [5229] | 92 |   this->currentEl = NULL; | 
|---|
| [3553] | 93 |   this->size = 0; | 
|---|
 | 94 | } | 
|---|
| [2822] | 95 |  | 
|---|
| [3553] | 96 |  | 
|---|
| [4497] | 97 | /** | 
|---|
| [4836] | 98 |  *  add an entity to the list | 
|---|
 | 99 |  * @param entity: the entity to add | 
|---|
| [5229] | 100 |  */ | 
|---|
| [2822] | 101 | template<class T> | 
|---|
| [5229] | 102 |     inline void tList<T>::add(T* entity) | 
|---|
| [2822] | 103 | { | 
|---|
| [3860] | 104 |   if( unlikely(entity == NULL)) return; | 
|---|
| [3652] | 105 |   listElement<T>* el = new listElement<T>; | 
|---|
| [2822] | 106 |   el->prev = this->last; | 
|---|
 | 107 |   el->curr = entity; | 
|---|
 | 108 |   el->next = NULL; | 
|---|
 | 109 |  | 
|---|
 | 110 |   this->last = el; | 
|---|
 | 111 |  | 
|---|
| [3860] | 112 |   if( unlikely(el->prev == NULL)) this->first = el; /* if first element */ | 
|---|
| [2822] | 113 |   else el->prev->next = el; | 
|---|
 | 114 |   this->size++; | 
|---|
 | 115 | } | 
|---|
 | 116 |  | 
|---|
| [5073] | 117 | /** | 
|---|
 | 118 |  *  add an entity to the list | 
|---|
 | 119 |  * @param entity: the entity to add | 
|---|
 | 120 |  */ | 
|---|
 | 121 | template<class T> | 
|---|
| [5074] | 122 |     inline void tList<T>::addAtBeginning(T* entity) | 
|---|
| [5073] | 123 | { | 
|---|
 | 124 |   if( unlikely(entity == NULL)) return; | 
|---|
| [5403] | 125 |  | 
|---|
| [5073] | 126 |   listElement<T>* el = new listElement<T>; | 
|---|
 | 127 |   el->next = this->first; | 
|---|
 | 128 |   el->curr = entity; | 
|---|
 | 129 |   el->prev = NULL; | 
|---|
| [2822] | 130 |  | 
|---|
| [5073] | 131 |   this->first = el; | 
|---|
 | 132 |  | 
|---|
| [5229] | 133 |   if( unlikely(el->next == NULL)) this->last = el; /* if first element */ | 
|---|
| [5073] | 134 |   else el->next->prev = el; | 
|---|
 | 135 |   this->size++; | 
|---|
 | 136 | } | 
|---|
 | 137 |  | 
|---|
| [5403] | 138 | /** | 
|---|
 | 139 |  * add an entity at an iterators position | 
|---|
 | 140 |  * @param entity the entity to add | 
|---|
 | 141 |  * @param iterator the iterator get the Positional from | 
|---|
 | 142 |  * | 
|---|
 | 143 |  * this works best with an iterator walking with | 
|---|
 | 144 |  * firstElement() ; nextStep(); | 
|---|
 | 145 |  * or | 
|---|
 | 146 |  * lastElement(); prevStep(); | 
|---|
 | 147 |  */ | 
|---|
 | 148 | template<class T> | 
|---|
 | 149 |     inline void tList<T>::addAtIteratorPosition(T* entity, tIterator<T>* iterator) | 
|---|
 | 150 | { | 
|---|
 | 151 |   // rule out unusable | 
|---|
 | 152 |   if (unlikely(entity == NULL)) | 
|---|
 | 153 |     return; | 
|---|
 | 154 |   // on any error (or next == NULL) add using default add-function | 
|---|
 | 155 |   if (unlikely(iterator == NULL || iterator->getList() == NULL) || | 
|---|
 | 156 |       iterator->tmpEl == NULL || iterator->tmpEl->next == NULL) | 
|---|
 | 157 |     return this->add(entity); | 
|---|
 | 158 |   // on prev == NULL add with addAtBeginning-function | 
|---|
 | 159 |   if (unlikely(iterator->tmpEl->prev == NULL)) | 
|---|
 | 160 |     return addAtBeginning(entity); | 
|---|
 | 161 |   else | 
|---|
 | 162 |   { | 
|---|
 | 163 |     listElement<T>* el = new listElement<T>; | 
|---|
 | 164 |     el->next = iterator->tmpEl->next; | 
|---|
 | 165 |     el->curr = entity; | 
|---|
 | 166 |     el->prev = iterator->tmpEl->prev; | 
|---|
| [5073] | 167 |  | 
|---|
| [5403] | 168 |     el->next->prev = el; | 
|---|
 | 169 |     el->prev->next = el; | 
|---|
 | 170 |   } | 
|---|
 | 171 | } | 
|---|
 | 172 |  | 
|---|
| [4497] | 173 | /** | 
|---|
| [5285] | 174 |  * remove an entity from the list | 
|---|
| [4836] | 175 |  * @param entity: the entity to be removed | 
|---|
| [5229] | 176 |  */ | 
|---|
| [2822] | 177 | template<class T> | 
|---|
| [5229] | 178 |     inline void tList<T>::remove(const T* entity) | 
|---|
| [2822] | 179 | { | 
|---|
 | 180 |   this->currentEl = this->first; | 
|---|
 | 181 |   while( this->currentEl != NULL) | 
|---|
| [5229] | 182 |   { | 
|---|
 | 183 |     if( unlikely(this->currentEl->curr == entity)) | 
|---|
| [2822] | 184 |     { | 
|---|
| [5229] | 185 |       // erstes element? | 
|---|
 | 186 |       if( unlikely(this->currentEl->prev == NULL)) this->first = this->currentEl->next; | 
|---|
 | 187 |       else this->currentEl->prev->next = this->currentEl->next; | 
|---|
| [2822] | 188 |  | 
|---|
| [5229] | 189 |       // letztes element? | 
|---|
 | 190 |       if( unlikely(this->currentEl->next == NULL)) this->last = this->currentEl->prev; | 
|---|
 | 191 |       else this->currentEl->next->prev = this->currentEl->prev; | 
|---|
| [2822] | 192 |  | 
|---|
| [5229] | 193 |       delete this->currentEl; | 
|---|
 | 194 |       this->size--; | 
|---|
 | 195 |       return; | 
|---|
| [2822] | 196 |     } | 
|---|
| [5229] | 197 |     this->currentEl = this->currentEl->next; | 
|---|
 | 198 |   } | 
|---|
| [2822] | 199 | } | 
|---|
 | 200 |  | 
|---|
| [5400] | 201 | /** | 
|---|
 | 202 |  * remove an entity from the list | 
|---|
 | 203 |  * @param entity: the entity to be removed | 
|---|
 | 204 |  * | 
|---|
 | 205 |  * this algorithm starts at the end of the List, working its way to the front | 
|---|
 | 206 |  * for finding the right entity. | 
|---|
 | 207 |  */ | 
|---|
 | 208 | template<class T> | 
|---|
 | 209 |     inline void tList<T>::removeFromLast(const T* entity) | 
|---|
 | 210 | { | 
|---|
 | 211 |   this->currentEl = this->last; | 
|---|
 | 212 |   while( this->currentEl != NULL) | 
|---|
 | 213 |   { | 
|---|
 | 214 |     if( unlikely(this->currentEl->curr == entity)) | 
|---|
 | 215 |     { | 
|---|
 | 216 |       // erstes element? | 
|---|
 | 217 |       if( unlikely(this->currentEl->prev == NULL)) this->first = this->currentEl->next; | 
|---|
 | 218 |       else this->currentEl->prev->next = this->currentEl->next; | 
|---|
| [5229] | 219 |  | 
|---|
| [5400] | 220 |       // letztes element? | 
|---|
 | 221 |       if( unlikely(this->currentEl->next == NULL)) this->last = this->currentEl->prev; | 
|---|
 | 222 |       else this->currentEl->next->prev = this->currentEl->prev; | 
|---|
 | 223 |  | 
|---|
 | 224 |       delete this->currentEl; | 
|---|
 | 225 |       this->size--; | 
|---|
 | 226 |       return; | 
|---|
 | 227 |     } | 
|---|
 | 228 |     this->currentEl = this->currentEl->prev; | 
|---|
 | 229 |   } | 
|---|
 | 230 | } | 
|---|
 | 231 |  | 
|---|
 | 232 |  | 
|---|
| [5068] | 233 | /** | 
|---|
 | 234 |  * removes the Last Element of the List | 
|---|
 | 235 |  */ | 
|---|
 | 236 |  template<class T> | 
|---|
 | 237 |      inline void tList<T>::removeLast() | 
|---|
 | 238 | { | 
|---|
| [5229] | 239 |   if( unlikely(this->last == NULL)) | 
|---|
| [5068] | 240 |     return; | 
|---|
| [5229] | 241 |  | 
|---|
 | 242 |   // only one element in the list (and its not NULL :D ) | 
|---|
 | 243 |   if( unlikely(this->last == this->first)) | 
|---|
| [5068] | 244 |   { | 
|---|
 | 245 |     delete this->first; | 
|---|
 | 246 |     this->first = NULL; | 
|---|
 | 247 |     this->last = NULL; | 
|---|
 | 248 |     this->size--; | 
|---|
 | 249 |   } | 
|---|
 | 250 |   else | 
|---|
 | 251 |   { | 
|---|
 | 252 |     listElement<T>* delLast = this->last; | 
|---|
 | 253 |     this->last->prev->next = NULL; | 
|---|
 | 254 |     this->last = this->last->prev; | 
|---|
 | 255 |     delete delLast; | 
|---|
 | 256 |   } | 
|---|
 | 257 | } | 
|---|
| [2822] | 258 |  | 
|---|
| [5229] | 259 |  | 
|---|
| [4497] | 260 | /** | 
|---|
| [5229] | 261 |  *  this will delete all objects from the list, this can be very dangerous if there are ghost objects in the list. | 
|---|
 | 262 |  */ | 
|---|
| [2822] | 263 | template<class T> | 
|---|
| [5229] | 264 |     inline void tList<T>::flush() | 
|---|
| [2822] | 265 | { | 
|---|
 | 266 |   this->currentEl = this->first; | 
|---|
| [5229] | 267 |  | 
|---|
 | 268 |   listElement<T>* le; | 
|---|
 | 269 |   while( this->currentEl != NULL) | 
|---|
 | 270 |   { | 
|---|
 | 271 |     le = this->currentEl->next; | 
|---|
 | 272 |     delete this->currentEl->curr; | 
|---|
 | 273 |     delete this->currentEl; | 
|---|
 | 274 |     this->currentEl = le; | 
|---|
 | 275 |   } | 
|---|
| [2822] | 276 |   this->first = NULL; | 
|---|
 | 277 |   this->last = NULL; | 
|---|
| [5230] | 278 |   this->currentEl = NULL; | 
|---|
| [2822] | 279 |   this->size = 0; | 
|---|
 | 280 | } | 
|---|
 | 281 |  | 
|---|
 | 282 |  | 
|---|
| [4497] | 283 | /** | 
|---|
| [4836] | 284 |  *  returns the first element of the list | 
|---|
 | 285 |  * @returns first element | 
|---|
| [5229] | 286 |  */ | 
|---|
| [2822] | 287 | template<class T> | 
|---|
| [5229] | 288 |     inline T* tList<T>::firstElement() const | 
|---|
| [2822] | 289 | { | 
|---|
 | 290 |   return this->first->curr; | 
|---|
 | 291 | } | 
|---|
 | 292 |  | 
|---|
| [3832] | 293 |  | 
|---|
| [4497] | 294 | /** | 
|---|
| [4836] | 295 |  *  function returns the last element of the list | 
|---|
 | 296 |  * @returns the last element | 
|---|
| [5229] | 297 |  */ | 
|---|
| [3790] | 298 | template<class T> | 
|---|
| [5229] | 299 |     inline T* tList<T>::lastElement() const | 
|---|
| [3790] | 300 | { | 
|---|
 | 301 |   return this->last->curr; | 
|---|
 | 302 | } | 
|---|
| [2822] | 303 |  | 
|---|
| [3790] | 304 |  | 
|---|
| [4497] | 305 | /** | 
|---|
| [4836] | 306 |  *  returns true if the list is empty | 
|---|
 | 307 |  * @returns true if the list is empty | 
|---|
| [5229] | 308 |  */ | 
|---|
| [2822] | 309 | template<class T> | 
|---|
| [5229] | 310 |     inline bool tList<T>::isEmpty() const | 
|---|
| [2822] | 311 | { | 
|---|
| [5229] | 312 |   return (this->size == 0)?true:false; | 
|---|
| [2822] | 313 | } | 
|---|
 | 314 |  | 
|---|
| [5229] | 315 |  | 
|---|
| [4508] | 316 | /** | 
|---|
| [5229] | 317 |  *  checks if an entity is in the List. | 
|---|
| [4836] | 318 |  * @param entity The entity to check for in the entire List. | 
|---|
 | 319 |  * @returns true if it is, false otherwise | 
|---|
| [5229] | 320 |  */ | 
|---|
| [4508] | 321 | template<class T> | 
|---|
| [5229] | 322 |     inline bool tList<T>::inList(T* entity) const | 
|---|
| [4574] | 323 | { | 
|---|
| [4508] | 324 |   // pre checks | 
|---|
| [5229] | 325 |   if( unlikely(entity == NULL)) return false; | 
|---|
| [2822] | 326 |  | 
|---|
| [4508] | 327 |   // search in the List | 
|---|
| [5229] | 328 |   listElement<T>* el = this->first; | 
|---|
 | 329 |   while( this->currentEl != NULL) | 
|---|
 | 330 |   { | 
|---|
 | 331 |     if( this->currentEl->curr == entity) | 
|---|
 | 332 |       return true; | 
|---|
| [4508] | 333 |  | 
|---|
| [5229] | 334 |     el = this->currentEl->next; | 
|---|
 | 335 |   } | 
|---|
| [4508] | 336 | } | 
|---|
 | 337 |  | 
|---|
| [5229] | 338 |  | 
|---|
| [4497] | 339 | /** | 
|---|
| [4836] | 340 |  *  this returns the number of elements in the list | 
|---|
 | 341 |  * @returns number of elements | 
|---|
| [5229] | 342 |  */ | 
|---|
| [2822] | 343 | template<class T> | 
|---|
| [5229] | 344 |     inline unsigned int tList<T>::getSize() const | 
|---|
| [2822] | 345 | { | 
|---|
 | 346 |   return this->size; | 
|---|
 | 347 | } | 
|---|
 | 348 |  | 
|---|
 | 349 |  | 
|---|
| [4497] | 350 | /** | 
|---|
| [4836] | 351 |  *  creates an itereator object and returns it | 
|---|
 | 352 |  * @returns the iterator object to this list | 
|---|
| [4497] | 353 |  | 
|---|
 | 354 |    You will use this, if you want to iterate through the list | 
|---|
| [5229] | 355 |  */ | 
|---|
| [2822] | 356 | template<class T> | 
|---|
| [5229] | 357 |     inline tIterator<T>* tList<T>::getIterator() const | 
|---|
| [3652] | 358 | { | 
|---|
| [5115] | 359 |   return new tIterator<T>(this); | 
|---|
| [3652] | 360 | } | 
|---|
 | 361 |  | 
|---|
 | 362 |  | 
|---|
| [2822] | 363 |  | 
|---|
| [3585] | 364 | /** | 
|---|
| [4836] | 365 |  *  this returns the next element after toEntity or the first if toEntity is last | 
|---|
 | 366 |  * @param toEntity: the entity after which is an entity, that has to be returned, sorry, terrible phrase | 
|---|
 | 367 |  * @returns the element after toEntity | 
|---|
| [5229] | 368 |  */ | 
|---|
| [2822] | 369 | template<class T> | 
|---|
| [5229] | 370 |     inline T* tList<T>::nextElement(T* toEntity) | 
|---|
| [3585] | 371 | { | 
|---|
| [3586] | 372 |   //if( this->last == this->first == NULL) return NULL; | 
|---|
 | 373 |   if(this->size == 0) return NULL; | 
|---|
| [3585] | 374 |   if( toEntity == NULL) return this->first->curr; | 
|---|
 | 375 |   if( toEntity == this->last->curr ) return this->first->curr; | 
|---|
 | 376 |   this->currentEl = this->first; | 
|---|
 | 377 |   while(this->currentEl->curr != toEntity && this->currentEl->next != NULL) | 
|---|
| [5229] | 378 |   { | 
|---|
 | 379 |     this->currentEl = this->currentEl->next; | 
|---|
 | 380 |   } | 
|---|
| [3585] | 381 |   if(this->currentEl == NULL) return NULL; | 
|---|
 | 382 |   return this->currentEl->next->curr; | 
|---|
 | 383 | } | 
|---|
 | 384 |  | 
|---|
 | 385 |  | 
|---|
| [4497] | 386 | /** | 
|---|
| [4836] | 387 |  *  creates an array out of the list (ATTENTION: not implemented) | 
|---|
 | 388 |  * @returns pointer to the array beginning | 
|---|
| [4497] | 389 |  | 
|---|
 | 390 |    ATTENTION: function is not implemented and wont do anything | 
|---|
| [5229] | 391 |  */ | 
|---|
| [3585] | 392 | template<class T> | 
|---|
| [5229] | 393 |     T* tList<T>::toArray() | 
|---|
| [4497] | 394 | { | 
|---|
 | 395 |   return NULL; | 
|---|
 | 396 | } | 
|---|
| [2822] | 397 |  | 
|---|
| [5115] | 398 |  | 
|---|
 | 399 |  | 
|---|
 | 400 |  | 
|---|
 | 401 | /** | 
|---|
| [5229] | 402 |     *  an iterator class | 
|---|
| [5115] | 403 |  | 
|---|
 | 404 |    this enables the user to iterate through a list very easely | 
|---|
 | 405 |  */ | 
|---|
 | 406 | template<class T> class tIterator | 
|---|
 | 407 | { | 
|---|
| [5403] | 408 |   friend class tList<T>; | 
|---|
| [5115] | 409 |   public: | 
|---|
 | 410 |     tIterator(const tList<T>* list); | 
|---|
 | 411 |     ~tIterator(); | 
|---|
 | 412 |  | 
|---|
 | 413 |     T* firstElement(); | 
|---|
| [5118] | 414 |     T* lastElement(); | 
|---|
| [5115] | 415 |     T* nextElement(); | 
|---|
| [5118] | 416 |     T* prevElement(); | 
|---|
| [5229] | 417 |     T* seekElement(const T* element); | 
|---|
| [5115] | 418 |     T* iteratorElement(const tIterator<T>* iterator); | 
|---|
| [5403] | 419 |     bool compareListPointer(const tList<T>* list) const; | 
|---|
 | 420 |     inline const tList<T>* getList() const { return this->list; }; | 
|---|
| [5243] | 421 |     /** another way to iterate through the list | 
|---|
 | 422 |      * !! THIS IS NOT MEANT FOR DELETION | 
|---|
 | 423 |      */ | 
|---|
 | 424 |     T* prevStep(); | 
|---|
 | 425 |     T* nextStep(); | 
|---|
 | 426 |     T* getCurrent(); | 
|---|
 | 427 |  | 
|---|
| [5115] | 428 |   private: | 
|---|
 | 429 |     listElement<T>*    currentEl;                      //!< pointer to the current list element in the iterator | 
|---|
 | 430 |     listElement<T>*    tmpEl;                          //!< temp listElemnt pointer | 
|---|
 | 431 |     const tList<T>*    list;                           //!< The List, that we want to iterate through | 
|---|
 | 432 | }; | 
|---|
 | 433 |  | 
|---|
 | 434 |  | 
|---|
 | 435 | /** | 
|---|
 | 436 |  *  iterator constructor | 
|---|
 | 437 |  * @param startElement:  the first list element from the tList | 
|---|
 | 438 |  * | 
|---|
 | 439 |  * normaly you will use it like this: | 
|---|
 | 440 |  ********************************************************** | 
|---|
 | 441 |  * tIterator<char>* nameIterator = nameList->getIterator(); | 
|---|
 | 442 |  * char name* = nameIterator->firstElement(); | 
|---|
 | 443 |  * while( name != NULL) | 
|---|
 | 444 |  *  { | 
|---|
 | 445 |  *   PRINTF(3)("found name: %s in list\n", name); | 
|---|
 | 446 |  *   name = nameIterator->nextElement(); | 
|---|
 | 447 |  *  } | 
|---|
 | 448 |  * delete nameIterator; | 
|---|
 | 449 |  * ******************************************************** | 
|---|
 | 450 |  */ | 
|---|
 | 451 | template<class T> | 
|---|
 | 452 |   inline tIterator<T>::tIterator (const tList<T>* list) | 
|---|
 | 453 | { | 
|---|
| [5209] | 454 |   this->currentEl = NULL; | 
|---|
| [5115] | 455 |   this->tmpEl = NULL; | 
|---|
 | 456 |   this->list = list; | 
|---|
 | 457 | } | 
|---|
 | 458 |  | 
|---|
 | 459 |  | 
|---|
 | 460 | /** | 
|---|
 | 461 |  *  the destructor | 
|---|
 | 462 |  */ | 
|---|
 | 463 | template<class T> | 
|---|
 | 464 |     inline tIterator<T>::~tIterator () | 
|---|
| [5230] | 465 | { | 
|---|
 | 466 |   this->currentEl = NULL; | 
|---|
 | 467 |   this->tmpEl = NULL; | 
|---|
 | 468 |   this->list = NULL; | 
|---|
 | 469 | } | 
|---|
| [5115] | 470 |  | 
|---|
| [5229] | 471 | /** | 
|---|
 | 472 |  * this returns the first element of the iterator list | 
|---|
 | 473 |  * @returns first element | 
|---|
 | 474 |  */ | 
|---|
| [5115] | 475 | template<class T> | 
|---|
 | 476 |     inline T* tIterator<T>::firstElement () | 
|---|
 | 477 | { | 
|---|
| [5131] | 478 |   this->tmpEl = this->list->first; | 
|---|
| [5229] | 479 |   if( likely(this->tmpEl != NULL)) | 
|---|
| [5131] | 480 |   { | 
|---|
 | 481 |     this->currentEl = this->tmpEl->next; | 
|---|
 | 482 |     return this->tmpEl->curr; | 
|---|
 | 483 |   } | 
|---|
| [5118] | 484 |   else | 
|---|
| [5115] | 485 |     return NULL; | 
|---|
| [5118] | 486 | } | 
|---|
 | 487 |  | 
|---|
| [5229] | 488 | /** | 
|---|
 | 489 |  * this returns the last element of the iterator list | 
|---|
 | 490 |  * @returns last element | 
|---|
 | 491 |  */ | 
|---|
| [5118] | 492 | template<class T> | 
|---|
 | 493 |     inline T* tIterator<T>::lastElement () | 
|---|
 | 494 | { | 
|---|
| [5131] | 495 |   this->tmpEl = this->list->last; | 
|---|
| [5229] | 496 |   if( likely(this->tmpEl != NULL)) | 
|---|
| [5131] | 497 |   { | 
|---|
 | 498 |     this->currentEl = tmpEl->prev; | 
|---|
 | 499 |     return this->tmpEl->curr; | 
|---|
 | 500 |   } | 
|---|
| [5115] | 501 |   else | 
|---|
| [5118] | 502 |     return NULL; | 
|---|
| [5115] | 503 | } | 
|---|
 | 504 |  | 
|---|
 | 505 |  | 
|---|
 | 506 | /** | 
|---|
 | 507 |  *  use it to iterate through the list | 
|---|
 | 508 |  * @returns next list element | 
|---|
 | 509 |  */ | 
|---|
 | 510 | template<class T> | 
|---|
 | 511 |     inline T* tIterator<T>::nextElement () | 
|---|
 | 512 | { | 
|---|
| [5229] | 513 |   if( unlikely(this->currentEl == NULL)) | 
|---|
| [5115] | 514 |     return NULL; | 
|---|
 | 515 |  | 
|---|
| [5131] | 516 |   this->tmpEl = this->currentEl; | 
|---|
| [5115] | 517 |   this->currentEl = this->currentEl->next; | 
|---|
| [5131] | 518 |  | 
|---|
 | 519 |   return this->tmpEl->curr; | 
|---|
| [5115] | 520 | } | 
|---|
 | 521 |  | 
|---|
| [5229] | 522 |  | 
|---|
| [5115] | 523 | /** | 
|---|
| [5118] | 524 |  *  use it to iterate backwards through the list | 
|---|
 | 525 |  * @returns next list element | 
|---|
 | 526 |  */ | 
|---|
 | 527 | template<class T> | 
|---|
 | 528 |     inline T* tIterator<T>::prevElement () | 
|---|
 | 529 | { | 
|---|
| [5229] | 530 |   if( unlikely(this->currentEl == NULL)) | 
|---|
| [5118] | 531 |     return NULL; | 
|---|
 | 532 |  | 
|---|
| [5131] | 533 |   this->tmpEl = this->currentEl; | 
|---|
| [5118] | 534 |   this->currentEl = this->currentEl->prev; | 
|---|
| [5131] | 535 |  | 
|---|
 | 536 |   return this->tmpEl->curr; | 
|---|
| [5118] | 537 | } | 
|---|
 | 538 |  | 
|---|
 | 539 |  | 
|---|
 | 540 | /** | 
|---|
| [5115] | 541 |  *  gets the element after the selected one, sets the iterator to this point in the list | 
|---|
 | 542 |  * @param element the element to seek | 
|---|
 | 543 |  * @returns current list element | 
|---|
 | 544 |  */ | 
|---|
 | 545 | template<class T> | 
|---|
| [5229] | 546 |     inline T* tIterator<T>::seekElement (const T* element) | 
|---|
| [5115] | 547 | { | 
|---|
| [5229] | 548 |   if( unlikely(element == NULL)) | 
|---|
| [5115] | 549 |   { | 
|---|
 | 550 |     this->currentEl = NULL; | 
|---|
 | 551 |     return NULL; | 
|---|
 | 552 |   } | 
|---|
 | 553 |   this->tmpEl = this->list->first; | 
|---|
 | 554 |   while( this->tmpEl != NULL) | 
|---|
 | 555 |   { | 
|---|
 | 556 |     if( unlikely(this->tmpEl->curr == element)) | 
|---|
 | 557 |     { | 
|---|
 | 558 |       this->currentEl = this->tmpEl; | 
|---|
 | 559 |       return this->currentEl->curr; | 
|---|
 | 560 |     } | 
|---|
 | 561 |     this->tmpEl = this->tmpEl->next; | 
|---|
 | 562 |   } | 
|---|
 | 563 |   this->currentEl = NULL; | 
|---|
 | 564 |   return NULL; | 
|---|
 | 565 | } | 
|---|
 | 566 |  | 
|---|
 | 567 | /** | 
|---|
 | 568 |  * grabs the iterator entity from another iterator | 
|---|
 | 569 |  * @param iterator the iterator to grab the local currentEl from | 
|---|
| [5120] | 570 |  * @returns the grabbed element (current). NULL if not found, or not defined | 
|---|
 | 571 |  * | 
|---|
 | 572 |  * Both iterators must be from the same List! | 
|---|
| [5115] | 573 |  */ | 
|---|
 | 574 | template<class T> | 
|---|
 | 575 |     T* tIterator<T>::iteratorElement(const tIterator<T>* iterator) | 
|---|
 | 576 | { | 
|---|
| [5229] | 577 |   if( unlikely(iterator != NULL && iterator->list == this->list)) | 
|---|
| [5115] | 578 |   { | 
|---|
 | 579 |     this->currentEl = iterator->currentEl; | 
|---|
 | 580 |     if (this->currentEl != NULL) | 
|---|
 | 581 |       return this->currentEl->curr; | 
|---|
 | 582 |     else | 
|---|
 | 583 |       return NULL; | 
|---|
 | 584 |   } | 
|---|
 | 585 |   else | 
|---|
 | 586 |   { | 
|---|
 | 587 |     this->currentEl = NULL; | 
|---|
 | 588 |     return NULL; | 
|---|
 | 589 |   } | 
|---|
 | 590 | } | 
|---|
 | 591 |  | 
|---|
| [5248] | 592 | template<class T> | 
|---|
| [5403] | 593 |     bool tIterator<T>::compareListPointer(const tList<T>* list) const | 
|---|
| [5248] | 594 | { | 
|---|
 | 595 |   return (this->list == list)?true:false; | 
|---|
 | 596 | } | 
|---|
 | 597 |  | 
|---|
 | 598 |  | 
|---|
| [5243] | 599 | /** | 
|---|
 | 600 |  *  use it to move through the list without interfering with the iteration | 
|---|
| [5244] | 601 |  * @returns previous list element | 
|---|
 | 602 |  * | 
|---|
 | 603 |  * this stepping mode will !not! step beyond the boundraries of the List! | 
|---|
| [5243] | 604 |  */ | 
|---|
 | 605 | template<class T> | 
|---|
 | 606 |     inline T* tIterator<T>::nextStep () | 
|---|
 | 607 | { | 
|---|
 | 608 |   if( unlikely(this->tmpEl == NULL || this->tmpEl->next == NULL)) | 
|---|
 | 609 |     return NULL; | 
|---|
 | 610 |   else | 
|---|
 | 611 |   { | 
|---|
 | 612 |     this->tmpEl = this->tmpEl->next; | 
|---|
 | 613 |     return tmpEl->curr; | 
|---|
 | 614 |   } | 
|---|
 | 615 | } | 
|---|
 | 616 |  | 
|---|
 | 617 | /** | 
|---|
 | 618 |  *  use it to move backwards through the list without interfering with the itereation | 
|---|
 | 619 |  * @returns next list element | 
|---|
| [5244] | 620 |  * | 
|---|
 | 621 |  * this stepping mode will !not! step beyond the boundraries of the List! | 
|---|
| [5243] | 622 |  */ | 
|---|
 | 623 | template<class T> | 
|---|
 | 624 |     inline T* tIterator<T>::prevStep () | 
|---|
 | 625 | { | 
|---|
 | 626 |   if( unlikely(this->tmpEl == NULL || this->tmpEl->prev == NULL)) | 
|---|
 | 627 |     return NULL; | 
|---|
 | 628 |   else | 
|---|
 | 629 |   { | 
|---|
 | 630 |     this->tmpEl = this->tmpEl->prev; | 
|---|
 | 631 |     return tmpEl->curr; | 
|---|
 | 632 |   } | 
|---|
 | 633 | } | 
|---|
 | 634 |  | 
|---|
| [5244] | 635 | /** | 
|---|
 | 636 |  * @returns the current Element | 
|---|
 | 637 |  */ | 
|---|
| [5243] | 638 | template<class T> | 
|---|
 | 639 |     inline T* tIterator<T>::getCurrent() | 
|---|
 | 640 | { | 
|---|
| [5247] | 641 |   if (likely(this->tmpEl != NULL)) | 
|---|
| [5243] | 642 |     return this->tmpEl->curr; | 
|---|
 | 643 |   else | 
|---|
 | 644 |     return NULL; | 
|---|
 | 645 | } | 
|---|
 | 646 |  | 
|---|
| [5836] | 647 | #endif /* _T_LIST_H */ | 
|---|