32#ifndef __MSWRITE_LIST_H__
33#define __MSWRITE_LIST_H__
43 template <
class dtype>
class List;
44 template <
class dtype>
class ListIterator;
45 template <
class dtype>
50 ListElement *m_prev, *m_next;
55 m_prev = m_next = NULL;
58 ListElement (dtype &data)
60 m_prev = m_next = NULL;
68 dtype &getData (
void)
const
72 dtype &operator* (
void)
const
76 bool operator== (
const ListElement &rhs)
78 return this->m_data == rhs.m_data;
81 void setData (
const dtype &data)
85 dtype &operator= (
const ListElement &rhs)
90 this->m_data = rhs.m_data;
94 friend class List <dtype>;
95 friend class ListIterator <dtype>;
98 template <
class dtype>
class List;
99 template <
class dtype>
104 ListElement <dtype> *m_upto;
106 void setPtr (ListElement <dtype> *ptr)
112 ListIterator (
const bool forward =
true)
117 ListIterator <dtype> &prev (
void)
120 m_upto = m_upto->m_prev;
122 m_upto = m_upto->m_next;
131 ListIterator <dtype> &operator-- (
void)
136 ListIterator <dtype> &operator-- (
int)
141 ListIterator <dtype> &next (
void)
144 m_upto = m_upto->m_next;
146 m_upto = m_upto->m_prev;
151 ListIterator <dtype> &operator++ (
void)
156 ListIterator <dtype> &operator++ (
int)
161 bool operator== (
const ListIterator <dtype> &rhs)
163 return this->m_upto == rhs.m_upto;
166 bool operator!= (
const ListIterator <dtype> &rhs)
168 return this->m_upto != rhs.m_upto;
171 dtype &operator* (
void)
174 return m_upto->m_data;
177 friend class List <dtype>;
180 template <
class dtype>
184 ListElement <dtype> *m_head, *m_tail;
191 m_head = m_tail = (ListElement <dtype> *) NULL;
203 ListElement <dtype> *e = m_head;
204 ListElement <dtype> *nexte;
211 m_head = m_tail = NULL;
216 bool empty (
void)
const
221 bool good (
void)
const
226 bool bad (
void)
const
231 bool addToFront (dtype &data)
233 ListElement <dtype> *e =
new ListElement <dtype> (data);
256 bool addToBack (
void)
258 ListElement <dtype> *e =
new ListElement <dtype> ();
283 bool addToBack (
const dtype &data)
287 m_tail->setData (data);
291 int getNumElements (
void)
const
296 List <dtype> &operator= (
const List <dtype> &rhs)
306 ListElement <dtype> *e = rhs.m_head;
309 if (!addToBack (e->m_data))
break;
316 typedef ListIterator <dtype> Iterator;
317 friend class ListIterator <dtype>;
319 ListIterator <dtype> begin (
const bool forward =
true)
const
321 ListIterator <dtype> ret (forward);
329 ListIterator <dtype> end (
void)
const
331 ListIterator <dtype> ret;
336 ListIterator <dtype> erase (ListIterator <dtype> &it)
339 ListElement <dtype> *eat = it.m_upto;
340 ListElement <dtype> *prevElement = it.m_upto->m_prev;
341 ListElement <dtype> *nextElement = it.m_upto->m_next;
346 prevElement->m_next = nextElement;
348 m_head = nextElement;
351 nextElement->m_prev = prevElement;
353 m_tail = prevElement;
359 ListIterator <dtype> search (
const dtype &value)
const
361 ListIterator <dtype> it;
362 for (it = begin (); it != end (); it++)