]> jfr.im git - irc/gameservirc.git/blame - gameserv/list.h
Implemented refresh period... now works and added to changelog
[irc/gameservirc.git] / gameserv / list.h
CommitLineData
85ce9d3e 1#ifndef LIST_H
2#define LIST_H
3
fb37ecc7 4#include <iostream>
85ce9d3e 5#include <cassert>
6#include "listnode.h"
7#include "aClient.h"
9f8c2acc 8#include "extern.h"
fc9d2643 9#include "options.h"
9d057db5 10
fb37ecc7 11using std::cout;
12using std::endl;
fc9d2643 13using std::flush;
fb37ecc7 14
85ce9d3e 15template <class T>
16class List {
17 public:
18 List(); //constructor
19 ~List(); //deconstructor
448a1531 20 T *insertAtFront( const T & );
21 T *insertAtBack( T *&);
ae2685f6 22 ListNode<T> *insertAtBack_RLN( T *&);
85ce9d3e 23 bool removeFromFront( T & );
24 bool removeFromBack( T & );
59dc3990 25 bool del( T *);
26 ListNode < T > *remove( T * );
85ce9d3e 27 bool isEmpty() const;
c260a8d7 28 #ifdef DEBUGMODE
85ce9d3e 29 void print() const;
c260a8d7 30 #endif
5aa1d28d 31 void deleteNodes();
c260a8d7 32
1cf88153 33 ListNode < T > *Find( T * );
85ce9d3e 34 ListNode < T > *First() { return firstPtr; };
35 ListNode < T > *Last() { return lastPtr; };
36 private:
37 ListNode < T > *firstPtr;
38 ListNode < T > *lastPtr;
39
40 ListNode < T > *getNewNode ( const T & );
41};
42
43template <class T>
44List<T>::List() : firstPtr (0), lastPtr (0) {}
45
46template <class T>
5aa1d28d 47void List<T>::deleteNodes()
85ce9d3e 48{
5aa1d28d 49 if (isEmpty())
50 return;
51 ListNode<T> *it = firstPtr, *tempPtr;
52 while (it)
85ce9d3e 53 {
5aa1d28d 54 tempPtr = it;
55 it = it->Next();
56 delete tempPtr;
85ce9d3e 57 }
3c13eb61 58 firstPtr = NULL;
59 lastPtr = NULL;
85ce9d3e 60}
61
5aa1d28d 62template <class T>
63List<T>::~List()
64{
65 deleteNodes();
66}
67
85ce9d3e 68template<class T>
448a1531 69T *List<T>::insertAtFront( const T &value )
85ce9d3e 70{
71 ListNode<T> *newPtr = getNewNode ( value );
72
73
74 if (isEmpty())
75 firstPtr = lastPtr = newPtr;
76 else
77 {
78 newPtr->Next = firstPtr;
79 firstPtr->prev = newPtr;
80 firstPtr = newPtr;
81 }
448a1531 82 return firstPtr->getData();
85ce9d3e 83}
84
85template<class T>
448a1531 86T *List<T>::insertAtBack(T *&value )
85ce9d3e 87{
88 ListNode<T> *newPtr = getNewNode(*value);
89
90 if (isEmpty())
91 {
92 firstPtr = lastPtr = newPtr;
93 }
94 else
95 {
96 newPtr->prev = lastPtr;
97 lastPtr->next = newPtr;
98 lastPtr = newPtr;
99 }
448a1531 100 return lastPtr->getData();
85ce9d3e 101}
102
ae2685f6 103template<class T>
104ListNode<T> *List<T>::insertAtBack_RLN(T *&value )
105{
106 ListNode<T> *newPtr = getNewNode(*value);
107
108 if (isEmpty())
109 {
110 firstPtr = lastPtr = newPtr;
111 }
112 else
113 {
114 newPtr->prev = lastPtr;
115 lastPtr->next = newPtr;
116 lastPtr = newPtr;
117 }
118 return lastPtr;
119}
120
85ce9d3e 121
122template <class T>
123bool List<T>::removeFromFront( T &value )
124{
125 if ( isEmpty())
126 return false;
127 else
128 {
129 ListNode<T> *tempPtr = firstPtr;
130
131 if ( firstPtr == lastPtr )
132 firstPtr = lastPtr = 0;
133 else
134 firstPtr = firstPtr->next;
135
136 value = tempPtr->getData();
137 delete tempPtr;
138 return true;
139 }
140}
141
142template <class T>
143bool List<T>::removeFromBack( T &value )
144{
145 if ( isEmpty() )
146 return false;
147 else
148 {
149 ListNode<T> *tempPtr = lastPtr;
150
151 if ( firstPtr == lastPtr )
152 lastPtr = firstPtr = 0;
153 else
154 lastPtr = lastPtr->prev;
155
156 value = tempPtr->getData();
157 delete tempPtr;
158 return true;
159
160 }
161}
162
163template <class T>
164bool List<T>::isEmpty() const
0a1518fa 165 { return firstPtr == 0 && lastPtr == 0; }
85ce9d3e 166
167template <class T>
168ListNode<T> *List<T>::getNewNode( const T &value)
169{
170 ListNode<T> *ptr = new ListNode<T>(value);
171
172 assert( ptr != 0);
173
174 return ptr;
175}
1cf88153 176template<class T>
177ListNode<T> *List<T>::Find( T *value )
178{
179 if (isEmpty()) {return NULL;}
180
181 ListNode<T> *currentPtr;
182 currentPtr = firstPtr;
183 while (currentPtr)
184 {
ae2685f6 185 cout << currentPtr->getData() << endl << value << endl;
1cf88153 186 if (currentPtr->getData() == value)
187 return currentPtr;
188 currentPtr = currentPtr->Next();
189 }
190 return NULL;
191}
85ce9d3e 192
9f8c2acc 193#ifdef DEBUGMODE
85ce9d3e 194template <class T>
195void List<T>::print() const
196{
197 if (isEmpty())
198 {
199 cout << "Empty list" << endl;
200 return;
201 }
202
203 ListNode<T> *currentPtr;
204 currentPtr = firstPtr;
205 while (currentPtr)
206 {
87137def 207 /*
cdc9a6db 208 cout << "aClient: " << *currentPtr->getData() << flush;
85ce9d3e 209
210 if (currentPtr->getData()->stats)
cdc9a6db 211 cout << " Player Name: " << currentPtr->getData()->stats->name
212 << " Password: " << currentPtr->getData()->stats->password << flush;
85ce9d3e 213 cout << endl;
87137def 214 */
215 cout << currentPtr->getData()->getString() << endl;
85ce9d3e 216 currentPtr = currentPtr->next;
217 }
85ce9d3e 218}
9f8c2acc 219#endif
85ce9d3e 220
221template <class T>
59dc3990 222bool List<T>::del(T *remPtr)
223{
224 ListNode<T> *removed = remove( remPtr );
225 if (removed != NULL)
226 {
227 delete removed;
228 return true;
229 }
230 return false;
231}
232
233template <class T>
234ListNode<T> *List<T>::remove(T *remPtr)
85ce9d3e 235{
236 ListNode<T> *newPtr = firstPtr;
237 T *testPtr;
238
0a1518fa 239 if (isEmpty())
240 return false;
241
85ce9d3e 242 while (newPtr)
243 {
244 testPtr = newPtr->getData();
245 if (testPtr == remPtr)
246 {
247 if (firstPtr == lastPtr)
248 {
9f8c2acc 249 #ifdef DEBUGMODE
250 log("One Element. Deleting it");
251 #endif
0a1518fa 252 firstPtr = lastPtr = NULL;
59dc3990 253 return newPtr;
85ce9d3e 254 }
255 else if (newPtr != lastPtr && newPtr != firstPtr)
256 {
9f8c2acc 257 #ifdef DEBUGMODE
258 log("Many elements, this one is in the middle. Deleting it, linking front to back, and back to front.");
259 #endif
85ce9d3e 260 newPtr->prev->next = newPtr->next;
261 newPtr->next->prev = newPtr->prev;
59dc3990 262 return newPtr;
85ce9d3e 263 }
264 else if (newPtr == lastPtr)
265 {
9f8c2acc 266 #ifdef DEBUGMODE
267 log("This was the last element. Deleting it, and pointing the tail to its previous element.");
268 #endif
85ce9d3e 269 lastPtr = newPtr->prev;
270 lastPtr->next = 0;
59dc3990 271 return newPtr;
85ce9d3e 272 }
273 else if (newPtr == firstPtr)
274 {
9f8c2acc 275 #ifdef DEBUGMODE
276 log("This was the first element. Deleting it, and pointing the head to its next element.");
277 #endif
85ce9d3e 278 firstPtr = newPtr->next;
279 firstPtr->prev = 0;
59dc3990 280 return newPtr;
85ce9d3e 281 }
282 }
283 newPtr = newPtr->next;
284 }
59dc3990 285 return NULL;
85ce9d3e 286}
287#endif