]> jfr.im git - irc/gameservirc.git/blame - gameserv/list.h
Initial revision
[irc/gameservirc.git] / gameserv / list.h
CommitLineData
85ce9d3e 1#ifndef LIST_H
2#define LIST_H
3
4#include <iostream.h>
5#include <cassert>
6#include "listnode.h"
7#include "aClient.h"
8
9template <class T>
10class List {
11 public:
12 List(); //constructor
13 ~List(); //deconstructor
14 void insertAtFront( const T & );
15 void insertAtBack( T *&);
16 bool removeFromFront( T & );
17 bool removeFromBack( T & );
18 bool remove( T * );
19 bool isEmpty() const;
20 void print() const;
21 ListNode < T > *First() { return firstPtr; };
22 ListNode < T > *Last() { return lastPtr; };
23 private:
24 ListNode < T > *firstPtr;
25 ListNode < T > *lastPtr;
26
27 ListNode < T > *getNewNode ( const T & );
28};
29
30template <class T>
31List<T>::List() : firstPtr (0), lastPtr (0) {}
32
33template <class T>
34List<T>::~List()
35{
36 if (!isEmpty())
37 {
38 cout << "Destroying Nodes" << endl;
39
40 ListNode<T> *currentPtr = firstPtr, *tempPtr;
41
42 while (currentPtr != 0)
43 {
44 tempPtr = currentPtr;
45 currentPtr = currentPtr->next;
46// if (!tempPtr->getData()->stats || tempPtr->getData()->stats->started == 0)
47 delete tempPtr;
48// else
49// tempPtr->getData()->stats->started = 0;
50 }
51 cout << "All Nodes destroyed" << endl;
52 }
53}
54
55template<class T>
56void List<T>::insertAtFront( const T &value )
57{
58 ListNode<T> *newPtr = getNewNode ( value );
59
60
61 if (isEmpty())
62 firstPtr = lastPtr = newPtr;
63 else
64 {
65 newPtr->Next = firstPtr;
66 firstPtr->prev = newPtr;
67 firstPtr = newPtr;
68 }
69}
70
71template<class T>
72void List<T>::insertAtBack(T *&value )
73{
74 ListNode<T> *newPtr = getNewNode(*value);
75
76 if (isEmpty())
77 {
78 firstPtr = lastPtr = newPtr;
79 }
80 else
81 {
82 newPtr->prev = lastPtr;
83 lastPtr->next = newPtr;
84 lastPtr = newPtr;
85 }
86}
87
88
89template <class T>
90bool List<T>::removeFromFront( T &value )
91{
92 if ( isEmpty())
93 return false;
94 else
95 {
96 ListNode<T> *tempPtr = firstPtr;
97
98 if ( firstPtr == lastPtr )
99 firstPtr = lastPtr = 0;
100 else
101 firstPtr = firstPtr->next;
102
103 value = tempPtr->getData();
104 delete tempPtr;
105 return true;
106 }
107}
108
109template <class T>
110bool List<T>::removeFromBack( T &value )
111{
112 if ( isEmpty() )
113 return false;
114 else
115 {
116 ListNode<T> *tempPtr = lastPtr;
117
118 if ( firstPtr == lastPtr )
119 lastPtr = firstPtr = 0;
120 else
121 lastPtr = lastPtr->prev;
122
123 value = tempPtr->getData();
124 delete tempPtr;
125 return true;
126
127 }
128}
129
130template <class T>
131bool List<T>::isEmpty() const
132 { return firstPtr == 0; }
133
134template <class T>
135ListNode<T> *List<T>::getNewNode( const T &value)
136{
137 ListNode<T> *ptr = new ListNode<T>(value);
138
139 assert( ptr != 0);
140
141 return ptr;
142}
143
144template <class T>
145void List<T>::print() const
146{
147 if (isEmpty())
148 {
149 cout << "Empty list" << endl;
150 return;
151 }
152
153 ListNode<T> *currentPtr;
154 currentPtr = firstPtr;
155 while (currentPtr)
156 {
157 cout << "aClient: " << *currentPtr->getData();
158
159 if (currentPtr->getData()->stats)
160 cout << " Player Name:" << currentPtr->getData()->stats->name;
161 cout << endl;
162 currentPtr = currentPtr->next;
163 }
164
165 cout << endl;
166}
167
168template <class T>
169bool List<T>::remove(T *remPtr)
170{
171 ListNode<T> *newPtr = firstPtr;
172 T *testPtr;
173
174 while (newPtr)
175 {
176 testPtr = newPtr->getData();
177 if (testPtr == remPtr)
178 {
179 if (firstPtr == lastPtr)
180 {
181 firstPtr = lastPtr = 0;
182 delete newPtr;
183 return true;
184 }
185 else if (newPtr != lastPtr && newPtr != firstPtr)
186 {
187 newPtr->prev->next = newPtr->next;
188 newPtr->next->prev = newPtr->prev;
189 delete newPtr;
190 return true;
191 }
192 else if (newPtr == lastPtr)
193 {
194 lastPtr = newPtr->prev;
195 lastPtr->next = 0;
196 delete newPtr;
197 return true;
198 }
199 else if (newPtr == firstPtr)
200 {
201 firstPtr = newPtr->next;
202 firstPtr->prev = 0;
203 delete newPtr;
204 return true;
205 }
206 }
207 newPtr = newPtr->next;
208 }
209 return false;
210}
211#endif