2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS HTTP Daemon
15 CListNode(VOID *element, CListNode *next, CListNode *prev);
17 void* operator new(/*size_t s*/ UINT s);
18 VOID operator delete(void* p);
20 VOID SetElement(PVOID element);
21 VOID SetNext(CListNode *next);
22 VOID SetPrev(CListNode *prev);
34 template <class Item> class CList {
39 CList& operator=(CList&);
41 CIterator<Item> *CreateIterator() const;
43 Item& Get(const LONG index) const;
44 // Can throw bad_alloc
45 VOID Insert(Item& element);
46 VOID Remove(Item& element);
48 CListNode *GetHeader() const;
49 CListNode *GetTrailer() const;
51 CListNode *Search(Item& element) const;
57 template <class Item> class CListIterator : public CIterator<Item> {
59 CListIterator(const CList<Item> *list);
62 virtual BOOL IsDone() const;
63 virtual Item CurrentItem() const;
65 const CList<Item> *List;
69 // ****************************** CList ******************************
71 // Default constructor
76 Trailer = new CListNode;
77 Header = new CListNode;
78 Header->SetNext(Trailer);
79 Trailer->SetPrev(Header);
91 // Create an iterator for the list
93 CIterator<Item> *CList<Item>::CreateIterator() const
95 return new CListIterator<Item>((CList<Item> *) this);
98 // Return number of elements in list
100 LONG CList<Item>::Count() const
105 // Return element at index
106 template <class Item>
107 Item& CList<Item>::Get(const LONG index) const
111 if ((index < 0) || (index >= NodeCount))
115 for (i = 0; i <= index; i++)
116 node = node->GetNext();
118 return (Item *) node->GetElement();
121 // Insert an element into the list
122 template <class Item>
123 VOID CList<Item>::Insert(Item& element)
127 node = new CListNode((PVOID)element, Trailer, Trailer->GetPrev());
128 Trailer->GetPrev()->SetNext(node);
129 Trailer->SetPrev(node);
133 // Remove an element from the list
134 template <class Item>
135 VOID CList<Item>::Remove(Item& element)
139 node = Search(element);
141 node->GetPrev()->SetNext(node->GetNext());
142 node->GetNext()->SetPrev(node->GetPrev());
148 // Remove all elements in list
149 template <class Item>
150 VOID CList<Item>::RemoveAll()
155 node = Header->GetNext();
156 while (node != Trailer) {
157 tmp = node->GetNext();
161 Header->SetNext(Trailer);
162 Trailer->SetPrev(Header);
166 // Return header node
167 template <class Item>
168 CListNode *CList<Item>::GetHeader() const
173 // Return trailer node
174 template <class Item>
175 CListNode *CList<Item>::GetTrailer() const
180 // Searches for a node that contains the element. Returns NULL if element is not found
181 template <class Item>
182 CListNode *CList<Item>::Search(Item& element) const
187 while (((node = node->GetNext()) != Trailer) && (node->GetElement() != element));
195 // ************************** CListIterator **************************
197 // Default constructor
198 template <class Item>
199 CListIterator<Item>::CListIterator(const CList<Item> *list) : List(list)
204 // Go to first element in list
205 template <class Item>
206 VOID CListIterator<Item>::First()
208 Current = List->GetHeader()->GetNext();
211 // Go to next element in list
212 template <class Item>
213 VOID CListIterator<Item>::Next()
216 Current = Current->GetNext();
219 // Return FALSE when there are more elements in list and TRUE when there are no more
220 template <class Item>
221 BOOL CListIterator<Item>::IsDone() const
223 return (Current == List->GetTrailer());
226 // Return current element
227 template <class Item>
228 Item CListIterator<Item>::CurrentItem() const
230 return IsDone()? NULL : (Item) Current->GetElement();
233 #endif /* __LIST_H */