williamr@4: /* williamr@4: * williamr@4: * williamr@4: * Copyright (c) 1994 williamr@4: * Hewlett-Packard Company williamr@4: * williamr@4: * Copyright (c) 1996,1997 williamr@4: * Silicon Graphics Computer Systems, Inc. williamr@4: * williamr@4: * Copyright (c) 1997 williamr@4: * Moscow Center for SPARC Technology williamr@4: * williamr@4: * Copyright (c) 1999 williamr@4: * Boris Fomitchev williamr@4: * williamr@4: * This material is provided "as is", with absolutely no warranty expressed williamr@4: * or implied. Any use is at your own risk. williamr@4: * williamr@4: * Permission to use or copy this software for any purpose is hereby granted williamr@4: * without fee, provided the above notices are retained on all copies. williamr@4: * Permission to modify the code and to distribute modified code is granted, williamr@4: * provided the above notices are retained, and a notice that the code was williamr@4: * modified is included with the above copyright notice. williamr@4: * williamr@4: */ williamr@4: #ifndef _STLP_LIST_C williamr@4: #define _STLP_LIST_C williamr@4: williamr@4: #ifndef _STLP_INTERNAL_LIST_H williamr@4: # include williamr@4: #endif williamr@4: williamr@4: #if defined (__WATCOMC__) || defined (_STLP_USE_TRAP_LEAVE) williamr@4: #include williamr@4: #endif williamr@4: williamr@4: # undef list williamr@4: # define list __WORKAROUND_DBG_RENAME(list) williamr@4: williamr@4: _STLP_BEGIN_NAMESPACE williamr@4: williamr@4: # if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION) williamr@4: williamr@4: template williamr@4: void _STLP_CALL williamr@4: _List_global<_Dummy>::_Transfer(_List_node_base* __position, williamr@4: _List_node_base* __first, _List_node_base* __last) { williamr@4: if (__position != __last) { williamr@4: // Remove [first, last) from its old position. williamr@4: ((_Node*) (__last->_M_prev))->_M_next = __position; williamr@4: ((_Node*) (__first->_M_prev))->_M_next = __last; williamr@4: ((_Node*) (__position->_M_prev))->_M_next = __first; williamr@4: williamr@4: // Splice [first, last) into its new position. williamr@4: _Node* __tmp = (_Node*) (__position->_M_prev); williamr@4: __position->_M_prev = __last->_M_prev; williamr@4: __last->_M_prev = __first->_M_prev; williamr@4: __first->_M_prev = __tmp; williamr@4: } williamr@4: } williamr@4: williamr@4: #endif /* defined (__BUILDING_STLPORT) || ! defined (_STLP_OWN_IOSTREAMS) */ williamr@4: williamr@4: williamr@4: template williamr@4: void williamr@4: _List_base<_Tp,_Alloc>::clear() williamr@4: { williamr@4: _List_node<_Tp>* __cur = this->_M_node._M_data; williamr@4: if (!__cur) williamr@4: return; williamr@4: __cur = (_List_node<_Tp>*)__cur->_M_next; williamr@4: while (__cur != this->_M_node._M_data) { williamr@4: _List_node<_Tp>* __tmp = __cur; williamr@4: __cur = (_List_node<_Tp>*) __cur->_M_next; williamr@4: _STLP_STD::_Destroy(&__tmp->_M_data); williamr@4: this->_M_node.deallocate(__tmp, 1); williamr@4: } williamr@4: this->_M_node._M_data->_M_next = this->_M_node._M_data; williamr@4: this->_M_node._M_data->_M_prev = this->_M_node._M_data; williamr@4: } williamr@4: williamr@4: # if defined (_STLP_NESTED_TYPE_PARAM_BUG) williamr@4: # define size_type size_t williamr@4: # endif williamr@4: williamr@4: template williamr@4: void list<_Tp, _Alloc>::resize(size_type __new_size, _Tp __x) williamr@4: { williamr@4: iterator __i = begin(); williamr@4: size_type __len = 0; williamr@4: for ( ; __i != end() && __len < __new_size; ++__i, ++__len); williamr@4: williamr@4: if (__len == __new_size) williamr@4: erase(__i, end()); williamr@4: else // __i == end() williamr@4: insert(end(), __new_size - __len, __x); williamr@4: } williamr@4: williamr@4: template williamr@4: list<_Tp, _Alloc>& list<_Tp, _Alloc>::operator=(const list<_Tp, _Alloc>& __x) williamr@4: { williamr@4: if (this != &__x) { williamr@4: iterator __first1 = begin(); williamr@4: iterator __last1 = end(); williamr@4: const_iterator __first2 = __x.begin(); williamr@4: const_iterator __last2 = __x.end(); williamr@4: while (__first1 != __last1 && __first2 != __last2) williamr@4: *__first1++ = *__first2++; williamr@4: if (__first2 == __last2) williamr@4: erase(__first1, __last1); williamr@4: else williamr@4: insert(__last1, __first2, __last2); williamr@4: } williamr@4: return *this; williamr@4: } williamr@4: williamr@4: template williamr@4: void list<_Tp, _Alloc>::_M_fill_assign(size_type __n, const _Tp& __val) { williamr@4: iterator __i = begin(); williamr@4: for ( ; __i != end() && __n > 0; ++__i, --__n) williamr@4: *__i = __val; williamr@4: if (__n > 0) williamr@4: insert(end(), __n, __val); williamr@4: else williamr@4: erase(__i, end()); williamr@4: } williamr@4: williamr@4: template williamr@4: void _S_remove_if(list<_Tp, _Alloc>& __that, _Predicate __pred) { williamr@4: typename list<_Tp, _Alloc>::iterator __first = __that.begin(); williamr@4: typename list<_Tp, _Alloc>::iterator __last = __that.end(); williamr@4: while (__first != __last) { williamr@4: typename list<_Tp, _Alloc>::iterator __next = __first; williamr@4: ++__next; williamr@4: if (__pred(*__first)) __that.erase(__first); williamr@4: __first = __next; williamr@4: } williamr@4: } williamr@4: williamr@4: template williamr@4: void _S_unique(list<_Tp, _Alloc>& __that, _BinaryPredicate __binary_pred) { williamr@4: typename list<_Tp, _Alloc>::iterator __first = __that.begin(); williamr@4: typename list<_Tp, _Alloc>::iterator __last = __that.end(); williamr@4: if (__first == __last) return; williamr@4: typename list<_Tp, _Alloc>::iterator __next = __first; williamr@4: while (++__next != __last) { williamr@4: if (__binary_pred(*__first, *__next)) williamr@4: __that.erase(__next); williamr@4: else williamr@4: __first = __next; williamr@4: __next = __first; williamr@4: } williamr@4: } williamr@4: williamr@4: template williamr@4: void _S_merge(list<_Tp, _Alloc>& __that, list<_Tp, _Alloc>& __x, williamr@4: _StrictWeakOrdering __comp) { williamr@4: typedef typename list<_Tp, _Alloc>::iterator _Literator; williamr@4: _Literator __first1 = __that.begin(); williamr@4: _Literator __last1 = __that.end(); williamr@4: _Literator __first2 = __x.begin(); williamr@4: _Literator __last2 = __x.end(); williamr@4: while (__first1 != __last1 && __first2 != __last2) williamr@4: if (__comp(*__first2, *__first1)) { williamr@4: _Literator __next = __first2; williamr@4: _List_global_inst::_Transfer(__first1._M_node, __first2._M_node, (++__next)._M_node); williamr@4: __first2 = __next; williamr@4: } williamr@4: else williamr@4: ++__first1; williamr@4: if (__first2 != __last2) _List_global_inst::_Transfer(__last1._M_node, __first2._M_node, __last2._M_node); williamr@4: } williamr@4: williamr@4: template williamr@4: void _S_sort(list<_Tp, _Alloc>& __that, _StrictWeakOrdering __comp) { williamr@4: // Do nothing if the list has length 0 or 1. williamr@4: if (__that._M_node._M_data->_M_next != __that._M_node._M_data && williamr@4: (__that._M_node._M_data->_M_next)->_M_next != __that._M_node._M_data) { williamr@4: williamr@4: #if !defined (__WATCOMC__) williamr@4: #ifdef _STLP_USE_TRAP_LEAVE williamr@4: typedef vector*, _Alloc> _TmpVec; williamr@4: _TmpVec* __pTmp = new _TmpVec(); williamr@4: _TmpVec& __counter = *__pTmp; williamr@4: for (int i = 0; 1< 64; ++i) { williamr@4: list<_Tp, _Alloc>* __pTmp2 = new list<_Tp, _Alloc>; williamr@4: __counter.push_back (__pTmp2); williamr@4: } williamr@4: list<_Tp, _Alloc>* __pcarry = new list<_Tp, _Alloc>; williamr@4: list<_Tp, _Alloc>& __carry = *__pcarry; williamr@4: #else williamr@4: list<_Tp, _Alloc> __counter[64]; williamr@4: list<_Tp, _Alloc> __carry; williamr@4: #endif williamr@4: #else williamr@4: list<_Tp, _Alloc> __carry; williamr@4: __vector__, _Alloc> __counter(64); williamr@4: #endif williamr@4: int __fill = 0; williamr@4: #ifdef _STLP_USE_TRAP_LEAVE williamr@4: while (!__that.empty()) { williamr@4: __carry.splice(__carry.begin(), __that, __that.begin()); williamr@4: int __i = 0; williamr@4: williamr@4: while(__i < __fill && !__counter[__i]->empty()) { williamr@4: _S_merge(*__counter[__i], __carry, __comp); williamr@4: __carry.swap(*__counter[__i++]); williamr@4: } williamr@4: __carry.swap(*__counter[__i]); williamr@4: if (__i == __fill) ++__fill; williamr@4: } williamr@4: williamr@4: for (int __i = 1; __i < __fill; ++__i) williamr@4: _S_merge(*__counter[__i], *__counter[__i-1], __comp); williamr@4: __that.swap(*__counter[__fill-1]); williamr@4: williamr@4: // those objects won't just go away williamr@4: __counter.clear(); williamr@4: CleanupStack::Pop(66); williamr@4: } williamr@4: # else williamr@4: while (!__that.empty()) { williamr@4: __carry.splice(__carry.begin(), __that, __that.begin()); williamr@4: int __i = 0; williamr@4: williamr@4: while(__i < __fill && !__counter[__i].empty()) { williamr@4: _S_merge(__counter[__i], __carry, __comp); williamr@4: __carry.swap(__counter[__i++]); williamr@4: } williamr@4: __carry.swap(__counter[__i]); williamr@4: if (__i == __fill) ++__fill; williamr@4: } williamr@4: williamr@4: for (int __i = 1; __i < __fill; ++__i) williamr@4: _S_merge(__counter[__i], __counter[__i-1], __comp); williamr@4: __that.swap(__counter[__fill-1]); williamr@4: } williamr@4: # endif williamr@4: williamr@4: } williamr@4: williamr@4: # undef list williamr@4: # undef size_type williamr@4: williamr@4: _STLP_END_NAMESPACE williamr@4: williamr@4: #endif /* _STLP_LIST_C */ williamr@4: williamr@4: // Local Variables: williamr@4: // mode:C++ williamr@4: // End: