xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/bits/list.tcc (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino // List implementation (out of line) -*- C++ -*-
2*e4b17023SJohn Marino 
3*e4b17023SJohn Marino // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
4*e4b17023SJohn Marino // 2011, 2012 Free Software Foundation, Inc.
5*e4b17023SJohn Marino //
6*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library.  This library is free
7*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the
8*e4b17023SJohn Marino // terms of the GNU General Public License as published by the
9*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option)
10*e4b17023SJohn Marino // any later version.
11*e4b17023SJohn Marino 
12*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful,
13*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of
14*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*e4b17023SJohn Marino // GNU General Public License for more details.
16*e4b17023SJohn Marino 
17*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional
18*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version
19*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation.
20*e4b17023SJohn Marino 
21*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and
22*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program;
23*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>.
25*e4b17023SJohn Marino 
26*e4b17023SJohn Marino /*
27*e4b17023SJohn Marino  *
28*e4b17023SJohn Marino  * Copyright (c) 1994
29*e4b17023SJohn Marino  * Hewlett-Packard Company
30*e4b17023SJohn Marino  *
31*e4b17023SJohn Marino  * Permission to use, copy, modify, distribute and sell this software
32*e4b17023SJohn Marino  * and its documentation for any purpose is hereby granted without fee,
33*e4b17023SJohn Marino  * provided that the above copyright notice appear in all copies and
34*e4b17023SJohn Marino  * that both that copyright notice and this permission notice appear
35*e4b17023SJohn Marino  * in supporting documentation.  Hewlett-Packard Company makes no
36*e4b17023SJohn Marino  * representations about the suitability of this software for any
37*e4b17023SJohn Marino  * purpose.  It is provided "as is" without express or implied warranty.
38*e4b17023SJohn Marino  *
39*e4b17023SJohn Marino  *
40*e4b17023SJohn Marino  * Copyright (c) 1996,1997
41*e4b17023SJohn Marino  * Silicon Graphics Computer Systems, Inc.
42*e4b17023SJohn Marino  *
43*e4b17023SJohn Marino  * Permission to use, copy, modify, distribute and sell this software
44*e4b17023SJohn Marino  * and its documentation for any purpose is hereby granted without fee,
45*e4b17023SJohn Marino  * provided that the above copyright notice appear in all copies and
46*e4b17023SJohn Marino  * that both that copyright notice and this permission notice appear
47*e4b17023SJohn Marino  * in supporting documentation.  Silicon Graphics makes no
48*e4b17023SJohn Marino  * representations about the suitability of this software for any
49*e4b17023SJohn Marino  * purpose.  It is provided "as is" without express or implied warranty.
50*e4b17023SJohn Marino  */
51*e4b17023SJohn Marino 
52*e4b17023SJohn Marino /** @file bits/list.tcc
53*e4b17023SJohn Marino  *  This is an internal header file, included by other library headers.
54*e4b17023SJohn Marino  *  Do not attempt to use it directly. @headername{list}
55*e4b17023SJohn Marino  */
56*e4b17023SJohn Marino 
57*e4b17023SJohn Marino #ifndef _LIST_TCC
58*e4b17023SJohn Marino #define _LIST_TCC 1
59*e4b17023SJohn Marino 
60*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default)
61*e4b17023SJohn Marino {
62*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
63*e4b17023SJohn Marino 
64*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
65*e4b17023SJohn Marino     void
66*e4b17023SJohn Marino     _List_base<_Tp, _Alloc>::
_M_clear()67*e4b17023SJohn Marino     _M_clear()
68*e4b17023SJohn Marino     {
69*e4b17023SJohn Marino       typedef _List_node<_Tp>  _Node;
70*e4b17023SJohn Marino       _Node* __cur = static_cast<_Node*>(_M_impl._M_node._M_next);
71*e4b17023SJohn Marino       while (__cur != &_M_impl._M_node)
72*e4b17023SJohn Marino 	{
73*e4b17023SJohn Marino 	  _Node* __tmp = __cur;
74*e4b17023SJohn Marino 	  __cur = static_cast<_Node*>(__cur->_M_next);
75*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
76*e4b17023SJohn Marino 	  _M_get_Node_allocator().destroy(__tmp);
77*e4b17023SJohn Marino #else
78*e4b17023SJohn Marino 	  _M_get_Tp_allocator().destroy(std::__addressof(__tmp->_M_data));
79*e4b17023SJohn Marino #endif
80*e4b17023SJohn Marino 	  _M_put_node(__tmp);
81*e4b17023SJohn Marino 	}
82*e4b17023SJohn Marino     }
83*e4b17023SJohn Marino 
84*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
85*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
86*e4b17023SJohn Marino     template<typename... _Args>
87*e4b17023SJohn Marino       typename list<_Tp, _Alloc>::iterator
88*e4b17023SJohn Marino       list<_Tp, _Alloc>::
emplace(iterator __position,_Args &&...__args)89*e4b17023SJohn Marino       emplace(iterator __position, _Args&&... __args)
90*e4b17023SJohn Marino       {
91*e4b17023SJohn Marino 	_Node* __tmp = _M_create_node(std::forward<_Args>(__args)...);
92*e4b17023SJohn Marino 	__tmp->_M_hook(__position._M_node);
93*e4b17023SJohn Marino 	return iterator(__tmp);
94*e4b17023SJohn Marino       }
95*e4b17023SJohn Marino #endif
96*e4b17023SJohn Marino 
97*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
98*e4b17023SJohn Marino     typename list<_Tp, _Alloc>::iterator
99*e4b17023SJohn Marino     list<_Tp, _Alloc>::
insert(iterator __position,const value_type & __x)100*e4b17023SJohn Marino     insert(iterator __position, const value_type& __x)
101*e4b17023SJohn Marino     {
102*e4b17023SJohn Marino       _Node* __tmp = _M_create_node(__x);
103*e4b17023SJohn Marino       __tmp->_M_hook(__position._M_node);
104*e4b17023SJohn Marino       return iterator(__tmp);
105*e4b17023SJohn Marino     }
106*e4b17023SJohn Marino 
107*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
108*e4b17023SJohn Marino     typename list<_Tp, _Alloc>::iterator
109*e4b17023SJohn Marino     list<_Tp, _Alloc>::
erase(iterator __position)110*e4b17023SJohn Marino     erase(iterator __position)
111*e4b17023SJohn Marino     {
112*e4b17023SJohn Marino       iterator __ret = iterator(__position._M_node->_M_next);
113*e4b17023SJohn Marino       _M_erase(__position);
114*e4b17023SJohn Marino       return __ret;
115*e4b17023SJohn Marino     }
116*e4b17023SJohn Marino 
117*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
118*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
119*e4b17023SJohn Marino     void
120*e4b17023SJohn Marino     list<_Tp, _Alloc>::
_M_default_append(size_type __n)121*e4b17023SJohn Marino     _M_default_append(size_type __n)
122*e4b17023SJohn Marino     {
123*e4b17023SJohn Marino       size_type __i = 0;
124*e4b17023SJohn Marino       __try
125*e4b17023SJohn Marino 	{
126*e4b17023SJohn Marino 	  for (; __i < __n; ++__i)
127*e4b17023SJohn Marino 	    emplace_back();
128*e4b17023SJohn Marino 	}
129*e4b17023SJohn Marino       __catch(...)
130*e4b17023SJohn Marino 	{
131*e4b17023SJohn Marino 	  for (; __i; --__i)
132*e4b17023SJohn Marino 	    pop_back();
133*e4b17023SJohn Marino 	  __throw_exception_again;
134*e4b17023SJohn Marino 	}
135*e4b17023SJohn Marino     }
136*e4b17023SJohn Marino 
137*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
138*e4b17023SJohn Marino     void
139*e4b17023SJohn Marino     list<_Tp, _Alloc>::
resize(size_type __new_size)140*e4b17023SJohn Marino     resize(size_type __new_size)
141*e4b17023SJohn Marino     {
142*e4b17023SJohn Marino       iterator __i = begin();
143*e4b17023SJohn Marino       size_type __len = 0;
144*e4b17023SJohn Marino       for (; __i != end() && __len < __new_size; ++__i, ++__len)
145*e4b17023SJohn Marino         ;
146*e4b17023SJohn Marino       if (__len == __new_size)
147*e4b17023SJohn Marino         erase(__i, end());
148*e4b17023SJohn Marino       else                          // __i == end()
149*e4b17023SJohn Marino 	_M_default_append(__new_size - __len);
150*e4b17023SJohn Marino     }
151*e4b17023SJohn Marino 
152*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
153*e4b17023SJohn Marino     void
154*e4b17023SJohn Marino     list<_Tp, _Alloc>::
resize(size_type __new_size,const value_type & __x)155*e4b17023SJohn Marino     resize(size_type __new_size, const value_type& __x)
156*e4b17023SJohn Marino     {
157*e4b17023SJohn Marino       iterator __i = begin();
158*e4b17023SJohn Marino       size_type __len = 0;
159*e4b17023SJohn Marino       for (; __i != end() && __len < __new_size; ++__i, ++__len)
160*e4b17023SJohn Marino         ;
161*e4b17023SJohn Marino       if (__len == __new_size)
162*e4b17023SJohn Marino         erase(__i, end());
163*e4b17023SJohn Marino       else                          // __i == end()
164*e4b17023SJohn Marino         insert(end(), __new_size - __len, __x);
165*e4b17023SJohn Marino     }
166*e4b17023SJohn Marino #else
167*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
168*e4b17023SJohn Marino     void
169*e4b17023SJohn Marino     list<_Tp, _Alloc>::
resize(size_type __new_size,value_type __x)170*e4b17023SJohn Marino     resize(size_type __new_size, value_type __x)
171*e4b17023SJohn Marino     {
172*e4b17023SJohn Marino       iterator __i = begin();
173*e4b17023SJohn Marino       size_type __len = 0;
174*e4b17023SJohn Marino       for (; __i != end() && __len < __new_size; ++__i, ++__len)
175*e4b17023SJohn Marino         ;
176*e4b17023SJohn Marino       if (__len == __new_size)
177*e4b17023SJohn Marino         erase(__i, end());
178*e4b17023SJohn Marino       else                          // __i == end()
179*e4b17023SJohn Marino         insert(end(), __new_size - __len, __x);
180*e4b17023SJohn Marino     }
181*e4b17023SJohn Marino #endif
182*e4b17023SJohn Marino 
183*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
184*e4b17023SJohn Marino     list<_Tp, _Alloc>&
185*e4b17023SJohn Marino     list<_Tp, _Alloc>::
operator =(const list & __x)186*e4b17023SJohn Marino     operator=(const list& __x)
187*e4b17023SJohn Marino     {
188*e4b17023SJohn Marino       if (this != &__x)
189*e4b17023SJohn Marino 	{
190*e4b17023SJohn Marino 	  iterator __first1 = begin();
191*e4b17023SJohn Marino 	  iterator __last1 = end();
192*e4b17023SJohn Marino 	  const_iterator __first2 = __x.begin();
193*e4b17023SJohn Marino 	  const_iterator __last2 = __x.end();
194*e4b17023SJohn Marino 	  for (; __first1 != __last1 && __first2 != __last2;
195*e4b17023SJohn Marino 	       ++__first1, ++__first2)
196*e4b17023SJohn Marino 	    *__first1 = *__first2;
197*e4b17023SJohn Marino 	  if (__first2 == __last2)
198*e4b17023SJohn Marino 	    erase(__first1, __last1);
199*e4b17023SJohn Marino 	  else
200*e4b17023SJohn Marino 	    insert(__last1, __first2, __last2);
201*e4b17023SJohn Marino 	}
202*e4b17023SJohn Marino       return *this;
203*e4b17023SJohn Marino     }
204*e4b17023SJohn Marino 
205*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
206*e4b17023SJohn Marino     void
207*e4b17023SJohn Marino     list<_Tp, _Alloc>::
_M_fill_assign(size_type __n,const value_type & __val)208*e4b17023SJohn Marino     _M_fill_assign(size_type __n, const value_type& __val)
209*e4b17023SJohn Marino     {
210*e4b17023SJohn Marino       iterator __i = begin();
211*e4b17023SJohn Marino       for (; __i != end() && __n > 0; ++__i, --__n)
212*e4b17023SJohn Marino         *__i = __val;
213*e4b17023SJohn Marino       if (__n > 0)
214*e4b17023SJohn Marino         insert(end(), __n, __val);
215*e4b17023SJohn Marino       else
216*e4b17023SJohn Marino         erase(__i, end());
217*e4b17023SJohn Marino     }
218*e4b17023SJohn Marino 
219*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
220*e4b17023SJohn Marino     template <typename _InputIterator>
221*e4b17023SJohn Marino       void
222*e4b17023SJohn Marino       list<_Tp, _Alloc>::
_M_assign_dispatch(_InputIterator __first2,_InputIterator __last2,__false_type)223*e4b17023SJohn Marino       _M_assign_dispatch(_InputIterator __first2, _InputIterator __last2,
224*e4b17023SJohn Marino 			 __false_type)
225*e4b17023SJohn Marino       {
226*e4b17023SJohn Marino         iterator __first1 = begin();
227*e4b17023SJohn Marino         iterator __last1 = end();
228*e4b17023SJohn Marino         for (; __first1 != __last1 && __first2 != __last2;
229*e4b17023SJohn Marino 	     ++__first1, ++__first2)
230*e4b17023SJohn Marino           *__first1 = *__first2;
231*e4b17023SJohn Marino         if (__first2 == __last2)
232*e4b17023SJohn Marino           erase(__first1, __last1);
233*e4b17023SJohn Marino         else
234*e4b17023SJohn Marino           insert(__last1, __first2, __last2);
235*e4b17023SJohn Marino       }
236*e4b17023SJohn Marino 
237*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
238*e4b17023SJohn Marino     void
239*e4b17023SJohn Marino     list<_Tp, _Alloc>::
remove(const value_type & __value)240*e4b17023SJohn Marino     remove(const value_type& __value)
241*e4b17023SJohn Marino     {
242*e4b17023SJohn Marino       iterator __first = begin();
243*e4b17023SJohn Marino       iterator __last = end();
244*e4b17023SJohn Marino       iterator __extra = __last;
245*e4b17023SJohn Marino       while (__first != __last)
246*e4b17023SJohn Marino 	{
247*e4b17023SJohn Marino 	  iterator __next = __first;
248*e4b17023SJohn Marino 	  ++__next;
249*e4b17023SJohn Marino 	  if (*__first == __value)
250*e4b17023SJohn Marino 	    {
251*e4b17023SJohn Marino 	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
252*e4b17023SJohn Marino 	      // 526. Is it undefined if a function in the standard changes
253*e4b17023SJohn Marino 	      // in parameters?
254*e4b17023SJohn Marino 	      if (std::__addressof(*__first) != std::__addressof(__value))
255*e4b17023SJohn Marino 		_M_erase(__first);
256*e4b17023SJohn Marino 	      else
257*e4b17023SJohn Marino 		__extra = __first;
258*e4b17023SJohn Marino 	    }
259*e4b17023SJohn Marino 	  __first = __next;
260*e4b17023SJohn Marino 	}
261*e4b17023SJohn Marino       if (__extra != __last)
262*e4b17023SJohn Marino 	_M_erase(__extra);
263*e4b17023SJohn Marino     }
264*e4b17023SJohn Marino 
265*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
266*e4b17023SJohn Marino     void
267*e4b17023SJohn Marino     list<_Tp, _Alloc>::
unique()268*e4b17023SJohn Marino     unique()
269*e4b17023SJohn Marino     {
270*e4b17023SJohn Marino       iterator __first = begin();
271*e4b17023SJohn Marino       iterator __last = end();
272*e4b17023SJohn Marino       if (__first == __last)
273*e4b17023SJohn Marino 	return;
274*e4b17023SJohn Marino       iterator __next = __first;
275*e4b17023SJohn Marino       while (++__next != __last)
276*e4b17023SJohn Marino 	{
277*e4b17023SJohn Marino 	  if (*__first == *__next)
278*e4b17023SJohn Marino 	    _M_erase(__next);
279*e4b17023SJohn Marino 	  else
280*e4b17023SJohn Marino 	    __first = __next;
281*e4b17023SJohn Marino 	  __next = __first;
282*e4b17023SJohn Marino 	}
283*e4b17023SJohn Marino     }
284*e4b17023SJohn Marino 
285*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
286*e4b17023SJohn Marino     void
287*e4b17023SJohn Marino     list<_Tp, _Alloc>::
288*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
merge(list && __x)289*e4b17023SJohn Marino     merge(list&& __x)
290*e4b17023SJohn Marino #else
291*e4b17023SJohn Marino     merge(list& __x)
292*e4b17023SJohn Marino #endif
293*e4b17023SJohn Marino     {
294*e4b17023SJohn Marino       // _GLIBCXX_RESOLVE_LIB_DEFECTS
295*e4b17023SJohn Marino       // 300. list::merge() specification incomplete
296*e4b17023SJohn Marino       if (this != &__x)
297*e4b17023SJohn Marino 	{
298*e4b17023SJohn Marino 	  _M_check_equal_allocators(__x);
299*e4b17023SJohn Marino 
300*e4b17023SJohn Marino 	  iterator __first1 = begin();
301*e4b17023SJohn Marino 	  iterator __last1 = end();
302*e4b17023SJohn Marino 	  iterator __first2 = __x.begin();
303*e4b17023SJohn Marino 	  iterator __last2 = __x.end();
304*e4b17023SJohn Marino 	  while (__first1 != __last1 && __first2 != __last2)
305*e4b17023SJohn Marino 	    if (*__first2 < *__first1)
306*e4b17023SJohn Marino 	      {
307*e4b17023SJohn Marino 		iterator __next = __first2;
308*e4b17023SJohn Marino 		_M_transfer(__first1, __first2, ++__next);
309*e4b17023SJohn Marino 		__first2 = __next;
310*e4b17023SJohn Marino 	      }
311*e4b17023SJohn Marino 	    else
312*e4b17023SJohn Marino 	      ++__first1;
313*e4b17023SJohn Marino 	  if (__first2 != __last2)
314*e4b17023SJohn Marino 	    _M_transfer(__last1, __first2, __last2);
315*e4b17023SJohn Marino 	}
316*e4b17023SJohn Marino     }
317*e4b17023SJohn Marino 
318*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
319*e4b17023SJohn Marino     template <typename _StrictWeakOrdering>
320*e4b17023SJohn Marino       void
321*e4b17023SJohn Marino       list<_Tp, _Alloc>::
322*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
merge(list && __x,_StrictWeakOrdering __comp)323*e4b17023SJohn Marino       merge(list&& __x, _StrictWeakOrdering __comp)
324*e4b17023SJohn Marino #else
325*e4b17023SJohn Marino       merge(list& __x, _StrictWeakOrdering __comp)
326*e4b17023SJohn Marino #endif
327*e4b17023SJohn Marino       {
328*e4b17023SJohn Marino 	// _GLIBCXX_RESOLVE_LIB_DEFECTS
329*e4b17023SJohn Marino 	// 300. list::merge() specification incomplete
330*e4b17023SJohn Marino 	if (this != &__x)
331*e4b17023SJohn Marino 	  {
332*e4b17023SJohn Marino 	    _M_check_equal_allocators(__x);
333*e4b17023SJohn Marino 
334*e4b17023SJohn Marino 	    iterator __first1 = begin();
335*e4b17023SJohn Marino 	    iterator __last1 = end();
336*e4b17023SJohn Marino 	    iterator __first2 = __x.begin();
337*e4b17023SJohn Marino 	    iterator __last2 = __x.end();
338*e4b17023SJohn Marino 	    while (__first1 != __last1 && __first2 != __last2)
339*e4b17023SJohn Marino 	      if (__comp(*__first2, *__first1))
340*e4b17023SJohn Marino 		{
341*e4b17023SJohn Marino 		  iterator __next = __first2;
342*e4b17023SJohn Marino 		  _M_transfer(__first1, __first2, ++__next);
343*e4b17023SJohn Marino 		  __first2 = __next;
344*e4b17023SJohn Marino 		}
345*e4b17023SJohn Marino 	      else
346*e4b17023SJohn Marino 		++__first1;
347*e4b17023SJohn Marino 	    if (__first2 != __last2)
348*e4b17023SJohn Marino 	      _M_transfer(__last1, __first2, __last2);
349*e4b17023SJohn Marino 	  }
350*e4b17023SJohn Marino       }
351*e4b17023SJohn Marino 
352*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
353*e4b17023SJohn Marino     void
354*e4b17023SJohn Marino     list<_Tp, _Alloc>::
sort()355*e4b17023SJohn Marino     sort()
356*e4b17023SJohn Marino     {
357*e4b17023SJohn Marino       // Do nothing if the list has length 0 or 1.
358*e4b17023SJohn Marino       if (this->_M_impl._M_node._M_next != &this->_M_impl._M_node
359*e4b17023SJohn Marino 	  && this->_M_impl._M_node._M_next->_M_next != &this->_M_impl._M_node)
360*e4b17023SJohn Marino       {
361*e4b17023SJohn Marino         list __carry;
362*e4b17023SJohn Marino         list __tmp[64];
363*e4b17023SJohn Marino         list * __fill = &__tmp[0];
364*e4b17023SJohn Marino         list * __counter;
365*e4b17023SJohn Marino 
366*e4b17023SJohn Marino         do
367*e4b17023SJohn Marino 	  {
368*e4b17023SJohn Marino 	    __carry.splice(__carry.begin(), *this, begin());
369*e4b17023SJohn Marino 
370*e4b17023SJohn Marino 	    for(__counter = &__tmp[0];
371*e4b17023SJohn Marino 		__counter != __fill && !__counter->empty();
372*e4b17023SJohn Marino 		++__counter)
373*e4b17023SJohn Marino 	      {
374*e4b17023SJohn Marino 		__counter->merge(__carry);
375*e4b17023SJohn Marino 		__carry.swap(*__counter);
376*e4b17023SJohn Marino 	      }
377*e4b17023SJohn Marino 	    __carry.swap(*__counter);
378*e4b17023SJohn Marino 	    if (__counter == __fill)
379*e4b17023SJohn Marino 	      ++__fill;
380*e4b17023SJohn Marino 	  }
381*e4b17023SJohn Marino 	while ( !empty() );
382*e4b17023SJohn Marino 
383*e4b17023SJohn Marino         for (__counter = &__tmp[1]; __counter != __fill; ++__counter)
384*e4b17023SJohn Marino           __counter->merge(*(__counter - 1));
385*e4b17023SJohn Marino         swap( *(__fill - 1) );
386*e4b17023SJohn Marino       }
387*e4b17023SJohn Marino     }
388*e4b17023SJohn Marino 
389*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
390*e4b17023SJohn Marino     template <typename _Predicate>
391*e4b17023SJohn Marino       void
392*e4b17023SJohn Marino       list<_Tp, _Alloc>::
remove_if(_Predicate __pred)393*e4b17023SJohn Marino       remove_if(_Predicate __pred)
394*e4b17023SJohn Marino       {
395*e4b17023SJohn Marino         iterator __first = begin();
396*e4b17023SJohn Marino         iterator __last = end();
397*e4b17023SJohn Marino         while (__first != __last)
398*e4b17023SJohn Marino 	  {
399*e4b17023SJohn Marino 	    iterator __next = __first;
400*e4b17023SJohn Marino 	    ++__next;
401*e4b17023SJohn Marino 	    if (__pred(*__first))
402*e4b17023SJohn Marino 	      _M_erase(__first);
403*e4b17023SJohn Marino 	    __first = __next;
404*e4b17023SJohn Marino 	  }
405*e4b17023SJohn Marino       }
406*e4b17023SJohn Marino 
407*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
408*e4b17023SJohn Marino     template <typename _BinaryPredicate>
409*e4b17023SJohn Marino       void
410*e4b17023SJohn Marino       list<_Tp, _Alloc>::
unique(_BinaryPredicate __binary_pred)411*e4b17023SJohn Marino       unique(_BinaryPredicate __binary_pred)
412*e4b17023SJohn Marino       {
413*e4b17023SJohn Marino         iterator __first = begin();
414*e4b17023SJohn Marino         iterator __last = end();
415*e4b17023SJohn Marino         if (__first == __last)
416*e4b17023SJohn Marino 	  return;
417*e4b17023SJohn Marino         iterator __next = __first;
418*e4b17023SJohn Marino         while (++__next != __last)
419*e4b17023SJohn Marino 	  {
420*e4b17023SJohn Marino 	    if (__binary_pred(*__first, *__next))
421*e4b17023SJohn Marino 	      _M_erase(__next);
422*e4b17023SJohn Marino 	    else
423*e4b17023SJohn Marino 	      __first = __next;
424*e4b17023SJohn Marino 	    __next = __first;
425*e4b17023SJohn Marino 	  }
426*e4b17023SJohn Marino       }
427*e4b17023SJohn Marino 
428*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
429*e4b17023SJohn Marino     template <typename _StrictWeakOrdering>
430*e4b17023SJohn Marino       void
431*e4b17023SJohn Marino       list<_Tp, _Alloc>::
sort(_StrictWeakOrdering __comp)432*e4b17023SJohn Marino       sort(_StrictWeakOrdering __comp)
433*e4b17023SJohn Marino       {
434*e4b17023SJohn Marino 	// Do nothing if the list has length 0 or 1.
435*e4b17023SJohn Marino 	if (this->_M_impl._M_node._M_next != &this->_M_impl._M_node
436*e4b17023SJohn Marino 	    && this->_M_impl._M_node._M_next->_M_next != &this->_M_impl._M_node)
437*e4b17023SJohn Marino 	  {
438*e4b17023SJohn Marino 	    list __carry;
439*e4b17023SJohn Marino 	    list __tmp[64];
440*e4b17023SJohn Marino 	    list * __fill = &__tmp[0];
441*e4b17023SJohn Marino 	    list * __counter;
442*e4b17023SJohn Marino 
443*e4b17023SJohn Marino 	    do
444*e4b17023SJohn Marino 	      {
445*e4b17023SJohn Marino 		__carry.splice(__carry.begin(), *this, begin());
446*e4b17023SJohn Marino 
447*e4b17023SJohn Marino 		for(__counter = &__tmp[0];
448*e4b17023SJohn Marino 		    __counter != __fill && !__counter->empty();
449*e4b17023SJohn Marino 		    ++__counter)
450*e4b17023SJohn Marino 		  {
451*e4b17023SJohn Marino 		    __counter->merge(__carry, __comp);
452*e4b17023SJohn Marino 		    __carry.swap(*__counter);
453*e4b17023SJohn Marino 		  }
454*e4b17023SJohn Marino 		__carry.swap(*__counter);
455*e4b17023SJohn Marino 		if (__counter == __fill)
456*e4b17023SJohn Marino 		  ++__fill;
457*e4b17023SJohn Marino 	      }
458*e4b17023SJohn Marino 	    while ( !empty() );
459*e4b17023SJohn Marino 
460*e4b17023SJohn Marino 	    for (__counter = &__tmp[1]; __counter != __fill; ++__counter)
461*e4b17023SJohn Marino 	      __counter->merge(*(__counter - 1), __comp);
462*e4b17023SJohn Marino 	    swap(*(__fill - 1));
463*e4b17023SJohn Marino 	  }
464*e4b17023SJohn Marino       }
465*e4b17023SJohn Marino 
466*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_CONTAINER
467*e4b17023SJohn Marino } // namespace std
468*e4b17023SJohn Marino 
469*e4b17023SJohn Marino #endif /* _LIST_TCC */
470*e4b17023SJohn Marino 
471