Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/branches/shadows/src/list.h @ 3714

Last change on this file since 3714 was 3365, checked in by bensch, 20 years ago

orxonox/trunk: merged branches/parenting back to the.
merged with command:
svn merge branches/parenting trunk -r 3247:HEAD
resolved all conflicts in favor of parenting.

File size: 3.3 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(this->size == 0) this->first = el;
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;
137          delete this->currentEl;
138          this->currentEl = te;
139          return;
140        }
141      this->currentEl = this->currentEl->next;
142    }
143}
144
145
146template<class T>
147void tList<T>::destroy()
148{
149  this->currentEl = this->first;
150  while(this->currentEl != NULL)
151    {
152      listElement* le = this->currentEl->next;
153      delete this->currentEl->curr;
154      delete this->currentEl;
155      this->currentEl = le;
156    }
157  this->first = NULL;
158  this->last = NULL;
159  this->size = 0;
160}
161
162
163template<class T>
164T* tList<T>::firstElement()
165{
166  return this->first->curr;
167}
168
169
170template<class T>
171bool tList<T>::isEmpty()
172{
173  return (this->size==0)?true:false;
174}
175
176
177template<class T>
178int tList<T>::getSize()
179{
180  return this->size;
181}
182
183
184template<class T>
185T* tList<T>::enumerate()
186{
187  if(this->size == 0) return NULL;
188  this->currentEl = this->first;
189  return this->currentEl->curr;
190}
191
192
193template<class T>
194T* tList<T>::nextElement()
195{
196  if(this->size == 0) return NULL;
197  this->currentEl = this->currentEl->next;
198  if(this->currentEl == NULL) return NULL;
199  return this->currentEl->curr;
200}
201
202
203template<class T>
204T* tList<T>::toArray()
205{}
206
207#endif /* _LIST_H */
Note: See TracBrowser for help on using the repository browser.