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