14#ifndef __DCL_LIST_T_H__
15#error "Never include <dcl/__ListT-GCC.h> directly; use <dcl/ListT.h> instead."
20#if __DCL_HAVE_THIS_FILE__
21 static const char_t __szListT_h__[] =
__T(
"dcl/__ListT-MSC.h");
23 #define __THIS_FILE__ __szListT_h__
26template<
typename ELEMENT>
31 struct ListNode :
public NodeBase
37 class Iterator :
public ListIteratorBase
45 Iterator(NodeBase* _pNode)
51 Iterator(
const Iterator& _it)
57 Iterator& operator=(
const Iterator& _it)
64 Iterator& operator++()
71 Iterator operator++(
int)
76 return Iterator(pSaveNode);
79 Iterator& operator--()
86 Iterator operator--(
int)
91 return Iterator(pSaveNode);
97 return ((ListNode*)
__pNode)->data;
101 friend typename List<ELEMENT>;
102 friend class ConstIterator;
105 class ConstIterator :
public ConstListIteratorBase
113 ConstIterator(
const NodeBase* _pNode)
119 ConstIterator(
const ConstIterator& _it)
125 ConstIterator(
const Iterator& _it)
131 ConstIterator& operator=(
const ConstIterator& _it)
138 ConstIterator& operator++()
145 ConstIterator operator++(
int)
148 const NodeBase* pSaveNode =
__pNode;
150 return ConstIterator(pSaveNode);
153 ConstIterator& operator--()
160 ConstIterator operator--(
int)
163 const NodeBase* pSaveNode =
__pNode;
165 return ConstIterator(pSaveNode);
168 const ELEMENT& operator*()
171 return ((ListNode*)
__pNode)->data;
175 class ReverseConstIterator;
176 class ReverseIterator :
public ListIteratorBase
184 ReverseIterator(NodeBase* _pNode)
190 ReverseIterator(
const ReverseIterator& _it)
196 ReverseIterator& operator=(
const ReverseIterator& _it)
203 ReverseIterator& operator++()
210 ReverseIterator operator++(
int)
215 return ReverseIterator(pSaveNode);
218 ReverseIterator& operator--()
225 ReverseIterator operator--(
int)
230 return ReverseIterator(pSaveNode);
236 return ((ListNode*)
__pNode)->data;
240 friend typename List<ELEMENT>;
241 friend class ReverseConstIterator;
244 class ReverseConstIterator :
public ConstListIteratorBase
247 ReverseConstIterator()
252 ReverseConstIterator(
const NodeBase* _pNode)
258 ReverseConstIterator(
const ReverseConstIterator& _it)
264 ReverseConstIterator(
const ReverseIterator& _it)
270 ReverseConstIterator& operator=(
const ReverseConstIterator& _it)
277 ReverseConstIterator& operator++()
284 ReverseConstIterator operator++(
int)
287 const NodeBase* pSaveNode =
__pNode;
289 return ReverseConstIterator(pSaveNode);
292 ReverseConstIterator& operator--()
299 ReverseConstIterator operator--(
int)
302 const NodeBase* pSaveNode =
__pNode;
304 return ReverseConstIterator(pSaveNode);
307 const ELEMENT& operator*()
310 return ((ListNode*)
__pNode)->data;
321 ConstIterator
end()
const;
326 ReverseConstIterator
rend()
const;
331 Iterator
insert(Iterator _pos,
const ELEMENT& _element);
332 void insert(Iterator _pos, ConstIterator _first, ConstIterator _last);
337 List<ELEMENT>& _other, Iterator _otherFirst, Iterator _otherLast);
354 size_t size(ConstIterator _first, ConstIterator _last)
const;
356 void move(Iterator posTo, Iterator _first, Iterator _last);
364template<
typename ELEMENT>
366typename List<ELEMENT>::ConstIterator
369 return __pMasterNode->pNext;
372template<
typename ELEMENT>
374typename List<ELEMENT>::ConstIterator
377 return __pMasterNode;
380template<
typename ELEMENT>
382typename List<ELEMENT>::Iterator
385 return __pMasterNode->pNext;
388template<
typename ELEMENT>
390typename List<ELEMENT>::Iterator
393 return __pMasterNode;
396template<
typename ELEMENT>
398typename List<ELEMENT>::ReverseConstIterator
401 return __pMasterNode->pPrev;
404template<
typename ELEMENT>
406typename List<ELEMENT>::ReverseConstIterator
409 return __pMasterNode;
412template<
typename ELEMENT>
414typename List<ELEMENT>::ReverseIterator
417 return __pMasterNode->pPrev;
420template<
typename ELEMENT>
422typename List<ELEMENT>::ReverseIterator
425 return __pMasterNode;
428template<
typename ELEMENT>
433 return __pMasterNode->pNext == __pMasterNode;
436template<
typename ELEMENT>
445template<
typename ELEMENT>
450 insert(begin(), _element);
454template<
typename ELEMENT>
459 insert(end(), _element);
463template<
typename ELEMENT>
468 insert(end(), _element);
475template<
typename ELEMENT>
478 __DCL_NAMESPACE_STRING __S(
List),
483template<
typename ELEMENT>
489template<
typename ELEMENT>
496template<
typename ELEMENT>
504template<
typename ELEMENT>
518template<
typename ELEMENT>
534template<
typename ELEMENT>
548template<
typename ELEMENT>
552 ListNode* pNode = (ListNode*) malloc(
sizeof(ListNode));
557#if __DCL_HAVE_ALLOC_DEBUG
561 new(&(pNode->data)) ELEMENT;
563#if __DCL_HAVE_ALLOC_DEBUG
564#define new __DCL_DEBUG_NEW
567 pNode->data = _element;
571template<
typename ELEMENT>
575 _pNode->data.~ELEMENT();
579template<
typename ELEMENT>
580typename List<ELEMENT>::Iterator
584 pNewNode->pPrev = _pos.__pNode->pPrev;
585 pNewNode->pNext = _pos.__pNode;
586 _pos.__pNode->pPrev->pNext = pNewNode;
587 _pos.__pNode->pPrev = pNewNode;
591 return (ListNode*)pNewNode;
594template<
typename ELEMENT>
598 for(; _first != _last; _first++)
604template<
typename ELEMENT>
608 ListNode* pNodeTemp =
NULL;
612 pNodeTemp = (ListNode*)pNode;
613 pNode = pNode->
pNext;
621template<
typename ELEMENT>
622typename List<ELEMENT>::Iterator
626 ListNode* pNodeTemp = (ListNode*)_pos.__pNode;
628 pNodeTemp->pPrev->pNext = pNodeTemp->pNext;
629 pNodeTemp->pNext->pPrev = pNodeTemp->pPrev;
632 return (ListNode*)pNext;
635template<
typename ELEMENT>
645template<
typename ELEMENT>
656template<
typename ELEMENT>
662 _last.__pNode->pPrev->pNext = _pos.__pNode;
663 _first.__pNode->pPrev->pNext = _last.__pNode;
664 _pos.__pNode->pPrev->pNext = _first.__pNode;
666 NodeBase* pTemp = _pos.__pNode->pPrev;
667 _pos.__pNode->pPrev = _last.__pNode->pPrev;
668 _last.__pNode->pPrev = _first.__pNode->pPrev;
669 _first.__pNode->pPrev = pTemp;
673template<
typename ELEMENT>
676 List<ELEMENT>& _other, Iterator _otherFirst, Iterator _otherLast)
678 size_t nMoveCount =
size((ListNode*)(_otherFirst.__pNode),
679 (ListNode*)(_otherLast.__pNode));
681 _other.
__size -= nMoveCount;
683 move(_pos, _otherFirst, _otherLast);
686template<
typename ELEMENT>
691 for(; _first != _last; _first++)
696#if __DCL_HAVE_THIS_FILE__
698 #define __THIS_FILE__ __T(__FILE__)
#define DECLARE_CLASSINFO(class_name)
#define CLASSINFO(class_name)
#define __DCL_ASSERT(expr)
void CharsetConvertException *__fields clear()
Iterator erase(Iterator _pos)
List< ELEMENT > & addHead(const ELEMENT &_element)
ConstIterator end() const
void destroyNode(ListNode *_pNode)
size_t size(ConstIterator _first, ConstIterator _last) const
ConstIterator end() const
void insert(Iterator _pos, ConstIterator _first, ConstIterator _last)
ListNode * createNode(const ELEMENT &_element)
void move(Iterator posTo, Iterator _first, Iterator _last)
List(const List< ELEMENT > &_src)
void splice(Iterator _pos, List< ELEMENT > &_other, Iterator _otherFirst, Iterator _otherLast)
ConstIterator begin() const
ReverseConstIterator rend() const
Iterator insert(Iterator _pos, const ELEMENT &_element)
const List< ELEMENT > & operator=(const List< ELEMENT > &_src)
List< ELEMENT > & add(const ELEMENT &_element)
Iterator erase(Iterator _pos)
ListNode * createNode(const ELEMENT &_element)
ReverseConstIterator rend() const
ReverseConstIterator rbegin() const
ConstIterator begin() const
ReverseConstIterator rbegin() const
List< ELEMENT > & addTail(const ELEMENT &_element)
Iterator insert(Iterator _pos, const ELEMENT &_element)
virtual const std::type_info & typeInfo() const