17 #ifndef INC_KY_Kernel_List_H
18 #define INC_KY_Kernel_List_H
53 void ReplaceNodeWith(T* pnew)
62 void InsertNodeAfter(T* p)
64 p->pPrev = pNext->pPrev;
70 void InsertNodeBefore(T* p)
72 p->pNext = pNext->pPrev;
78 void Alloc_MoveTo(ListNode<T>* pdest)
82 pPrev->pNext = (T*)pdest;
83 pNext->pPrev = (T*)pdest;
122 template<
class T,
class B = T>
class List
129 Root.pNext = Root.pPrev = (ValueType*)&Root;
134 Root.pNext = Root.pPrev = (ValueType*)&Root;
137 const ValueType* GetFirst()
const {
return (
const ValueType*)Root.pNext; }
138 const ValueType* GetLast ()
const {
return (
const ValueType*)Root.pPrev; }
139 ValueType* GetFirst() {
return (ValueType*)Root.pNext; }
140 ValueType* GetLast () {
return (ValueType*)Root.pPrev; }
145 bool IsEmpty()
const {
return Root.pVoidNext == (
const T*)(
const B*)&Root; }
146 bool IsFirst(
const ValueType* p)
const {
return p == Root.pNext; }
147 bool IsLast (
const ValueType* p)
const {
return p == Root.pPrev; }
148 bool IsNull (
const ValueType* p)
const {
return p == (
const T*)(
const B*)&Root; }
150 inline static const ValueType* GetPrev(
const ValueType* p) {
return (
const ValueType*)p->pPrev; }
151 inline static const ValueType* GetNext(
const ValueType* p) {
return (
const ValueType*)p->pNext; }
152 inline static ValueType* GetPrev( ValueType* p) {
return (ValueType*)p->pPrev; }
153 inline static ValueType* GetNext( ValueType* p) {
return (ValueType*)p->pNext; }
155 void PushFront(ValueType* p)
157 p->pNext = Root.pNext;
158 p->pPrev = (ValueType*)&Root;
159 Root.pNext->pPrev = p;
163 void PushBack(ValueType* p)
165 p->pPrev = Root.pPrev;
166 p->pNext = (ValueType*)&Root;
167 Root.pPrev->pNext = p;
171 static void Remove(ValueType* p)
173 p->pPrev->pNext = p->pNext;
174 p->pNext->pPrev = p->pPrev;
177 void BringToFront(ValueType* p)
183 void SendToBack(ValueType* p)
191 void PushListToFront(List<T>& src)
195 ValueType* pfirst = src.GetFirst();
196 ValueType* plast = src.GetLast();
198 plast->pNext = Root.pNext;
199 pfirst->pPrev = (ValueType*)&Root;
200 Root.pNext->pPrev = plast;
205 void PushListToBack(List<T>& src)
209 ValueType* pfirst = src.GetFirst();
210 ValueType* plast = src.GetLast();
212 plast->pNext = (ValueType*)&Root;
213 pfirst->pPrev = Root.pPrev;
214 Root.pPrev->pNext = pfirst;
221 void PushFollowingListItemsToFront(List<T>& src, ValueType *pfirst)
223 if (pfirst != &src.Root)
225 ValueType *plast = src.Root.pPrev;
228 pfirst->pPrev->pNext = (ValueType*)&src.Root;
229 src.Root.pPrev = pfirst->pPrev;
231 plast->pNext = Root.pNext;
232 pfirst->pPrev = (ValueType*)&Root;
233 Root.pNext->pPrev = plast;
240 void PushPrecedingListItemsToFront(List<T>& src, ValueType *ptail)
242 if (src.GetFirst() != ptail)
244 ValueType *pfirst = src.Root.pNext;
245 ValueType *plast = ptail->pPrev;
248 ptail->pPrev = (ValueType*)&src.Root;
249 src.Root.pNext = ptail;
252 plast->pNext = Root.pNext;
253 pfirst->pPrev = (ValueType*)&Root;
254 Root.pNext->pPrev = plast;
262 void PushListItemsToFront(ValueType *pfirst, ValueType *pend)
266 ValueType *plast = pend->pPrev;
269 pfirst->pPrev->pNext = pend;
270 pend->pPrev = pfirst->pPrev;
272 plast->pNext = Root.pNext;
273 pfirst->pPrev = (ValueType*)&Root;
274 Root.pNext->pPrev = plast;
280 void Alloc_MoveTo(List<T>* pdest)
286 pdest->Root.pNext = Root.pNext;
287 pdest->Root.pPrev = Root.pPrev;
289 Root.pNext->pPrev = (ValueType*)&pdest->Root;
290 Root.pPrev->pNext = (ValueType*)&pdest->Root;
297 List(
const List<T>&);
298 const List<T>& operator = (
const List<T>&);
344 template<
class T,
class Accessor>
class List2
349 inline static void SetPrev(ValueType*
self, ValueType* what) { Accessor::SetPrev(
self, what); }
350 inline static void SetNext(ValueType*
self, ValueType* what) { Accessor::SetNext(
self, what); }
351 inline static const ValueType* GetPrev(
const ValueType*
self) {
return Accessor::GetPrev(
self); }
352 inline static const ValueType* GetNext(
const ValueType*
self) {
return Accessor::GetNext(
self); }
353 inline static ValueType* GetPrev(ValueType*
self) {
return Accessor::GetPrev(
self); }
354 inline static ValueType* GetNext(ValueType*
self) {
return Accessor::GetNext(
self); }
358 SetPrev(&Root, &Root);
359 SetNext(&Root, &Root);
364 SetPrev(&Root, &Root);
365 SetNext(&Root, &Root);
368 const ValueType* GetFirst()
const {
return GetNext(&Root); }
369 const ValueType* GetLast ()
const {
return GetPrev(&Root); }
370 ValueType* GetFirst() {
return GetNext(&Root); }
371 ValueType* GetLast () {
return GetPrev(&Root); }
373 bool IsEmpty()
const {
return GetNext(&Root) == &Root; }
374 bool IsFirst(
const ValueType* p)
const {
return p == GetNext(&Root); }
375 bool IsLast (
const ValueType* p)
const {
return p == GetPrev(&Root); }
376 bool IsNull (
const ValueType* p)
const {
return p == &Root; }
378 void PushFront(ValueType* p)
380 SetNext(p, GetNext(&Root));
382 SetPrev(GetNext(&Root), p);
386 void PushBack(ValueType* p)
388 SetPrev(p, GetPrev(&Root));
390 SetNext(GetPrev(&Root), p);
394 void InsertBefore(ValueType* existing, ValueType* newOne)
396 ValueType* prev = GetPrev(existing);
397 SetNext(newOne, existing);
398 SetPrev(newOne, prev);
399 SetNext(prev, newOne);
400 SetPrev(existing, newOne);
403 void InsertAfter(ValueType* existing, ValueType* newOne)
405 ValueType* next = GetNext(existing);
406 SetPrev(newOne, existing);
407 SetNext(newOne, next);
408 SetPrev(next, newOne);
409 SetNext(existing, newOne);
412 static void Remove(ValueType* p)
414 SetNext(GetPrev(p), GetNext(p));
415 SetPrev(GetNext(p), GetPrev(p));
418 void BringToFront(ValueType* p)
424 void SendToBack(ValueType* p)
432 void PushListToFront(List2<T,Accessor>& src)
436 ValueType* pfirst = src.GetFirst();
437 ValueType* plast = src.GetLast();
439 SetNext(plast, GetNext(&Root));
440 SetPrev(pfirst, &Root);
441 SetPrev(GetNext(&Root), plast);
442 SetNext(&Root, pfirst);
448 List2(
const List2<T,Accessor>&);
449 const List2<T,Accessor>& operator = (
const List2<T,Accessor>&);
459 template<
class List,
class Allocator>
460 void FreeListElements(List& list, Allocator& allocator)
462 typename List::ValueType*
self = list.GetFirst();
463 while(!list.IsNull(
self))
465 typename List::ValueType* next = list.GetNext(
self);
466 allocator.Free(
self);
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17