37 template<
typename T, 
typename _Alloc>
    40 template<
typename T, 
typename _Alloc>
    41 class CWConstListIterator;
    56   mutable unsigned short count;         
    57   mutable unsigned short dead;          
    59   CWNode() : count(0), dead(0) { }
    60   explicit CWNode(T 
const& __val) : mElement(__val), count(0), dead(0) { }
    64   bool operator==(CWNode 
const& __node)
 const { LIBCWD_ASSERT(!__node.dead); 
return mElement == __node.mElement && !dead; }
    65   bool operator!=(CWNode 
const& __node)
 const { LIBCWD_ASSERT(!__node.dead); 
return mElement != __node.mElement || dead; }
    68   bool operator<(CWNode 
const& __node)
 const { 
return mElement < __node.mElement; }
    76 template<
typename T, 
typename _Alloc>
    77 class CWListIterator {
    79         typedef CWListIterator<T, _Alloc>                       _Self;
    80         typedef std::list<CWNode<T>, _Alloc>                    _Container;
    81         typedef typename _Container::iterator   _Iterator;
    83         _Container* mContainer;                 
    95           if (mContainer && mContainer->end() != mIterator)
    97                 backtrace(&buffer[index], 32);
   103                 LIBCWD_ASSERT(!mIterator->dead && mIterator->count < 100);
   104                 ++(mIterator->count);
   112           if (mContainer && mContainer->end() != mIterator)
   114                 backtrace(&buffer[index], 32);
   117                 LIBCWD_ASSERT(mIterator->count > 0);
   118                 if (--(mIterator->count) == 0 && mIterator->dead)
   120                   mContainer->erase(mIterator);
   127         typedef typename _Iterator::difference_type             difference_type;
   128         typedef typename _Iterator::iterator_category   iterator_category;
   129         typedef T                                                                               value_type;
   131         typedef T&                                                                              reference;
   134         CWListIterator() : mContainer(NULL), index(0) { std::memset(buffer, 0, 
sizeof(buffer)); }
   137         CWListIterator(_Container* __c, _Iterator 
const& __i) : mContainer(__c), mIterator(__i), index(0)
   139           std::memset(buffer, 0, 
sizeof(buffer));
   140           LIBCWD_ASSERT(mContainer);
   145         CWListIterator(CWListIterator 
const& __i) : mContainer(__i.mContainer), mIterator(__i.mIterator), index(0)
   147           std::memset(buffer, 0, 
sizeof(buffer));
   158         _Self& operator=(_Self 
const& __x)
   161           mContainer = __x.mContainer;
   162           mIterator = __x.mIterator;
   163           LIBCWD_ASSERT(mContainer);
   169         reference operator*()
 const   172           LIBCWD_ASSERT(mContainer && !mIterator->dead);
   173           return mIterator->mElement;
   177         pointer operator->()
 const   180           LIBCWD_ASSERT(mContainer && !mIterator->dead);
   181           return &mIterator->mElement;
   187           LIBCWD_ASSERT(mContainer && mIterator != mContainer->end());
   188           LIBCWD_ASSERT(mIterator->count > 0);                          
   189           _Iterator cur = mIterator;                                    
   192           while(cur != mContainer->end() && cur->dead)  
   202         _Self operator++(
int)
   212           LIBCWD_ASSERT(mContainer && mIterator != mContainer->begin());
   213           LIBCWD_ASSERT(mIterator->count > 0);                          
   214           _Iterator cur = mIterator;                                    
   227         _Self operator--(
int)
   237         bool operator==(_Self 
const& __x)
 const { 
return mIterator == __x.mIterator; }
   238         bool operator!=(_Self 
const& __x)
 const { 
return mIterator != __x.mIterator; }
   240         friend class CWList<T, _Alloc>;
   241         friend class CWConstListIterator<T, _Alloc>;
   242         template<
typename T2, 
typename A> 
friend bool operator==(CWListIterator<T2, A> 
const& __x, CWConstListIterator<T2, A> 
const& __y);
   243         template<
typename T2, 
typename A> 
friend bool operator!=(CWListIterator<T2, A> 
const& __x, CWConstListIterator<T2, A> 
const& __y);
   250           if (mContainer && mIterator != mContainer->end())
   252                 return mIterator->count;
   262 #ifdef _GLIBCXX_DEBUG   264           memset(&mIterator, 0, 
sizeof(mIterator));
   276 template<
