]> jfr.im git - irc/gameservirc.git/blob - gameserv/list.h
Attempting to write the do_identify function with little success. I'm somewhat at...
[irc/gameservirc.git] / gameserv / list.h
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
9 template <class T>
10 class 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
30 template <class T>
31 List<T>::List() : firstPtr (0), lastPtr (0) {}
32
33 template <class T>
34 List<T>::~List()
35 {
36 if (!isEmpty())
37 {
38 cout << "Destroying Nodes" << endl;
39
40 ListNode<T> *currentPtr = firstPtr, *tempPtr;
41
42 while (currentPtr)
43 {
44 tempPtr = currentPtr;
45 currentPtr = currentPtr->Next();
46 // if (!tempPtr->getData()->stats || tempPtr->getData()->stats->started == 0)
47 cout << "Deleting Memory address: " << tempPtr->getData() << endl << flush;
48
49 delete tempPtr;
50 // else
51 // tempPtr->getData()->stats->started = 0;
52 }
53 cout << "All Nodes destroyed" << endl;
54 }
55 }
56
57 template<class T>
58 void List<T>::insertAtFront( const T &value )
59 {
60 ListNode<T> *newPtr = getNewNode ( value );
61
62
63 if (isEmpty())
64 firstPtr = lastPtr = newPtr;
65 else
66 {
67 newPtr->Next = firstPtr;
68 firstPtr->prev = newPtr;
69 firstPtr = newPtr;
70 }
71 }
72
73 template<class T>
74 void List<T>::insertAtBack(T *&value )
75 {
76 ListNode<T> *newPtr = getNewNode(*value);
77
78 if (isEmpty())
79 {
80 firstPtr = lastPtr = newPtr;
81 }
82 else
83 {
84 newPtr->prev = lastPtr;
85 lastPtr->next = newPtr;
86 lastPtr = newPtr;
87 }
88 }
89
90
91 template <class T>
92 bool List<T>::removeFromFront( T &value )
93 {
94 if ( isEmpty())
95 return false;
96 else
97 {
98 ListNode<T> *tempPtr = firstPtr;
99
100 if ( firstPtr == lastPtr )
101 firstPtr = lastPtr = 0;
102 else
103 firstPtr = firstPtr->next;
104
105 value = tempPtr->getData();
106 delete tempPtr;
107 return true;
108 }
109 }
110
111 template <class T>
112 bool List<T>::removeFromBack( T &value )
113 {
114 if ( isEmpty() )
115 return false;
116 else
117 {
118 ListNode<T> *tempPtr = lastPtr;
119
120 if ( firstPtr == lastPtr )
121 lastPtr = firstPtr = 0;
122 else
123 lastPtr = lastPtr->prev;
124
125 value = tempPtr->getData();
126 delete tempPtr;
127 return true;
128
129 }
130 }
131
132 template <class T>
133 bool List<T>::isEmpty() const
134 { return firstPtr == 0 && lastPtr == 0; }
135
136 template <class T>
137 ListNode<T> *List<T>::getNewNode( const T &value)
138 {
139 ListNode<T> *ptr = new ListNode<T>(value);
140
141 assert( ptr != 0);
142
143 return ptr;
144 }
145
146 template <class T>
147 void List<T>::print() const
148 {
149 if (isEmpty())
150 {
151 cout << "Empty list" << endl;
152 return;
153 }
154
155 ListNode<T> *currentPtr;
156 currentPtr = firstPtr;
157 while (currentPtr)
158 {
159 cout << "aClient: " << currentPtr->getData() << flush;
160
161 if (currentPtr->getData()->stats)
162 cout << " Player Name: " << &currentPtr->getData()->stats->name
163 << " Password: " << &currentPtr->getData()->stats->password << flush;
164 cout << endl;
165 currentPtr = currentPtr->next;
166 }
167
168 }
169
170 template <class T>
171 bool List<T>::remove(T *remPtr)
172 {
173 ListNode<T> *newPtr = firstPtr;
174 T *testPtr;
175
176 if (isEmpty())
177 return false;
178
179 while (newPtr)
180 {
181 testPtr = newPtr->getData();
182 if (testPtr == remPtr)
183 {
184 if (firstPtr == lastPtr)
185 {
186 cout << "One Element. Deleting it" << endl << flush;
187 firstPtr = lastPtr = NULL;
188 delete newPtr;
189 return true;
190 }
191 else if (newPtr != lastPtr && newPtr != firstPtr)
192 {
193 cout << "Many elements, this one is in the middle. Deleting it"
194 << ", linking front to back, and back to front." << endl << flush;
195 newPtr->prev->next = newPtr->next;
196 newPtr->next->prev = newPtr->prev;
197 delete newPtr;
198 return true;
199 }
200 else if (newPtr == lastPtr)
201 {
202 cout << "This was the last element. Deleting it, and pointing the tail to "
203 << "its previous element." << endl << flush;
204 lastPtr = newPtr->prev;
205 lastPtr->next = 0;
206 delete newPtr;
207 return true;
208 }
209 else if (newPtr == firstPtr)
210 {
211 cout << "This was the first element. Deleting it, and pointing the head to "
212 << "its next element." << endl << flush;
213 firstPtr = newPtr->next;
214 firstPtr->prev = 0;
215 delete newPtr;
216 return true;
217 }
218 }
219 newPtr = newPtr->next;
220 }
221 return false;
222 }
223 #endif