Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/orxonox/trunk/src/list.h @ 3021

Last change on this file since 3021 was 2822, checked in by patrick, 20 years ago

orxonox/trunk/src: changed list to template again, will add an iterator soon. fixed a graphics bug, that was realy painful to track.

File size: 3.5 KB
RevLine 
[2636]1
[2036]2#ifndef LIST_H
3#define LIST_H
4
[2816]5#include "stdincl.h"
[2036]6
[2077]7//! An enum to list all the modes available when adding an object to a List
[2816]8//enum ADDMODE {LIST_ADD_FIRST, LIST_ADD_LAST};
[2077]9//! An enum to list the two searching directions available when removing an object from a List
[2816]10//enum FINDMODE {LIST_FIND_BW, LIST_FIND_FW};
[2036]11
12
[2077]13
[2816]14class WorldEntity;
[2036]15
[2816]16class List {
[2036]17
[2816]18 public:
19  List ();
20  ~List ();
[2036]21
[2816]22  void add(WorldEntity* entity);
23  void remove(WorldEntity* entity);
24  void clear();
25  WorldEntity* firstElement();
26  bool isEmpty();
27  int getSize();
28  WorldEntity* enumerate();
29  WorldEntity* nextElement();
30  WorldEntity* toArray();
31  void debug();
[2077]32
[2816]33 private:
34  struct listElement
[2077]35  {
[2816]36    listElement* prev;
37    WorldEntity* curr;
38    listElement* next;
39  };
40  Uint32 size;
41  listElement* first;
42  listElement* last;
43  listElement* currentEl;
[2077]44
45
[2816]46};
[2077]47
[2816]48class Iterator
[2077]49{
50
[2816]51 public:
52  bool hasNext();
53  WorldEntity* next();
[2077]54
[2816]55 private:
[2077]56
[2816]57};
58
[2822]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(WorldEntity* entity);
81  void remove(WorldEntity* entity);
82  void clear();
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(WorldEntity* entity)
107{
108  printf("tList<T>::add() \n");
109  listElement* el = new listElement;
110  el->prev = this->last;
111  el->curr = entity;
112  el->next = NULL;
113
114  this->last = el;
115
116  if(this->size == 0) this->first = el;
117  else el->prev->next = el;
118  this->size++;
119}
120
121
122template<class T>
123void tList<T>::remove(WorldEntity* entity)
124{
125  this->currentEl = this->first;
126  listElement* te;
127  while( this->currentEl != NULL)
128    {
129      if( this->currentEl->curr == entity)
130        {
131          printf("tList<T>::remove() - object found\n");
132         
133          if( this->currentEl->prev  == NULL ) this->first = this->currentEl->next;
134          else this->currentEl->prev->next = this->currentEl->next;
135
136          if( this->currentEl->next == NULL) this->last = this->currentEl->prev;
137          else this->currentEl->next->prev = this->currentEl->prev;
138
139          te = this->currentEl->next;
140          delete this->currentEl;
141          this->currentEl = te;
142          return;
143        }
144      this->currentEl = this->currentEl->next;
145    }
146}
147
148
149template<class T>
150void tList<T>::clear()
151{
152  printf("tList<T>::clear() - clearing all world objects, releasing mem\n");
153  this->currentEl = this->first;
154  while(this->currentEl != NULL)
155    {
156      listElement* le = this->currentEl->next;
157      delete this->currentEl->curr;
158      delete this->currentEl;
159      this->currentEl = le;
160    }
161  this->first = NULL;
162  this->last = NULL;
163  this->size = 0;
164}
165
166
167template<class T>
168T* tList<T>::firstElement()
169{
170  return this->first->curr;
171}
172
173
174template<class T>
175bool tList<T>::isEmpty()
176{
177  return (this->size==0)?true:false;
178}
179
180
181template<class T>
182int tList<T>::getSize()
183{
184  return this->size;
185}
186
187
188template<class T>
189T* tList<T>::enumerate()
190{
191  if(this->size == 0) return NULL;
192  this->currentEl = this->first;
193  return this->currentEl->curr;
194}
195
196
197template<class T>
198T* tList<T>::nextElement()
199{
200  if(this->size == 0) return NULL;
201  this->currentEl = this->currentEl->next;
202  if(this->currentEl == NULL) return NULL;
203  return this->currentEl->curr;
204}
205
206
207template<class T>
208T* tList<T>::toArray()
209{}
210
[2036]211#endif
Note: See TracBrowser for help on using the repository browser.