typename T, 
typename _Alloc = std::allocator<T> >
   277 class CWConstListIterator {
   279         typedef CWConstListIterator<T, _Alloc>                          _Self;
   280         typedef std::list<CWNode<T>, _Alloc>                            _Container;
   281         typedef typename _Container::iterator                   _Iterator;
   282         typedef typename _Container::const_iterator             _ConstIterator;
   283         typedef CWListIterator<T, _Alloc>                                       iterator;
   285         _Container 
const* mContainer;
   286         _Iterator mConstIterator;               
   290           if (mContainer && mContainer->end() != mConstIterator)
   292                 LIBCWD_ASSERT(mConstIterator->count < 100);
   293                 mConstIterator->count++;
   299           if (mContainer && mContainer->end() != mConstIterator)
   301                 LIBCWD_ASSERT(mConstIterator->count > 0);
   302                 mConstIterator->count--;
   303                 if (mConstIterator->count == 0 && mConstIterator->dead)
   305                   const_cast<_Container*
>(mContainer)->erase(mConstIterator);
   311         typedef typename _ConstIterator::difference_type        difference_type;
   312         typedef typename _ConstIterator::iterator_category      iterator_category;
   313         typedef T                                                                                       value_type;
   314         typedef T 
const*                                                                        pointer;
   315         typedef T 
const&                                                                        reference;
   317         CWConstListIterator() : mContainer(NULL) { }
   318         CWConstListIterator(_Container 
const* __c, _Iterator 
const& __i) : mContainer(__c), mConstIterator(__i)
   320           LIBCWD_ASSERT(mContainer);
   324         CWConstListIterator(iterator 
const& __x) : mContainer(__x.mContainer), mConstIterator(__x.mIterator)
   328         CWConstListIterator(CWConstListIterator 
const& __i) : mContainer(__i.mContainer), mConstIterator(__i.mConstIterator)
   332         ~CWConstListIterator()
   337         _Self& operator=(_Self 
const& __x)
   340           mContainer = __x.mContainer;
   341           mConstIterator = __x.mConstIterator;
   342           LIBCWD_ASSERT(mContainer);
   348         _Self& operator=(iterator 
const& __x)
   351           mContainer = __x.mContainer;
   352           mConstIterator = __x.mIterator;
   353           LIBCWD_ASSERT(mContainer);
   358         reference operator*()
 const   360           LIBCWD_ASSERT(mContainer && !mConstIterator->dead);
   361           return mConstIterator->mElement;
   364         pointer operator->()
 const   366           LIBCWD_ASSERT(mContainer && !mConstIterator->dead);
   367           return &mConstIterator->mElement;
   372           _Iterator cur = mConstIterator;
   375           while(cur != mContainer->end() && cur->dead)
   379           mConstIterator = cur;
   384         _Self operator++(
int)
   393           _Iterator cur = mConstIterator;
   400           mConstIterator = cur;
   405         _Self operator--(
int)
   412         bool operator==(_Self 
const& __x)
 const { 
return mConstIterator == __x.mConstIterator; }
   413         bool operator!=(_Self 
const& __x)
 const { 
return mConstIterator != __x.mConstIterator; }
   414         bool operator==(iterator 
const& __x)
 const { 
return mConstIterator == __x.mIterator; }
   415         bool operator!=(iterator 
const& __x)
 const { 
return mConstIterator != __x.mIterator; }
   417         template<
typename T2, 
typename A> 
friend bool operator==(CWListIterator<T2, A> 
const& __x, CWConstListIterator<T2, A> 
const& __y);
   418         template<
typename T2, 
typename A> 
friend bool operator!=(CWListIterator<T2, A> 
const& __x, CWConstListIterator<T2, A> 
const& __y);
   422           if (mContainer && mConstIterator != mContainer->end())
   424                 return mConstIterator->count;
   430 template<
typename T, 
typename _Alloc>
   431 inline bool operator==(CWListIterator<T, _Alloc> 
const& __x, CWConstListIterator<T, _Alloc> 
const& __y)
   433   return __x.mIterator == __y.mConstIterator;
   436 template<
typename T, 
typename _Alloc>
   437 inline bool operator!=(CWListIterator<T, _Alloc> 
const& __x, CWConstListIterator<T, _Alloc> 
const& __y)
   439   return __x.mIterator != __y.mConstIterator;
   458 template<
typename T, 
typename _Alloc>
   461         typedef std::list<CWNode<T>, _Alloc>                            _Container;
   462         typedef typename _Container::iterator                   _Iterator;
   463         typedef typename _Container::const_iterator             _ConstIterator;
   465         _Container mContainer;
   469         typedef T                                                                               value_type;
   471         typedef T 
const*                                                                const_pointer;
   472         typedef T&                                                                              reference;
   473         typedef T 
const&                                                                const_reference;
   474         typedef CWListIterator<T, _Alloc>                                       iterator;
   475         typedef CWConstListIterator<T, _Alloc>                          const_iterator;
   476         typedef std::reverse_iterator<iterator>                 reverse_iterator;
   477         typedef std::reverse_iterator<const_iterator>   const_reverse_iterator;
   478         typedef size_t                                                                  size_type;
   479         typedef ptrdiff_t                                                               difference_type;
   482         CWList() : mSize(0) { }
   483 #ifdef CWDEBUG_DEBUGM   485         ~CWList() { clear(); }
   489         explicit CWList(size_type __n, value_type 
const& __val = value_type()) : mContainer(__n, CWNode<T>(__val)), mSize(__n) { }
   492         CWList(CWList 
const& __list) : mSize(0)
   494           for (_ConstIterator __i = __list.mContainer.begin(); __i != __list.mContainer.end(); ++__i)
   498                   mContainer.push_back(CWNode<T>(__i->mElement));
   505         template<
typename _InputIterator>
   506           CWList(_InputIterator __first, _InputIterator __last) : mSize(0)
   508           for (_InputIterator __i = __first; __i != __last; ++__i)
   510                 mContainer.push_back(CWNode<T>(*__i));
   516         CWList& operator=(CWList 
const& __list)
   519           for (_ConstIterator __i = __list.mContainer.begin(); __i != __list.mContainer.end(); ++__i)
   523                   mContainer.push_back(CWNode<T>(__i->mElement));
   532           _Iterator __i = mContainer.begin();
   533           while(__i != mContainer.end() && __i->dead)
   537           return iterator(&mContainer, __i);
   540         const_iterator begin()
 const   542           _Iterator __i = 
const_cast<_Container&
>(mContainer).begin();
   543           while(__i != mContainer.end() && __i->dead)
   547           return const_iterator(&mContainer, __i);
   550         iterator end() { 
return iterator(&mContainer, mContainer.end()); }
   551         const_iterator end()
 const { 
return const_iterator(&mContainer, const_cast<_Container&>(mContainer).end()); }
   552         reverse_iterator rbegin() { 
return reverse_iterator(end()); }
   553         const_reverse_iterator rbegin()
 const { 
return const_reverse_iterator(end()); }
   554         reverse_iterator rend() { 
return reverse_iterator(begin()); }
   555         const_reverse_iterator rend()
 const { 
return const_reverse_iterator(begin()); }
   557         bool empty()
 const { 
return mSize == 0; }
   558         size_type size()
 const { 
return mSize; }
   559         size_type max_size()
 const { 
return mContainer.max_size(); }
   561         reference front() { iterator __i = begin(); 
return *__i; }
   562         const_reference front()
 const { const_iterator __i = begin(); 
return *__i; }
   563         reference back() { iterator __i = end(); --__i; 
return *__i; }
   564         const_reference back()
 const { const_iterator __i = end(); --__i; 
return *__i; }
   566         void push_front(value_type 
const& __x)
   568           mContainer.push_front(CWNode<T>(__x));
   573           iterator __i = begin();
   576         void push_back(value_type 
const& __x)
   578           mContainer.push_back(CWNode<T>(__x));
   583           iterator __i = end();
   588         iterator insert(iterator __position, value_type 
const& __x)
   590           assert(__position.mContainer == &mContainer && (__position.mIterator == mContainer.end() || !__position.mIterator->dead));
   592           return iterator(&mContainer, mContainer.insert(__position.mIterator, CWNode<T>(__x)));
   597 #ifdef CWDEBUG_DEBUGM   599           for (_Iterator __i = mContainer.begin(); __i != mContainer.end(); ++__i)
   601                 LIBCWD_ASSERT(__i->count == 0);
   608         void erase(iterator __position)
   613           LIBCWD_ASSERT(__position.mContainer == &mContainer && __position.mIterator != mContainer.end() && __position.mIterator->count > 0 && !__position.mIterator->dead);
   614           __position.mIterator->dead = 1;
   619         void remove(value_type 
const& __val)
   621           _Iterator 
const __e = mContainer.end();
   622           for (_Iterator __i = mContainer.begin(); __i != __e;)
   624                 if (!__i->dead && __i->mElement == __val)
   629                         mContainer.erase(__i++);
   641 #ifdef CWDEBUG_DEBUGM   643           for (_Iterator __i = mContainer.begin(); __i != mContainer.end(); ++__i)
   645                 LIBCWD_ASSERT(__i->count == 0);
   650         template<
typename _StrictWeakOrdering>
   653                 _StrictWeakOrdering mPred;
   654                 PredWrapper(_StrictWeakOrdering 
const& pred) : mPred(pred) { }
   655                 bool operator()(CWNode<T> 
const& __x, CWNode<T> 
const& __y)
 const { 
return mPred(__x.mElement, __y.mElement); }
   657         template<
typename _StrictWeakOrdering>
   658           void sort(_StrictWeakOrdering 
const& pred)
   660 #ifdef CWDEBUG_DEBUGM   662           for (_Iterator __i = mContainer.begin(); __i != mContainer.end(); ++__i)
   664                 LIBCWD_ASSERT(__i->count == 0);
   667           mContainer.sort(PredWrapper<_StrictWeakOrdering>(pred));