Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/lib/util/list.h @ 3541

Last change on this file since 3541 was 3534, checked in by patrick, 20 years ago

orxonox/trunk: fixed another bug in list-template and added patch from bensch to the pnode to enable the different rotation modes

File size: 3.4 KB
Line 
1
2#ifndef _LIST_H
3#define _LIST_H
4
5#include "stdincl.h"
6
7//! An enum to list all the modes available when adding an object to a List
8//enum ADDMODE {LIST_ADD_FIRST, LIST_ADD_LAST};
9//! An enum to list the two searching directions available when removing an object from a List
10//enum FINDMODE {LIST_FIND_BW, LIST_FIND_FW};
11
12
13
14class WorldEntity;
15
16class List {
17
18 public:
19  List ();
20  ~List ();
21
22  void add(WorldEntity* entity);
23  void remove(WorldEntity* entity);
24  void destroy();
25  WorldEntity* firstElement();
26  bool isEmpty();
27  int getSize();
28  WorldEntity* enumerate();
29  WorldEntity* nextElement();
30  WorldEntity* toArray();
31  void debug();
32
33 private:
34  struct listElement
35  {
36    listElement* prev;
37    WorldEntity* curr;
38    listElement* next;
39  };
40  Uint32 size;
41  listElement* first;
42  listElement* last;
43  listElement* currentEl;
44
45
46};
47
48class Iterator
49{
50
51 public:
52  bool hasNext();
53  WorldEntity* next();
54
55 private:
56
57};
58
59
60template<class T> class tList
61{
62 private:
63  struct listElement
64  {
65    listElement* prev;
66    T* curr;
67    listElement* next;
68  };
69
70  Uint32 size;
71  listElement* first;
72  listElement* last;
73  listElement* currentEl;
74 
75 public:
76  tList ();
77  ~tList ();
78 
79
80  void add(T* entity);
81  void remove(T* entity);
82  void destroy();
83  T* firstElement();
84  bool isEmpty();
85  int getSize();
86  T* enumerate();
87  T* nextElement();
88  T* toArray();
89  void debug();
90};
91
92
93template<class T>
94tList<T>::tList () 
95{
96  this->first = NULL;
97  this->last = NULL;
98  this->size = 0;
99}
100
101template<class T>
102tList<T>::~tList () 
103{}
104
105template<class T>
106void tList<T>::add(T* entity)
107{
108  listElement* el = new listElement;
109  el->prev = this->last;
110  el->curr = entity;
111  el->next = NULL;
112
113  this->last = el;
114
115  if(el->prev == NULL) this->first = el; /* if first element */
116  else el->prev->next = el;
117  this->size++;
118}
119
120
121template<class T>
122void tList<T>::remove(T* entity)
123{
124  this->currentEl = this->first;
125  listElement* te;
126  while( this->currentEl != NULL)
127    {
128      if( this->currentEl->curr == entity)
129        { 
130          if( this->currentEl->prev  == NULL ) this->first = this->currentEl->next;
131          else this->currentEl->prev->next = this->currentEl->next;
132
133          if( this->currentEl->next == NULL) this->last = this->currentEl->prev;
134          else this->currentEl->next->prev = this->currentEl->prev;
135
136          te = this->currentEl->next;  // for what am i doing this?
137          delete this->currentEl;
138          this->currentEl = te;
139          this->size--;
140          return;
141        }
142      this->currentEl = this->currentEl->next;
143    }
144}
145
146
147template<class T>
148void tList<T>::destroy()
149{
150  this->currentEl = this->first;
151  while(this->currentEl != NULL)
152    {
153      listElement* le = this->currentEl->next;
154      delete this->currentEl->curr;
155      delete this->currentEl;
156      this->currentEl = le;
157    }
158  this->first = NULL;
159  this->last = NULL;
160  this->size = 0;
161}
162
163
164template<class T>
165T* tList<T>::firstElement()
166{
167  return this->first->curr;
168}
169
170
171template<class T>
172bool tList<T>::isEmpty()
173{
174  return (this->size==0)?true:false;
175}
176
177
178template<class T>
179int tList<T>::getSize()
180{
181  return this->size;
182}
183
184
185template<class T>
186T* tList<T>::enumerate()
187{
188  if(this->size == 0) return NULL;
189  this->currentEl = this->first;
190  return this->currentEl->curr;
191}
192
193
194template<class T>
195T* tList<T>::nextElement()
196{
197  if(this->size == 0) return NULL;
198  this->currentEl = this->currentEl->next;
199  if(this->currentEl == NULL) return NULL;
200  return this->currentEl->curr;
201}
202
203
204template<class T>
205T* tList<T>::toArray()
206{}
207
208#endif /* _LIST_H */
Note: See TracBrowser for help on using the repository browser.