Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Changeset 5110 in orxonox.OLD for trunk/src/lib/util/list.h


Ignore:
Timestamp:
Aug 23, 2005, 11:07:40 PM (19 years ago)
Author:
bensch
Message:

orxonox/trunk: changed the behaviour of the iterator.
Now it is soon possible to walk through a List from front and back, and tell the Iterator from where to seek

@patrick: i had to disable your Collision-Detection algorithms, because they had a seekElement inside, that i did not entirely grasp the meaning of….
trying to fix this now

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/lib/util/list.h

    r5103 r5110  
    1212#endif
    1313
    14 
     14template<class T> class tIterator;
    1515
    1616//! a list element of the tList,
     
    2323
    2424/**
    25  *  an iterator class
    26 
    27    this enables the user to iterate through a list very easely
    28 */
    29 template<class T> class tIterator
    30 {
    31  public:
    32   tIterator(listElement<T>* startElement);
    33   ~tIterator();
    34 
    35   T* nextElement();
    36   T* seekElement(T* element);
    37 
    38  private:
    39   listElement<T>*    currentEl;                      //!< pointer to the current list element in the iterator
    40   listElement<T>*    tmpEl;                          //!< temp listElemnt pointer
    41   listElement<T>*    startElement;                   //!< pointer to the start of the list
    42 };
    43 
    44 
    45 /**
    46  *  iterator constructor
    47  * @param startElement:  the first list element from the tList
    48 
    49    normaly you will use it like this:
    50 
    51    tIterator<char>* nameIterator = nameList->getIterator();
    52    char name* = nameIterator->nextElement();
    53    while( name != NULL)
    54    {
    55      PRINTF(3)("found name: %s in list\n", name);
    56      name = nameIterator->nextElement();
    57    }
    58    delete nameIterator;
    59 */
    60 template<class T>
    61 inline tIterator<T>::tIterator (listElement<T>* startElement)
    62 {
    63   this->currentEl = startElement;
    64   this->tmpEl = NULL;
    65   this->startElement = startElement;
    66 }
    67 
    68 
    69 /**
    70  *  the destructor
    71 */
    72 template<class T>
    73 inline tIterator<T>::~tIterator ()
    74 {
    75   this->currentEl = NULL;
    76 }
    77 
    78 
    79 /**
    80  *  use it to iterate through the list
    81  * @returns next list element
    82 */
    83 template<class T>
    84 inline T* tIterator<T>::nextElement ()
    85 {
    86   if( this->currentEl == NULL)
    87     return NULL;
    88 
    89   this->tmpEl = this->currentEl;
    90   this->currentEl = this->currentEl->next;
    91   return this->tmpEl->curr;
    92 }
    93 
    94 /**
    95  *  gets the element after the selected one, sets the iterator to this point in the list
    96  * @param element the element to seek
    97  * @returns next list element
    98 
    99   Attention: if you seek an element, the iterator pointer will point to the NEXT listelement after the argument!
    100  */
    101 template<class T>
    102 inline T* tIterator<T>::seekElement (T* element)
    103 {
    104   for(this->tmpEl = this->startElement; this->tmpEl != NULL; this->tmpEl = this->tmpEl->next)
    105   {
    106     if( unlikely(this->tmpEl->curr == element))
    107     {
    108       if( this->tmpEl->next != NULL)
    109       {
    110         this->currentEl = this->tmpEl->next->next;
    111         return this->tmpEl->next->curr;
    112       }
    113       return NULL;
    114     }
    115   }
    116   return NULL;
    117 }
    118 
    119 
    120 
    121 /**
    12225 *  the list template class
    12326
     
    12629template<class T> class tList
    12730{
     31  friend class tIterator<T>;
     32
    12833 public:
    12934  tList ();
     
    374279inline tIterator<T>* tList<T>::getIterator() const
    375280{
    376   tIterator<T>* iterator = new tIterator<T>(this->first);
    377   return iterator;
     281  return new tIterator<T>(this);
    378282}
    379283
     
    414318}
    415319
     320
     321
     322
     323/**
     324 *  an iterator class
     325
     326   this enables the user to iterate through a list very easely
     327 */
     328template<class T> class tIterator
     329{
     330  public:
     331    tIterator(const tList<T>* list);
     332    ~tIterator();
     333
     334    T* firstElement();
     335    T* nextElement();
     336    T* seekElement(T* element);
     337
     338  private:
     339    listElement<T>*    currentEl;                      //!< pointer to the current list element in the iterator
     340    listElement<T>*    tmpEl;                          //!< temp listElemnt pointer
     341    const tList<T>*    list;                           //!< The List, that we want to iterate through
     342};
     343
     344
     345/**
     346 *  iterator constructor
     347 * @param startElement:  the first list element from the tList
     348
     349   normaly you will use it like this:
     350
     351   tIterator<char>* nameIterator = nameList->getIterator();
     352                char name* = nameIterator->nextElement();
     353                while( name != NULL)
     354{
     355                PRINTF(3)("found name: %s in list\n", name);
     356                name = nameIterator->nextElement();
     357}
     358                delete nameIterator;
     359 */
     360                template<class T>
     361                inline tIterator<T>::tIterator (const tList<T>* list)
     362{
     363  this->currentEl = list->first;
     364  this->tmpEl = NULL;
     365  this->list = list;
     366}
     367
     368
     369/**
     370 *  the destructor
     371 */
     372template<class T>
     373    inline tIterator<T>::~tIterator ()
     374{
     375  this->currentEl = NULL;
     376}
     377
     378template<class T>
     379    inline T* tIterator<T>::firstElement ()
     380{
     381  this->currentEl = this->list->first;
     382  if (this->currentEl == NULL)
     383    return NULL;
     384  else
     385    return this->currentEl->curr;
     386}
     387
     388
     389/**
     390 *  use it to iterate through the list
     391 * @returns next list element
     392 */
     393template<class T>
     394    inline T* tIterator<T>::nextElement ()
     395{
     396  if( this->currentEl == NULL || this->currentEl->next == NULL)
     397  {
     398    this->currentEl = NULL;
     399    return NULL;
     400  }
     401
     402  this->currentEl = this->currentEl->next;
     403  return this->currentEl->curr;
     404}
     405
     406/**
     407 *  gets the element after the selected one, sets the iterator to this point in the list
     408 * @param element the element to seek
     409 * @returns next list element
     410
     411  Attention: if you seek an element, the iterator pointer will point to the NEXT listelement after the argument!
     412 */
     413template<class T>
     414    inline T* tIterator<T>::seekElement (T* element)
     415{
     416  for(this->tmpEl = this->list->first; this->tmpEl != NULL; this->tmpEl = this->tmpEl->next)
     417  {
     418    if( unlikely(this->tmpEl->curr == element))
     419    {
     420      if( this->tmpEl->next != NULL)
     421      {
     422        this->currentEl = this->tmpEl;
     423        return this->tmpEl->next->curr;
     424      }
     425      return NULL;
     426    }
     427  }
     428  return NULL;
     429}
     430
    416431#endif /* _LIST_H */
Note: See TracChangeset for help on using the changeset viewer.