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 (int 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 */