14#include "eC_TList_Iterators.h"
18#include "eC_CustomMemoryMapping.h"
110 void Add(
const T &tValue);
319 if (m_pkFront != NULL)
321 kIter.m_pSaveNextNode = m_pkFront->
m_pkNext;
350 if (m_pkLast != NULL)
352 kIter.m_pSaveNextNode = m_pkLast->
m_pkNext;
375 Node* pkSearch = m_pkFront;
405 Node* pkSearch = m_pkFront;
412 kIter.m_pSaveNextNode = pkSearch->
m_pkNext;
434 Node* pkRet = m_pkFront;
436 while (pkRet != NULL && uiPos > 0)
455 if ((m_pkFront != NULL) && (uiPos <
GetQuantity()))
457 Node* pkRet = m_pkFront;
459 while (pkRet != NULL && uiPos > 0)
468 kIter.m_pSaveNextNode = pkRet->
m_pkNext;
485 if (© ==
this)
return *
this;
507 mutable Node* m_pkIterator;
509 eC_UInt m_uiQuantity;
512 eC_UInt m_uiIterRegisterCnt;
513 eC_UInt m_uiIterRegisterSize;
517 void SortArraysUsingQuickSort(
Node** ppkArray, eC_Int iFirst, eC_Int iLast,
compare comp = NULL);
519 void SortArraysUsingMergeSort(
Node** ppkMerged, eC_UInt uiQuantity,
compare comp = NULL);
523 void UpdateIterators(
Node*, Update_t)
const;
532#define FOR_ALL_FORWARD(Iterator,List) for ((Iterator) = (List).GetBegin(); \
533 (Iterator).IsInsideList(); ++(Iterator))
535#define FOR_ALL_BACKWARD(Iterator,List) for ((Iterator) = (List).GetEnd(); \
536 (Iterator).IsInsideList(); --(Iterator))
538#define FOR_ALL_FORWARD_SAFE(Iterator,List) for ((Iterator) = (List).GetBeginSafe(); \
539 (Iterator).IsValid() || (Iterator).IsNextValid(); ++(Iterator))
541#define FOR_ALL_BACKWARD_SAFE(Iterator,List) for ((Iterator) = (List).GetEndSafe(); \
542 (Iterator).IsValid() || (Iterator).IsPreviousValid(); --(Iterator))
552 m_ppIterRegister(NULL),
553 m_uiIterRegisterCnt(0),
554 m_uiIterRegisterSize(0)
564 m_ppIterRegister(NULL),
565 m_uiIterRegisterCnt(0),
566 m_uiIterRegisterSize(0)
577 for (eC_UInt i = 0; i < m_uiIterRegisterCnt; i++)
579 (m_ppIterRegister[i])->SetList(NULL);
582 delete[] m_ppIterRegister;
596 return m_uiQuantity == 0;
605 rtValue = m_pkFront->m_tValue;
606 m_pkIterator = m_pkFront->m_pkNext;
622 rtValue = m_pkIterator->m_tValue;
623 m_pkIterator = m_pkIterator->m_pkNext;
654 m_pkLast = pkNewNode;
659 m_pkFront = pkNewNode;
665 UpdateIterators(pkNewNode, ADDED);
695 UpdateIterators(pkNode, ADDED);
705 if (NULL == pNodeInList)
706 return Add(tValue2Add);
729 UpdateIterators(pkNode, ADDED);
739 if (NULL == pNodeInList)
740 return AddAtEnd(tValue2Add);
762 UpdateIterators(pkNode, ADDED);
769 if (Contains(tValue))
782 if (Contains(tValue))
795 if (Contains(tValue))
808 Node * pkSortIter = 0;
811 if ((pkSortIter = m_pkLast) != 0)
821 pkSortIter = m_pkFront;
824 if (!(tValue > pkSortIter->
m_tValue))
832 while (tValue > pkSortIter->
m_tValue)
839 Node* pkNextNode = pkSortIter;
857 UpdateIterators(pkNewNode, ADDED);
870 eC_Bool bResult = Remove(kIter.
GetNode());
882 return Remove((GetFind(tValue)).
m_pNode);
890 if (ptNode && m_pkFront)
892 Node * pkSave = NULL;
895 if (m_pkFront == ptNode)
900 m_pkFront = m_pkFront->m_pkNext;
903 if (m_pkFront != NULL)
906 m_pkFront->m_pkPrevious = NULL;
915 else if (m_pkLast == ptNode)
924 m_pkLast = m_pkLast->m_pkPrevious;
927 if (m_pkLast != NULL)
930 m_pkLast->m_pkNext = NULL;
944 ptNode->m_pkPrevious->m_pkNext = ptNode->m_pkNext;
945 ptNode->m_pkNext->m_pkPrevious = ptNode->m_pkPrevious;
949 UpdateIterators(pkSave, REMOVED);
968 rtValue = m_pkFront->m_tValue;
970 Node* pkSave = m_pkFront;
984 UpdateIterators(pkSave, REMOVED);
1002 rtValue = m_pkLast->m_tValue;
1004 Node* pkSave = m_pkLast;
1007 if (m_pkLast == m_pkFront)
1020 UpdateIterators(pkSave, REMOVED);
1035 Node * pkIterator = m_pkFront;
1045 pkIterator = pkNode;
1051 UpdateIterators(pkIterator, KILL);
1058 Node * pkIteratorNode = m_pkFront;
1060 while (pkIteratorNode)
1064 if (tValue == pkIteratorNode->
m_tValue)
1066 Remove(pkIteratorNode);
1069 pkIteratorNode = pkNextNode;
1077 Node * pkReverse = NULL;
1079 m_pkLast = m_pkFront;
1083 Node * pkNode = m_pkFront;
1095 m_pkFront = pkReverse;
1102 UpdateIterators(0, REVERSE_ORDER);
1109 Node * pkSearch = m_pkFront;
1147 if (oldPrevious1 != NULL)
1154 if (oldNext1 != NULL)
1161 if (oldPrevious2 != NULL)
1192 if (oldPreviousStart != NULL)
1199 if (oldNextEnd != NULL)
1206 if (oldPrevious != NULL)
1209 m_pkFront = kStartIter.
GetNode();
1237 if (oldPrevious1 != NULL)
1244 if (oldNext1 != NULL)
1251 if (oldNext2 != NULL)
1282 if (oldPreviousStart != NULL)
1289 if (oldNextEnd != NULL)
1296 if (oldNext != NULL)
1299 m_pkLast = kEndIter.
GetNode();
1332 eC_Int iIter1 = iFirst, iIter2 = iLast;
1333 T tPivo = ppSortPointers[(iFirst + iLast) / 2]->m_tValue;
1335 while (iIter1 <= iIter2)
1340 while (comp(ppSortPointers[iIter1]->m_tValue, tPivo))
1345 while (comp(tPivo, ppSortPointers[iIter2]->m_tValue))
1354 !((ppSortPointers[iIter1]->m_tValue) > tPivo) &&
1355 !((ppSortPointers[iIter1]->m_tValue) == tPivo)
1361 while ((ppSortPointers[iIter2]->m_tValue) > tPivo)
1368 if (iIter1 <= iIter2)
1370 Node * pkTempNode = ppSortPointers[iIter1];
1371 ppSortPointers[iIter1] = ppSortPointers[iIter2];
1372 ppSortPointers[iIter2] = pkTempNode;
1380 if (iFirst < iIter2)
1382 SortArraysUsingQuickSort(ppSortPointers, iFirst, iIter2, comp);
1388 SortArraysUsingQuickSort(ppSortPointers, iIter1, iLast, comp);
1401 eC_UInt uiMiddle = uiQuantity / 2;
1402 eC_UInt uiRightQuantity = uiQuantity - uiMiddle;
1403 eC_UInt uiLeftQuantity = uiMiddle;
1405 Node** ppkLeft =
new Node*[uiLeftQuantity];
1406 for (eC_UInt i = 0; i < uiLeftQuantity; ++i)
1409 Node** ppkRight =
new Node*[uiRightQuantity];
1410 for (eC_UInt i = 0; i < uiRightQuantity; ++i)
1413 eC_UInt uiRight, uiLeft;
1414 for (uiLeft = 0; uiLeft < uiMiddle; ++uiLeft)
1415 ppkLeft[uiLeft] = ppkMerged[uiLeft];
1418 for (eC_UInt ui = uiMiddle; ui < uiQuantity; ++ui)
1420 ppkRight[uiRight] = ppkMerged[ui];
1425 SortArraysUsingMergeSort(ppkLeft, uiLeft, comp);
1428 SortArraysUsingMergeSort(ppkRight, uiRight, comp);
1431 eC_UInt ui = 0, uj = 0, uk = 0;
1432 while (ui < uiQuantity)
1434 if ((uiLeftQuantity != uj) && (uiRightQuantity != uk))
1438 if (comp(ppkRight[uk]->m_tValue, ppkLeft[uj]->m_tValue))
1440 ppkMerged[ui] = ppkRight[uk];
1445 ppkMerged[ui] = ppkLeft[uj];
1453 !(ppkRight[uk]->m_tValue > ppkLeft[uj]->m_tValue) &&
1454 !(ppkRight[uk]->m_tValue == ppkLeft[uj]->m_tValue)
1457 ppkMerged[ui] = ppkRight[uk];
1462 ppkMerged[ui] = ppkLeft[uj];
1467 else if (uiLeftQuantity != uj)
1469 ppkMerged[ui] = ppkLeft[uj];
1472 else if (uiRightQuantity != uk)
1474 ppkMerged[ui] = ppkRight[uk];
1489 if (m_uiQuantity > 1)
1492 Node** ppSortPointers;
1493 ppSortPointers =
new Node *[m_uiQuantity];
1496 pkIter = GetBegin();
1499 for (ui = 0; ui < m_uiQuantity; ui++)
1501 ppSortPointers[ui] = pkIter.
GetNode();
1508 delete[] ppSortPointers;
1515 SortArraysUsingQuickSort(ppSortPointers, 0, m_uiQuantity - 1, comp);
1517 SortArraysUsingMergeSort(ppSortPointers, m_uiQuantity, comp);
1522 m_pkFront = ppSortPointers[0];
1525 ppSortPointers[0]->
m_pkNext = ppSortPointers[1];
1527 for (ui = 1; ui < m_uiQuantity - 1; ui++)
1529 ppSortPointers[ui]->
m_pkPrevious = ppSortPointers[ui - 1];
1530 ppSortPointers[ui]->
m_pkNext = ppSortPointers[ui + 1];
1534 ppSortPointers[m_uiQuantity - 1]->
m_pkPrevious = ppSortPointers[m_uiQuantity - 2];
1535 ppSortPointers[m_uiQuantity - 1]->
m_pkNext = NULL;
1537 m_pkLast = ppSortPointers[m_uiQuantity - 1];
1539 delete[] ppSortPointers;
1541 UpdateIterators(pkIter.
GetNode(), KILL);
1550 for (eC_UInt i = 0; i < m_uiIterRegisterCnt; i++)
1553 assert(m_ppIterRegister[i] != NULL);
1554 (m_ppIterRegister[i])->Validate(pkNode, eUpdate);
1564 if (m_uiIterRegisterSize == m_uiIterRegisterCnt)
1570 for (eC_UInt i = 0; i < m_uiIterRegisterCnt; i++)
1572 ppTempRegister[i] = m_ppIterRegister[i];
1575 if (m_uiIterRegisterSize != 0)
1578 delete[] m_ppIterRegister;
1581 m_ppIterRegister = ppTempRegister;
1582 m_uiIterRegisterSize = m_uiIterRegisterSize + 5;
1586 m_ppIterRegister[m_uiIterRegisterCnt] = pkNewIter;
1587 m_uiIterRegisterCnt++;
1588 pkNewIter->SetList(
this);
1598 for (eC_UInt i = 0; i < m_uiIterRegisterCnt; i++)
1601 if (m_ppIterRegister[i] == pkRemoveIter)
1603 m_ppIterRegister[i] = NULL;
1604 pkRemoveIter->SetList(NULL);
1605 for (eC_UInt j = i; j < m_uiIterRegisterCnt - 1; j++)
1607 m_ppIterRegister[j] = m_ppIterRegister[j + 1];
1610 m_uiIterRegisterCnt--;
1636 if (!((*it1) == (*it2)))
1652 return !(list1 == list2);
1656#include "eC_CustomMemoryMappingUndef.h"
ListNode template class.
Definition: eC_TList_doubleLinked.h:27
ListNode * m_pkPrevious
pointer to previous node
Definition: eC_TList_doubleLinked.h:44
ListNode * m_pkNext
pointer to next node
Definition: eC_TList_doubleLinked.h:41
T m_tValue
value of this node
Definition: eC_TList_doubleLinked.h:47
Classic iterator implementation with operator++, operator–, operator*.
Definition: eC_TList_Iterators.h:36
virtual eC_Bool IsInsideList() const
Definition: eC_TList_Iterators.h:139
ListNode< T > Node
typedef for node
Definition: eC_TList_Iterators.h:41
Node * m_pNode
this node
Definition: eC_TList_Iterators.h:44
Node * GetNode() const
Definition: eC_TList_Iterators.h:242
eC_Bool IsValid() const
Definition: eC_TList_Iterators.h:128
Represents a double linked list template with header and tail node.
Definition: eC_TList_doubleLinked.h:67
void RemoveAll(const T &tValue)
Definition: eC_TList_doubleLinked.h:1056
eC_TSafeIterator< T > GetAtSafe(eC_UInt uiPos)
Definition: eC_TList_doubleLinked.h:452
void Sort(eC_Bool bIsQuicksort=true, compare comp=NULL)
Definition: eC_TList_doubleLinked.h:1487
eC_Bool MoveBefore(Iterator &kIter1, Iterator &kIter2)
Definition: eC_TList_doubleLinked.h:1133
eC_Bool RemoveEnd(T &rtValue)
Definition: eC_TList_doubleLinked.h:997
eC_Bool Remove(SafeIterator &kIter)
Definition: eC_TList_doubleLinked.h:868
eC_Bool Empty() const
Definition: eC_TList_doubleLinked.h:1126
eC_TListDoubleLinked(const eC_TListDoubleLinked< T > ©)
Definition: eC_TList_doubleLinked.h:559
eC_Bool Contains(const T &tValue) const
Definition: eC_TList_doubleLinked.h:1107
void AddAfter(const T &tValue2Add, Iterator &kIter)
Definition: eC_TList_doubleLinked.h:734
eC_TIterator< T > GetEnd() const
Definition: eC_TList_doubleLinked.h:336
eC_TIterator< T > Iterator
Iterator is typedef'd as eC_TIterator ot type T.
Definition: eC_TList_doubleLinked.h:74
eC_TListDoubleLinked< T > & operator=(const eC_TListDoubleLinked< T > ©)
Definition: eC_TList_doubleLinked.h:482
eC_TSafeIterator< T > GetEndSafe()
Definition: eC_TList_doubleLinked.h:346
eC_Bool AddUniqueAtEnd(const T &tValue)
Definition: eC_TList_doubleLinked.h:780
eC_Bool AddUnique(const T &tValue)
Definition: eC_TList_doubleLinked.h:767
void AddSorted(const T &tValue)
Definition: eC_TList_doubleLinked.h:806
void RemoveAll()
Definition: eC_TList_doubleLinked.h:1033
eC_Bool Remove(const T &tValue)
Definition: eC_TList_doubleLinked.h:879
eC_UInt GetQuantity() const
Definition: eC_TList_doubleLinked.h:587
eC_Bool MoveAfter(Iterator &kStartIter, Iterator &kEndIter, Iterator &kIter)
Definition: eC_TList_doubleLinked.h:1268
eC_Bool GetFirst(T &rtValue) const
Definition: eC_TList_doubleLinked.h:601
void ReverseOrder()
Definition: eC_TList_doubleLinked.h:1075
eC_TIterator< T > GetAt(eC_UInt uiPos) const
Definition: eC_TList_doubleLinked.h:432
eC_Bool MoveAfter(Iterator &kIter1, Iterator &kIter2)
Definition: eC_TList_doubleLinked.h:1223
eC_TIterator< T > GetBegin() const
Definition: eC_TList_doubleLinked.h:305
eC_TSafeIterator< T > SafeIterator
SafeIterator is typedef'd as eC_TSafeIterator ot type T.
Definition: eC_TList_doubleLinked.h:77
eC_TSafeIterator< T > GetFindSafe(const T &tValue)
Definition: eC_TList_doubleLinked.h:402
~eC_TListDoubleLinked()
Definition: eC_TList_doubleLinked.h:573
eC_Bool MoveBefore(Iterator &kStartIter, Iterator &kEndIter, Iterator &kIter)
Definition: eC_TList_doubleLinked.h:1178
eC_TSafeIterator< T > GetBeginSafe()
Definition: eC_TList_doubleLinked.h:315
eC_Bool GetNext(T &rtValue) const
Definition: eC_TList_doubleLinked.h:618
void AddBefore(const T &tValue2Add, Iterator &kIter)
Definition: eC_TList_doubleLinked.h:700
eC_Bool RemoveFront(T &rtValue)
Definition: eC_TList_doubleLinked.h:963
eC_Bool AddUniqueSorted(const T &tValue)
Definition: eC_TList_doubleLinked.h:793
eC_Bool IsEmpty() const
Definition: eC_TList_doubleLinked.h:594
eC_TIterator< T > GetFind(const T &tValue) const
Definition: eC_TList_doubleLinked.h:372
bool(* compare)(T lhs, T rhs)
compare-function
Definition: eC_TList_doubleLinked.h:80
eC_TListDoubleLinked()
Definition: eC_TList_doubleLinked.h:547
void AddAtEnd(const T &tValue)
Definition: eC_TList_doubleLinked.h:670
eC_Bool Swap(Iterator &kIter1, Iterator &kIter2)
Definition: eC_TList_doubleLinked.h:1313
void Add(const T &tValue)
Definition: eC_TList_doubleLinked.h:635
An iterator that stays valid even if elements are deleted from the list.
Definition: eC_TList_Iterators.h:313
bool operator==(const NSmartPtr::SharedPtr< C1 > &a, const NSmartPtr::SharedPtr< C2 > &b)
Definition: SharedPtr.h:240
bool operator!=(const NSmartPtr::SharedPtr< C1 > &a, const NSmartPtr::SharedPtr< C2 > &b)
Definition: SharedPtr.h:226