xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/bits/stl_list.h (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino // List implementation -*- 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/stl_list.h
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 _STL_LIST_H
58*e4b17023SJohn Marino #define _STL_LIST_H 1
59*e4b17023SJohn Marino 
60*e4b17023SJohn Marino #include <bits/concept_check.h>
61*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
62*e4b17023SJohn Marino #include <initializer_list>
63*e4b17023SJohn Marino #endif
64*e4b17023SJohn Marino 
_GLIBCXX_VISIBILITY(default)65*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default)
66*e4b17023SJohn Marino {
67*e4b17023SJohn Marino   namespace __detail
68*e4b17023SJohn Marino   {
69*e4b17023SJohn Marino   _GLIBCXX_BEGIN_NAMESPACE_VERSION
70*e4b17023SJohn Marino 
71*e4b17023SJohn Marino     // Supporting structures are split into common and templated
72*e4b17023SJohn Marino     // types; the latter publicly inherits from the former in an
73*e4b17023SJohn Marino     // effort to reduce code duplication.  This results in some
74*e4b17023SJohn Marino     // "needless" static_cast'ing later on, but it's all safe
75*e4b17023SJohn Marino     // downcasting.
76*e4b17023SJohn Marino 
77*e4b17023SJohn Marino     /// Common part of a node in the %list.
78*e4b17023SJohn Marino     struct _List_node_base
79*e4b17023SJohn Marino     {
80*e4b17023SJohn Marino       _List_node_base* _M_next;
81*e4b17023SJohn Marino       _List_node_base* _M_prev;
82*e4b17023SJohn Marino 
83*e4b17023SJohn Marino       static void
84*e4b17023SJohn Marino       swap(_List_node_base& __x, _List_node_base& __y) _GLIBCXX_USE_NOEXCEPT;
85*e4b17023SJohn Marino 
86*e4b17023SJohn Marino       void
87*e4b17023SJohn Marino       _M_transfer(_List_node_base* const __first,
88*e4b17023SJohn Marino 		  _List_node_base* const __last) _GLIBCXX_USE_NOEXCEPT;
89*e4b17023SJohn Marino 
90*e4b17023SJohn Marino       void
91*e4b17023SJohn Marino       _M_reverse() _GLIBCXX_USE_NOEXCEPT;
92*e4b17023SJohn Marino 
93*e4b17023SJohn Marino       void
94*e4b17023SJohn Marino       _M_hook(_List_node_base* const __position) _GLIBCXX_USE_NOEXCEPT;
95*e4b17023SJohn Marino 
96*e4b17023SJohn Marino       void
97*e4b17023SJohn Marino       _M_unhook() _GLIBCXX_USE_NOEXCEPT;
98*e4b17023SJohn Marino     };
99*e4b17023SJohn Marino 
100*e4b17023SJohn Marino   _GLIBCXX_END_NAMESPACE_VERSION
101*e4b17023SJohn Marino   } // namespace detail
102*e4b17023SJohn Marino 
103*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
104*e4b17023SJohn Marino 
105*e4b17023SJohn Marino   /// An actual node in the %list.
106*e4b17023SJohn Marino   template<typename _Tp>
107*e4b17023SJohn Marino     struct _List_node : public __detail::_List_node_base
108*e4b17023SJohn Marino     {
109*e4b17023SJohn Marino       ///< User's data.
110*e4b17023SJohn Marino       _Tp _M_data;
111*e4b17023SJohn Marino 
112*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
113*e4b17023SJohn Marino       template<typename... _Args>
114*e4b17023SJohn Marino         _List_node(_Args&&... __args)
115*e4b17023SJohn Marino 	: __detail::_List_node_base(), _M_data(std::forward<_Args>(__args)...)
116*e4b17023SJohn Marino         { }
117*e4b17023SJohn Marino #endif
118*e4b17023SJohn Marino     };
119*e4b17023SJohn Marino 
120*e4b17023SJohn Marino   /**
121*e4b17023SJohn Marino    *  @brief A list::iterator.
122*e4b17023SJohn Marino    *
123*e4b17023SJohn Marino    *  All the functions are op overloads.
124*e4b17023SJohn Marino   */
125*e4b17023SJohn Marino   template<typename _Tp>
126*e4b17023SJohn Marino     struct _List_iterator
127*e4b17023SJohn Marino     {
128*e4b17023SJohn Marino       typedef _List_iterator<_Tp>                _Self;
129*e4b17023SJohn Marino       typedef _List_node<_Tp>                    _Node;
130*e4b17023SJohn Marino 
131*e4b17023SJohn Marino       typedef ptrdiff_t                          difference_type;
132*e4b17023SJohn Marino       typedef std::bidirectional_iterator_tag    iterator_category;
133*e4b17023SJohn Marino       typedef _Tp                                value_type;
134*e4b17023SJohn Marino       typedef _Tp*                               pointer;
135*e4b17023SJohn Marino       typedef _Tp&                               reference;
136*e4b17023SJohn Marino 
137*e4b17023SJohn Marino       _List_iterator()
138*e4b17023SJohn Marino       : _M_node() { }
139*e4b17023SJohn Marino 
140*e4b17023SJohn Marino       explicit
141*e4b17023SJohn Marino       _List_iterator(__detail::_List_node_base* __x)
142*e4b17023SJohn Marino       : _M_node(__x) { }
143*e4b17023SJohn Marino 
144*e4b17023SJohn Marino       // Must downcast from _List_node_base to _List_node to get to _M_data.
145*e4b17023SJohn Marino       reference
146*e4b17023SJohn Marino       operator*() const
147*e4b17023SJohn Marino       { return static_cast<_Node*>(_M_node)->_M_data; }
148*e4b17023SJohn Marino 
149*e4b17023SJohn Marino       pointer
150*e4b17023SJohn Marino       operator->() const
151*e4b17023SJohn Marino       { return std::__addressof(static_cast<_Node*>(_M_node)->_M_data); }
152*e4b17023SJohn Marino 
153*e4b17023SJohn Marino       _Self&
154*e4b17023SJohn Marino       operator++()
155*e4b17023SJohn Marino       {
156*e4b17023SJohn Marino 	_M_node = _M_node->_M_next;
157*e4b17023SJohn Marino 	return *this;
158*e4b17023SJohn Marino       }
159*e4b17023SJohn Marino 
160*e4b17023SJohn Marino       _Self
161*e4b17023SJohn Marino       operator++(int)
162*e4b17023SJohn Marino       {
163*e4b17023SJohn Marino 	_Self __tmp = *this;
164*e4b17023SJohn Marino 	_M_node = _M_node->_M_next;
165*e4b17023SJohn Marino 	return __tmp;
166*e4b17023SJohn Marino       }
167*e4b17023SJohn Marino 
168*e4b17023SJohn Marino       _Self&
169*e4b17023SJohn Marino       operator--()
170*e4b17023SJohn Marino       {
171*e4b17023SJohn Marino 	_M_node = _M_node->_M_prev;
172*e4b17023SJohn Marino 	return *this;
173*e4b17023SJohn Marino       }
174*e4b17023SJohn Marino 
175*e4b17023SJohn Marino       _Self
176*e4b17023SJohn Marino       operator--(int)
177*e4b17023SJohn Marino       {
178*e4b17023SJohn Marino 	_Self __tmp = *this;
179*e4b17023SJohn Marino 	_M_node = _M_node->_M_prev;
180*e4b17023SJohn Marino 	return __tmp;
181*e4b17023SJohn Marino       }
182*e4b17023SJohn Marino 
183*e4b17023SJohn Marino       bool
184*e4b17023SJohn Marino       operator==(const _Self& __x) const
185*e4b17023SJohn Marino       { return _M_node == __x._M_node; }
186*e4b17023SJohn Marino 
187*e4b17023SJohn Marino       bool
188*e4b17023SJohn Marino       operator!=(const _Self& __x) const
189*e4b17023SJohn Marino       { return _M_node != __x._M_node; }
190*e4b17023SJohn Marino 
191*e4b17023SJohn Marino       // The only member points to the %list element.
192*e4b17023SJohn Marino       __detail::_List_node_base* _M_node;
193*e4b17023SJohn Marino     };
194*e4b17023SJohn Marino 
195*e4b17023SJohn Marino   /**
196*e4b17023SJohn Marino    *  @brief A list::const_iterator.
197*e4b17023SJohn Marino    *
198*e4b17023SJohn Marino    *  All the functions are op overloads.
199*e4b17023SJohn Marino   */
200*e4b17023SJohn Marino   template<typename _Tp>
201*e4b17023SJohn Marino     struct _List_const_iterator
202*e4b17023SJohn Marino     {
203*e4b17023SJohn Marino       typedef _List_const_iterator<_Tp>          _Self;
204*e4b17023SJohn Marino       typedef const _List_node<_Tp>              _Node;
205*e4b17023SJohn Marino       typedef _List_iterator<_Tp>                iterator;
206*e4b17023SJohn Marino 
207*e4b17023SJohn Marino       typedef ptrdiff_t                          difference_type;
208*e4b17023SJohn Marino       typedef std::bidirectional_iterator_tag    iterator_category;
209*e4b17023SJohn Marino       typedef _Tp                                value_type;
210*e4b17023SJohn Marino       typedef const _Tp*                         pointer;
211*e4b17023SJohn Marino       typedef const _Tp&                         reference;
212*e4b17023SJohn Marino 
213*e4b17023SJohn Marino       _List_const_iterator()
214*e4b17023SJohn Marino       : _M_node() { }
215*e4b17023SJohn Marino 
216*e4b17023SJohn Marino       explicit
217*e4b17023SJohn Marino       _List_const_iterator(const __detail::_List_node_base* __x)
218*e4b17023SJohn Marino       : _M_node(__x) { }
219*e4b17023SJohn Marino 
220*e4b17023SJohn Marino       _List_const_iterator(const iterator& __x)
221*e4b17023SJohn Marino       : _M_node(__x._M_node) { }
222*e4b17023SJohn Marino 
223*e4b17023SJohn Marino       // Must downcast from List_node_base to _List_node to get to
224*e4b17023SJohn Marino       // _M_data.
225*e4b17023SJohn Marino       reference
226*e4b17023SJohn Marino       operator*() const
227*e4b17023SJohn Marino       { return static_cast<_Node*>(_M_node)->_M_data; }
228*e4b17023SJohn Marino 
229*e4b17023SJohn Marino       pointer
230*e4b17023SJohn Marino       operator->() const
231*e4b17023SJohn Marino       { return std::__addressof(static_cast<_Node*>(_M_node)->_M_data); }
232*e4b17023SJohn Marino 
233*e4b17023SJohn Marino       _Self&
234*e4b17023SJohn Marino       operator++()
235*e4b17023SJohn Marino       {
236*e4b17023SJohn Marino 	_M_node = _M_node->_M_next;
237*e4b17023SJohn Marino 	return *this;
238*e4b17023SJohn Marino       }
239*e4b17023SJohn Marino 
240*e4b17023SJohn Marino       _Self
241*e4b17023SJohn Marino       operator++(int)
242*e4b17023SJohn Marino       {
243*e4b17023SJohn Marino 	_Self __tmp = *this;
244*e4b17023SJohn Marino 	_M_node = _M_node->_M_next;
245*e4b17023SJohn Marino 	return __tmp;
246*e4b17023SJohn Marino       }
247*e4b17023SJohn Marino 
248*e4b17023SJohn Marino       _Self&
249*e4b17023SJohn Marino       operator--()
250*e4b17023SJohn Marino       {
251*e4b17023SJohn Marino 	_M_node = _M_node->_M_prev;
252*e4b17023SJohn Marino 	return *this;
253*e4b17023SJohn Marino       }
254*e4b17023SJohn Marino 
255*e4b17023SJohn Marino       _Self
256*e4b17023SJohn Marino       operator--(int)
257*e4b17023SJohn Marino       {
258*e4b17023SJohn Marino 	_Self __tmp = *this;
259*e4b17023SJohn Marino 	_M_node = _M_node->_M_prev;
260*e4b17023SJohn Marino 	return __tmp;
261*e4b17023SJohn Marino       }
262*e4b17023SJohn Marino 
263*e4b17023SJohn Marino       bool
264*e4b17023SJohn Marino       operator==(const _Self& __x) const
265*e4b17023SJohn Marino       { return _M_node == __x._M_node; }
266*e4b17023SJohn Marino 
267*e4b17023SJohn Marino       bool
268*e4b17023SJohn Marino       operator!=(const _Self& __x) const
269*e4b17023SJohn Marino       { return _M_node != __x._M_node; }
270*e4b17023SJohn Marino 
271*e4b17023SJohn Marino       // The only member points to the %list element.
272*e4b17023SJohn Marino       const __detail::_List_node_base* _M_node;
273*e4b17023SJohn Marino     };
274*e4b17023SJohn Marino 
275*e4b17023SJohn Marino   template<typename _Val>
276*e4b17023SJohn Marino     inline bool
277*e4b17023SJohn Marino     operator==(const _List_iterator<_Val>& __x,
278*e4b17023SJohn Marino 	       const _List_const_iterator<_Val>& __y)
279*e4b17023SJohn Marino     { return __x._M_node == __y._M_node; }
280*e4b17023SJohn Marino 
281*e4b17023SJohn Marino   template<typename _Val>
282*e4b17023SJohn Marino     inline bool
283*e4b17023SJohn Marino     operator!=(const _List_iterator<_Val>& __x,
284*e4b17023SJohn Marino                const _List_const_iterator<_Val>& __y)
285*e4b17023SJohn Marino     { return __x._M_node != __y._M_node; }
286*e4b17023SJohn Marino 
287*e4b17023SJohn Marino 
288*e4b17023SJohn Marino   /// See bits/stl_deque.h's _Deque_base for an explanation.
289*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
290*e4b17023SJohn Marino     class _List_base
291*e4b17023SJohn Marino     {
292*e4b17023SJohn Marino     protected:
293*e4b17023SJohn Marino       // NOTA BENE
294*e4b17023SJohn Marino       // The stored instance is not actually of "allocator_type"'s
295*e4b17023SJohn Marino       // type.  Instead we rebind the type to
296*e4b17023SJohn Marino       // Allocator<List_node<Tp>>, which according to [20.1.5]/4
297*e4b17023SJohn Marino       // should probably be the same.  List_node<Tp> is not the same
298*e4b17023SJohn Marino       // size as Tp (it's two pointers larger), and specializations on
299*e4b17023SJohn Marino       // Tp may go unused because List_node<Tp> is being bound
300*e4b17023SJohn Marino       // instead.
301*e4b17023SJohn Marino       //
302*e4b17023SJohn Marino       // We put this to the test in the constructors and in
303*e4b17023SJohn Marino       // get_allocator, where we use conversions between
304*e4b17023SJohn Marino       // allocator_type and _Node_alloc_type. The conversion is
305*e4b17023SJohn Marino       // required by table 32 in [20.1.5].
306*e4b17023SJohn Marino       typedef typename _Alloc::template rebind<_List_node<_Tp> >::other
307*e4b17023SJohn Marino         _Node_alloc_type;
308*e4b17023SJohn Marino 
309*e4b17023SJohn Marino       typedef typename _Alloc::template rebind<_Tp>::other _Tp_alloc_type;
310*e4b17023SJohn Marino 
311*e4b17023SJohn Marino       struct _List_impl
312*e4b17023SJohn Marino       : public _Node_alloc_type
313*e4b17023SJohn Marino       {
314*e4b17023SJohn Marino 	__detail::_List_node_base _M_node;
315*e4b17023SJohn Marino 
316*e4b17023SJohn Marino 	_List_impl()
317*e4b17023SJohn Marino 	: _Node_alloc_type(), _M_node()
318*e4b17023SJohn Marino 	{ }
319*e4b17023SJohn Marino 
320*e4b17023SJohn Marino 	_List_impl(const _Node_alloc_type& __a)
321*e4b17023SJohn Marino 	: _Node_alloc_type(__a), _M_node()
322*e4b17023SJohn Marino 	{ }
323*e4b17023SJohn Marino 
324*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
325*e4b17023SJohn Marino 	_List_impl(_Node_alloc_type&& __a)
326*e4b17023SJohn Marino 	: _Node_alloc_type(std::move(__a)), _M_node()
327*e4b17023SJohn Marino 	{ }
328*e4b17023SJohn Marino #endif
329*e4b17023SJohn Marino       };
330*e4b17023SJohn Marino 
331*e4b17023SJohn Marino       _List_impl _M_impl;
332*e4b17023SJohn Marino 
333*e4b17023SJohn Marino       _List_node<_Tp>*
334*e4b17023SJohn Marino       _M_get_node()
335*e4b17023SJohn Marino       { return _M_impl._Node_alloc_type::allocate(1); }
336*e4b17023SJohn Marino 
337*e4b17023SJohn Marino       void
338*e4b17023SJohn Marino       _M_put_node(_List_node<_Tp>* __p)
339*e4b17023SJohn Marino       { _M_impl._Node_alloc_type::deallocate(__p, 1); }
340*e4b17023SJohn Marino 
341*e4b17023SJohn Marino   public:
342*e4b17023SJohn Marino       typedef _Alloc allocator_type;
343*e4b17023SJohn Marino 
344*e4b17023SJohn Marino       _Node_alloc_type&
345*e4b17023SJohn Marino       _M_get_Node_allocator() _GLIBCXX_NOEXCEPT
346*e4b17023SJohn Marino       { return *static_cast<_Node_alloc_type*>(&_M_impl); }
347*e4b17023SJohn Marino 
348*e4b17023SJohn Marino       const _Node_alloc_type&
349*e4b17023SJohn Marino       _M_get_Node_allocator() const _GLIBCXX_NOEXCEPT
350*e4b17023SJohn Marino       { return *static_cast<const _Node_alloc_type*>(&_M_impl); }
351*e4b17023SJohn Marino 
352*e4b17023SJohn Marino       _Tp_alloc_type
353*e4b17023SJohn Marino       _M_get_Tp_allocator() const _GLIBCXX_NOEXCEPT
354*e4b17023SJohn Marino       { return _Tp_alloc_type(_M_get_Node_allocator()); }
355*e4b17023SJohn Marino 
356*e4b17023SJohn Marino       allocator_type
357*e4b17023SJohn Marino       get_allocator() const _GLIBCXX_NOEXCEPT
358*e4b17023SJohn Marino       { return allocator_type(_M_get_Node_allocator()); }
359*e4b17023SJohn Marino 
360*e4b17023SJohn Marino       _List_base()
361*e4b17023SJohn Marino       : _M_impl()
362*e4b17023SJohn Marino       { _M_init(); }
363*e4b17023SJohn Marino 
364*e4b17023SJohn Marino       _List_base(const _Node_alloc_type& __a)
365*e4b17023SJohn Marino       : _M_impl(__a)
366*e4b17023SJohn Marino       { _M_init(); }
367*e4b17023SJohn Marino 
368*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
369*e4b17023SJohn Marino       _List_base(_List_base&& __x)
370*e4b17023SJohn Marino       : _M_impl(std::move(__x._M_get_Node_allocator()))
371*e4b17023SJohn Marino       {
372*e4b17023SJohn Marino 	_M_init();
373*e4b17023SJohn Marino 	__detail::_List_node_base::swap(_M_impl._M_node, __x._M_impl._M_node);
374*e4b17023SJohn Marino       }
375*e4b17023SJohn Marino #endif
376*e4b17023SJohn Marino 
377*e4b17023SJohn Marino       // This is what actually destroys the list.
378*e4b17023SJohn Marino       ~_List_base() _GLIBCXX_NOEXCEPT
379*e4b17023SJohn Marino       { _M_clear(); }
380*e4b17023SJohn Marino 
381*e4b17023SJohn Marino       void
382*e4b17023SJohn Marino       _M_clear();
383*e4b17023SJohn Marino 
384*e4b17023SJohn Marino       void
385*e4b17023SJohn Marino       _M_init()
386*e4b17023SJohn Marino       {
387*e4b17023SJohn Marino         this->_M_impl._M_node._M_next = &this->_M_impl._M_node;
388*e4b17023SJohn Marino         this->_M_impl._M_node._M_prev = &this->_M_impl._M_node;
389*e4b17023SJohn Marino       }
390*e4b17023SJohn Marino     };
391*e4b17023SJohn Marino 
392*e4b17023SJohn Marino   /**
393*e4b17023SJohn Marino    *  @brief A standard container with linear time access to elements,
394*e4b17023SJohn Marino    *  and fixed time insertion/deletion at any point in the sequence.
395*e4b17023SJohn Marino    *
396*e4b17023SJohn Marino    *  @ingroup sequences
397*e4b17023SJohn Marino    *
398*e4b17023SJohn Marino    *  Meets the requirements of a <a href="tables.html#65">container</a>, a
399*e4b17023SJohn Marino    *  <a href="tables.html#66">reversible container</a>, and a
400*e4b17023SJohn Marino    *  <a href="tables.html#67">sequence</a>, including the
401*e4b17023SJohn Marino    *  <a href="tables.html#68">optional sequence requirements</a> with the
402*e4b17023SJohn Marino    *  %exception of @c at and @c operator[].
403*e4b17023SJohn Marino    *
404*e4b17023SJohn Marino    *  This is a @e doubly @e linked %list.  Traversal up and down the
405*e4b17023SJohn Marino    *  %list requires linear time, but adding and removing elements (or
406*e4b17023SJohn Marino    *  @e nodes) is done in constant time, regardless of where the
407*e4b17023SJohn Marino    *  change takes place.  Unlike std::vector and std::deque,
408*e4b17023SJohn Marino    *  random-access iterators are not provided, so subscripting ( @c
409*e4b17023SJohn Marino    *  [] ) access is not allowed.  For algorithms which only need
410*e4b17023SJohn Marino    *  sequential access, this lack makes no difference.
411*e4b17023SJohn Marino    *
412*e4b17023SJohn Marino    *  Also unlike the other standard containers, std::list provides
413*e4b17023SJohn Marino    *  specialized algorithms %unique to linked lists, such as
414*e4b17023SJohn Marino    *  splicing, sorting, and in-place reversal.
415*e4b17023SJohn Marino    *
416*e4b17023SJohn Marino    *  A couple points on memory allocation for list<Tp>:
417*e4b17023SJohn Marino    *
418*e4b17023SJohn Marino    *  First, we never actually allocate a Tp, we allocate
419*e4b17023SJohn Marino    *  List_node<Tp>'s and trust [20.1.5]/4 to DTRT.  This is to ensure
420*e4b17023SJohn Marino    *  that after elements from %list<X,Alloc1> are spliced into
421*e4b17023SJohn Marino    *  %list<X,Alloc2>, destroying the memory of the second %list is a
422*e4b17023SJohn Marino    *  valid operation, i.e., Alloc1 giveth and Alloc2 taketh away.
423*e4b17023SJohn Marino    *
424*e4b17023SJohn Marino    *  Second, a %list conceptually represented as
425*e4b17023SJohn Marino    *  @code
426*e4b17023SJohn Marino    *    A <---> B <---> C <---> D
427*e4b17023SJohn Marino    *  @endcode
428*e4b17023SJohn Marino    *  is actually circular; a link exists between A and D.  The %list
429*e4b17023SJohn Marino    *  class holds (as its only data member) a private list::iterator
430*e4b17023SJohn Marino    *  pointing to @e D, not to @e A!  To get to the head of the %list,
431*e4b17023SJohn Marino    *  we start at the tail and move forward by one.  When this member
432*e4b17023SJohn Marino    *  iterator's next/previous pointers refer to itself, the %list is
433*e4b17023SJohn Marino    *  %empty.
434*e4b17023SJohn Marino   */
435*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
436*e4b17023SJohn Marino     class list : protected _List_base<_Tp, _Alloc>
437*e4b17023SJohn Marino     {
438*e4b17023SJohn Marino       // concept requirements
439*e4b17023SJohn Marino       typedef typename _Alloc::value_type                _Alloc_value_type;
440*e4b17023SJohn Marino       __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
441*e4b17023SJohn Marino       __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
442*e4b17023SJohn Marino 
443*e4b17023SJohn Marino       typedef _List_base<_Tp, _Alloc>                    _Base;
444*e4b17023SJohn Marino       typedef typename _Base::_Tp_alloc_type		 _Tp_alloc_type;
445*e4b17023SJohn Marino       typedef typename _Base::_Node_alloc_type		 _Node_alloc_type;
446*e4b17023SJohn Marino 
447*e4b17023SJohn Marino     public:
448*e4b17023SJohn Marino       typedef _Tp                                        value_type;
449*e4b17023SJohn Marino       typedef typename _Tp_alloc_type::pointer           pointer;
450*e4b17023SJohn Marino       typedef typename _Tp_alloc_type::const_pointer     const_pointer;
451*e4b17023SJohn Marino       typedef typename _Tp_alloc_type::reference         reference;
452*e4b17023SJohn Marino       typedef typename _Tp_alloc_type::const_reference   const_reference;
453*e4b17023SJohn Marino       typedef _List_iterator<_Tp>                        iterator;
454*e4b17023SJohn Marino       typedef _List_const_iterator<_Tp>                  const_iterator;
455*e4b17023SJohn Marino       typedef std::reverse_iterator<const_iterator>      const_reverse_iterator;
456*e4b17023SJohn Marino       typedef std::reverse_iterator<iterator>            reverse_iterator;
457*e4b17023SJohn Marino       typedef size_t                                     size_type;
458*e4b17023SJohn Marino       typedef ptrdiff_t                                  difference_type;
459*e4b17023SJohn Marino       typedef _Alloc                                     allocator_type;
460*e4b17023SJohn Marino 
461*e4b17023SJohn Marino     protected:
462*e4b17023SJohn Marino       // Note that pointers-to-_Node's can be ctor-converted to
463*e4b17023SJohn Marino       // iterator types.
464*e4b17023SJohn Marino       typedef _List_node<_Tp>				 _Node;
465*e4b17023SJohn Marino 
466*e4b17023SJohn Marino       using _Base::_M_impl;
467*e4b17023SJohn Marino       using _Base::_M_put_node;
468*e4b17023SJohn Marino       using _Base::_M_get_node;
469*e4b17023SJohn Marino       using _Base::_M_get_Tp_allocator;
470*e4b17023SJohn Marino       using _Base::_M_get_Node_allocator;
471*e4b17023SJohn Marino 
472*e4b17023SJohn Marino       /**
473*e4b17023SJohn Marino        *  @param  __args  An instance of user data.
474*e4b17023SJohn Marino        *
475*e4b17023SJohn Marino        *  Allocates space for a new node and constructs a copy of
476*e4b17023SJohn Marino        *  @a __args in it.
477*e4b17023SJohn Marino        */
478*e4b17023SJohn Marino #ifndef __GXX_EXPERIMENTAL_CXX0X__
479*e4b17023SJohn Marino       _Node*
480*e4b17023SJohn Marino       _M_create_node(const value_type& __x)
481*e4b17023SJohn Marino       {
482*e4b17023SJohn Marino 	_Node* __p = this->_M_get_node();
483*e4b17023SJohn Marino 	__try
484*e4b17023SJohn Marino 	  {
485*e4b17023SJohn Marino 	    _M_get_Tp_allocator().construct
486*e4b17023SJohn Marino 	      (std::__addressof(__p->_M_data), __x);
487*e4b17023SJohn Marino 	  }
488*e4b17023SJohn Marino 	__catch(...)
489*e4b17023SJohn Marino 	  {
490*e4b17023SJohn Marino 	    _M_put_node(__p);
491*e4b17023SJohn Marino 	    __throw_exception_again;
492*e4b17023SJohn Marino 	  }
493*e4b17023SJohn Marino 	return __p;
494*e4b17023SJohn Marino       }
495*e4b17023SJohn Marino #else
496*e4b17023SJohn Marino       template<typename... _Args>
497*e4b17023SJohn Marino         _Node*
498*e4b17023SJohn Marino         _M_create_node(_Args&&... __args)
499*e4b17023SJohn Marino 	{
500*e4b17023SJohn Marino 	  _Node* __p = this->_M_get_node();
501*e4b17023SJohn Marino 	  __try
502*e4b17023SJohn Marino 	    {
503*e4b17023SJohn Marino 	      _M_get_Node_allocator().construct(__p,
504*e4b17023SJohn Marino 						std::forward<_Args>(__args)...);
505*e4b17023SJohn Marino 	    }
506*e4b17023SJohn Marino 	  __catch(...)
507*e4b17023SJohn Marino 	    {
508*e4b17023SJohn Marino 	      _M_put_node(__p);
509*e4b17023SJohn Marino 	      __throw_exception_again;
510*e4b17023SJohn Marino 	    }
511*e4b17023SJohn Marino 	  return __p;
512*e4b17023SJohn Marino 	}
513*e4b17023SJohn Marino #endif
514*e4b17023SJohn Marino 
515*e4b17023SJohn Marino     public:
516*e4b17023SJohn Marino       // [23.2.2.1] construct/copy/destroy
517*e4b17023SJohn Marino       // (assign() and get_allocator() are also listed in this section)
518*e4b17023SJohn Marino       /**
519*e4b17023SJohn Marino        *  @brief  Default constructor creates no elements.
520*e4b17023SJohn Marino        */
521*e4b17023SJohn Marino       list()
522*e4b17023SJohn Marino       : _Base() { }
523*e4b17023SJohn Marino 
524*e4b17023SJohn Marino       /**
525*e4b17023SJohn Marino        *  @brief  Creates a %list with no elements.
526*e4b17023SJohn Marino        *  @param  __a  An allocator object.
527*e4b17023SJohn Marino        */
528*e4b17023SJohn Marino       explicit
529*e4b17023SJohn Marino       list(const allocator_type& __a)
530*e4b17023SJohn Marino       : _Base(_Node_alloc_type(__a)) { }
531*e4b17023SJohn Marino 
532*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
533*e4b17023SJohn Marino       /**
534*e4b17023SJohn Marino        *  @brief  Creates a %list with default constructed elements.
535*e4b17023SJohn Marino        *  @param  __n  The number of elements to initially create.
536*e4b17023SJohn Marino        *
537*e4b17023SJohn Marino        *  This constructor fills the %list with @a __n default
538*e4b17023SJohn Marino        *  constructed elements.
539*e4b17023SJohn Marino        */
540*e4b17023SJohn Marino       explicit
541*e4b17023SJohn Marino       list(size_type __n)
542*e4b17023SJohn Marino       : _Base()
543*e4b17023SJohn Marino       { _M_default_initialize(__n); }
544*e4b17023SJohn Marino 
545*e4b17023SJohn Marino       /**
546*e4b17023SJohn Marino        *  @brief  Creates a %list with copies of an exemplar element.
547*e4b17023SJohn Marino        *  @param  __n  The number of elements to initially create.
548*e4b17023SJohn Marino        *  @param  __value  An element to copy.
549*e4b17023SJohn Marino        *  @param  __a  An allocator object.
550*e4b17023SJohn Marino        *
551*e4b17023SJohn Marino        *  This constructor fills the %list with @a __n copies of @a __value.
552*e4b17023SJohn Marino        */
553*e4b17023SJohn Marino       list(size_type __n, const value_type& __value,
554*e4b17023SJohn Marino 	   const allocator_type& __a = allocator_type())
555*e4b17023SJohn Marino       : _Base(_Node_alloc_type(__a))
556*e4b17023SJohn Marino       { _M_fill_initialize(__n, __value); }
557*e4b17023SJohn Marino #else
558*e4b17023SJohn Marino       /**
559*e4b17023SJohn Marino        *  @brief  Creates a %list with copies of an exemplar element.
560*e4b17023SJohn Marino        *  @param  __n  The number of elements to initially create.
561*e4b17023SJohn Marino        *  @param  __value  An element to copy.
562*e4b17023SJohn Marino        *  @param  __a  An allocator object.
563*e4b17023SJohn Marino        *
564*e4b17023SJohn Marino        *  This constructor fills the %list with @a __n copies of @a __value.
565*e4b17023SJohn Marino        */
566*e4b17023SJohn Marino       explicit
567*e4b17023SJohn Marino       list(size_type __n, const value_type& __value = value_type(),
568*e4b17023SJohn Marino 	   const allocator_type& __a = allocator_type())
569*e4b17023SJohn Marino       : _Base(_Node_alloc_type(__a))
570*e4b17023SJohn Marino       { _M_fill_initialize(__n, __value); }
571*e4b17023SJohn Marino #endif
572*e4b17023SJohn Marino 
573*e4b17023SJohn Marino       /**
574*e4b17023SJohn Marino        *  @brief  %List copy constructor.
575*e4b17023SJohn Marino        *  @param  __x  A %list of identical element and allocator types.
576*e4b17023SJohn Marino        *
577*e4b17023SJohn Marino        *  The newly-created %list uses a copy of the allocation object used
578*e4b17023SJohn Marino        *  by @a __x.
579*e4b17023SJohn Marino        */
580*e4b17023SJohn Marino       list(const list& __x)
581*e4b17023SJohn Marino       : _Base(__x._M_get_Node_allocator())
582*e4b17023SJohn Marino       { _M_initialize_dispatch(__x.begin(), __x.end(), __false_type()); }
583*e4b17023SJohn Marino 
584*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
585*e4b17023SJohn Marino       /**
586*e4b17023SJohn Marino        *  @brief  %List move constructor.
587*e4b17023SJohn Marino        *  @param  __x  A %list of identical element and allocator types.
588*e4b17023SJohn Marino        *
589*e4b17023SJohn Marino        *  The newly-created %list contains the exact contents of @a __x.
590*e4b17023SJohn Marino        *  The contents of @a __x are a valid, but unspecified %list.
591*e4b17023SJohn Marino        */
592*e4b17023SJohn Marino       list(list&& __x) noexcept
593*e4b17023SJohn Marino       : _Base(std::move(__x)) { }
594*e4b17023SJohn Marino 
595*e4b17023SJohn Marino       /**
596*e4b17023SJohn Marino        *  @brief  Builds a %list from an initializer_list
597*e4b17023SJohn Marino        *  @param  __l  An initializer_list of value_type.
598*e4b17023SJohn Marino        *  @param  __a  An allocator object.
599*e4b17023SJohn Marino        *
600*e4b17023SJohn Marino        *  Create a %list consisting of copies of the elements in the
601*e4b17023SJohn Marino        *  initializer_list @a __l.  This is linear in __l.size().
602*e4b17023SJohn Marino        */
603*e4b17023SJohn Marino       list(initializer_list<value_type> __l,
604*e4b17023SJohn Marino            const allocator_type& __a = allocator_type())
605*e4b17023SJohn Marino       : _Base(_Node_alloc_type(__a))
606*e4b17023SJohn Marino       { _M_initialize_dispatch(__l.begin(), __l.end(), __false_type()); }
607*e4b17023SJohn Marino #endif
608*e4b17023SJohn Marino 
609*e4b17023SJohn Marino       /**
610*e4b17023SJohn Marino        *  @brief  Builds a %list from a range.
611*e4b17023SJohn Marino        *  @param  __first  An input iterator.
612*e4b17023SJohn Marino        *  @param  __last  An input iterator.
613*e4b17023SJohn Marino        *  @param  __a  An allocator object.
614*e4b17023SJohn Marino        *
615*e4b17023SJohn Marino        *  Create a %list consisting of copies of the elements from
616*e4b17023SJohn Marino        *  [@a __first,@a __last).  This is linear in N (where N is
617*e4b17023SJohn Marino        *  distance(@a __first,@a __last)).
618*e4b17023SJohn Marino        */
619*e4b17023SJohn Marino       template<typename _InputIterator>
620*e4b17023SJohn Marino         list(_InputIterator __first, _InputIterator __last,
621*e4b17023SJohn Marino 	     const allocator_type& __a = allocator_type())
622*e4b17023SJohn Marino 	: _Base(_Node_alloc_type(__a))
623*e4b17023SJohn Marino         {
624*e4b17023SJohn Marino 	  // Check whether it's an integral type.  If so, it's not an iterator.
625*e4b17023SJohn Marino 	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
626*e4b17023SJohn Marino 	  _M_initialize_dispatch(__first, __last, _Integral());
627*e4b17023SJohn Marino 	}
628*e4b17023SJohn Marino 
629*e4b17023SJohn Marino       /**
630*e4b17023SJohn Marino        *  No explicit dtor needed as the _Base dtor takes care of
631*e4b17023SJohn Marino        *  things.  The _Base dtor only erases the elements, and note
632*e4b17023SJohn Marino        *  that if the elements themselves are pointers, the pointed-to
633*e4b17023SJohn Marino        *  memory is not touched in any way.  Managing the pointer is
634*e4b17023SJohn Marino        *  the user's responsibility.
635*e4b17023SJohn Marino        */
636*e4b17023SJohn Marino 
637*e4b17023SJohn Marino       /**
638*e4b17023SJohn Marino        *  @brief  %List assignment operator.
639*e4b17023SJohn Marino        *  @param  __x  A %list of identical element and allocator types.
640*e4b17023SJohn Marino        *
641*e4b17023SJohn Marino        *  All the elements of @a __x are copied, but unlike the copy
642*e4b17023SJohn Marino        *  constructor, the allocator object is not copied.
643*e4b17023SJohn Marino        */
644*e4b17023SJohn Marino       list&
645*e4b17023SJohn Marino       operator=(const list& __x);
646*e4b17023SJohn Marino 
647*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
648*e4b17023SJohn Marino       /**
649*e4b17023SJohn Marino        *  @brief  %List move assignment operator.
650*e4b17023SJohn Marino        *  @param  __x  A %list of identical element and allocator types.
651*e4b17023SJohn Marino        *
652*e4b17023SJohn Marino        *  The contents of @a __x are moved into this %list (without copying).
653*e4b17023SJohn Marino        *  @a __x is a valid, but unspecified %list
654*e4b17023SJohn Marino        */
655*e4b17023SJohn Marino       list&
656*e4b17023SJohn Marino       operator=(list&& __x)
657*e4b17023SJohn Marino       {
658*e4b17023SJohn Marino 	// NB: DR 1204.
659*e4b17023SJohn Marino 	// NB: DR 675.
660*e4b17023SJohn Marino 	this->clear();
661*e4b17023SJohn Marino 	this->swap(__x);
662*e4b17023SJohn Marino 	return *this;
663*e4b17023SJohn Marino       }
664*e4b17023SJohn Marino 
665*e4b17023SJohn Marino       /**
666*e4b17023SJohn Marino        *  @brief  %List initializer list assignment operator.
667*e4b17023SJohn Marino        *  @param  __l  An initializer_list of value_type.
668*e4b17023SJohn Marino        *
669*e4b17023SJohn Marino        *  Replace the contents of the %list with copies of the elements
670*e4b17023SJohn Marino        *  in the initializer_list @a __l.  This is linear in l.size().
671*e4b17023SJohn Marino        */
672*e4b17023SJohn Marino       list&
673*e4b17023SJohn Marino       operator=(initializer_list<value_type> __l)
674*e4b17023SJohn Marino       {
675*e4b17023SJohn Marino 	this->assign(__l.begin(), __l.end());
676*e4b17023SJohn Marino 	return *this;
677*e4b17023SJohn Marino       }
678*e4b17023SJohn Marino #endif
679*e4b17023SJohn Marino 
680*e4b17023SJohn Marino       /**
681*e4b17023SJohn Marino        *  @brief  Assigns a given value to a %list.
682*e4b17023SJohn Marino        *  @param  __n  Number of elements to be assigned.
683*e4b17023SJohn Marino        *  @param  __val  Value to be assigned.
684*e4b17023SJohn Marino        *
685*e4b17023SJohn Marino        *  This function fills a %list with @a __n copies of the given
686*e4b17023SJohn Marino        *  value.  Note that the assignment completely changes the %list
687*e4b17023SJohn Marino        *  and that the resulting %list's size is the same as the number
688*e4b17023SJohn Marino        *  of elements assigned.  Old data may be lost.
689*e4b17023SJohn Marino        */
690*e4b17023SJohn Marino       void
691*e4b17023SJohn Marino       assign(size_type __n, const value_type& __val)
692*e4b17023SJohn Marino       { _M_fill_assign(__n, __val); }
693*e4b17023SJohn Marino 
694*e4b17023SJohn Marino       /**
695*e4b17023SJohn Marino        *  @brief  Assigns a range to a %list.
696*e4b17023SJohn Marino        *  @param  __first  An input iterator.
697*e4b17023SJohn Marino        *  @param  __last   An input iterator.
698*e4b17023SJohn Marino        *
699*e4b17023SJohn Marino        *  This function fills a %list with copies of the elements in the
700*e4b17023SJohn Marino        *  range [@a __first,@a __last).
701*e4b17023SJohn Marino        *
702*e4b17023SJohn Marino        *  Note that the assignment completely changes the %list and
703*e4b17023SJohn Marino        *  that the resulting %list's size is the same as the number of
704*e4b17023SJohn Marino        *  elements assigned.  Old data may be lost.
705*e4b17023SJohn Marino        */
706*e4b17023SJohn Marino       template<typename _InputIterator>
707*e4b17023SJohn Marino         void
708*e4b17023SJohn Marino         assign(_InputIterator __first, _InputIterator __last)
709*e4b17023SJohn Marino         {
710*e4b17023SJohn Marino 	  // Check whether it's an integral type.  If so, it's not an iterator.
711*e4b17023SJohn Marino 	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
712*e4b17023SJohn Marino 	  _M_assign_dispatch(__first, __last, _Integral());
713*e4b17023SJohn Marino 	}
714*e4b17023SJohn Marino 
715*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
716*e4b17023SJohn Marino       /**
717*e4b17023SJohn Marino        *  @brief  Assigns an initializer_list to a %list.
718*e4b17023SJohn Marino        *  @param  __l  An initializer_list of value_type.
719*e4b17023SJohn Marino        *
720*e4b17023SJohn Marino        *  Replace the contents of the %list with copies of the elements
721*e4b17023SJohn Marino        *  in the initializer_list @a __l.  This is linear in __l.size().
722*e4b17023SJohn Marino        */
723*e4b17023SJohn Marino       void
724*e4b17023SJohn Marino       assign(initializer_list<value_type> __l)
725*e4b17023SJohn Marino       { this->assign(__l.begin(), __l.end()); }
726*e4b17023SJohn Marino #endif
727*e4b17023SJohn Marino 
728*e4b17023SJohn Marino       /// Get a copy of the memory allocation object.
729*e4b17023SJohn Marino       allocator_type
730*e4b17023SJohn Marino       get_allocator() const _GLIBCXX_NOEXCEPT
731*e4b17023SJohn Marino       { return _Base::get_allocator(); }
732*e4b17023SJohn Marino 
733*e4b17023SJohn Marino       // iterators
734*e4b17023SJohn Marino       /**
735*e4b17023SJohn Marino        *  Returns a read/write iterator that points to the first element in the
736*e4b17023SJohn Marino        *  %list.  Iteration is done in ordinary element order.
737*e4b17023SJohn Marino        */
738*e4b17023SJohn Marino       iterator
739*e4b17023SJohn Marino       begin() _GLIBCXX_NOEXCEPT
740*e4b17023SJohn Marino       { return iterator(this->_M_impl._M_node._M_next); }
741*e4b17023SJohn Marino 
742*e4b17023SJohn Marino       /**
743*e4b17023SJohn Marino        *  Returns a read-only (constant) iterator that points to the
744*e4b17023SJohn Marino        *  first element in the %list.  Iteration is done in ordinary
745*e4b17023SJohn Marino        *  element order.
746*e4b17023SJohn Marino        */
747*e4b17023SJohn Marino       const_iterator
748*e4b17023SJohn Marino       begin() const _GLIBCXX_NOEXCEPT
749*e4b17023SJohn Marino       { return const_iterator(this->_M_impl._M_node._M_next); }
750*e4b17023SJohn Marino 
751*e4b17023SJohn Marino       /**
752*e4b17023SJohn Marino        *  Returns a read/write iterator that points one past the last
753*e4b17023SJohn Marino        *  element in the %list.  Iteration is done in ordinary element
754*e4b17023SJohn Marino        *  order.
755*e4b17023SJohn Marino        */
756*e4b17023SJohn Marino       iterator
757*e4b17023SJohn Marino       end() _GLIBCXX_NOEXCEPT
758*e4b17023SJohn Marino       { return iterator(&this->_M_impl._M_node); }
759*e4b17023SJohn Marino 
760*e4b17023SJohn Marino       /**
761*e4b17023SJohn Marino        *  Returns a read-only (constant) iterator that points one past
762*e4b17023SJohn Marino        *  the last element in the %list.  Iteration is done in ordinary
763*e4b17023SJohn Marino        *  element order.
764*e4b17023SJohn Marino        */
765*e4b17023SJohn Marino       const_iterator
766*e4b17023SJohn Marino       end() const _GLIBCXX_NOEXCEPT
767*e4b17023SJohn Marino       { return const_iterator(&this->_M_impl._M_node); }
768*e4b17023SJohn Marino 
769*e4b17023SJohn Marino       /**
770*e4b17023SJohn Marino        *  Returns a read/write reverse iterator that points to the last
771*e4b17023SJohn Marino        *  element in the %list.  Iteration is done in reverse element
772*e4b17023SJohn Marino        *  order.
773*e4b17023SJohn Marino        */
774*e4b17023SJohn Marino       reverse_iterator
775*e4b17023SJohn Marino       rbegin() _GLIBCXX_NOEXCEPT
776*e4b17023SJohn Marino       { return reverse_iterator(end()); }
777*e4b17023SJohn Marino 
778*e4b17023SJohn Marino       /**
779*e4b17023SJohn Marino        *  Returns a read-only (constant) reverse iterator that points to
780*e4b17023SJohn Marino        *  the last element in the %list.  Iteration is done in reverse
781*e4b17023SJohn Marino        *  element order.
782*e4b17023SJohn Marino        */
783*e4b17023SJohn Marino       const_reverse_iterator
784*e4b17023SJohn Marino       rbegin() const _GLIBCXX_NOEXCEPT
785*e4b17023SJohn Marino       { return const_reverse_iterator(end()); }
786*e4b17023SJohn Marino 
787*e4b17023SJohn Marino       /**
788*e4b17023SJohn Marino        *  Returns a read/write reverse iterator that points to one
789*e4b17023SJohn Marino        *  before the first element in the %list.  Iteration is done in
790*e4b17023SJohn Marino        *  reverse element order.
791*e4b17023SJohn Marino        */
792*e4b17023SJohn Marino       reverse_iterator
793*e4b17023SJohn Marino       rend() _GLIBCXX_NOEXCEPT
794*e4b17023SJohn Marino       { return reverse_iterator(begin()); }
795*e4b17023SJohn Marino 
796*e4b17023SJohn Marino       /**
797*e4b17023SJohn Marino        *  Returns a read-only (constant) reverse iterator that points to one
798*e4b17023SJohn Marino        *  before the first element in the %list.  Iteration is done in reverse
799*e4b17023SJohn Marino        *  element order.
800*e4b17023SJohn Marino        */
801*e4b17023SJohn Marino       const_reverse_iterator
802*e4b17023SJohn Marino       rend() const _GLIBCXX_NOEXCEPT
803*e4b17023SJohn Marino       { return const_reverse_iterator(begin()); }
804*e4b17023SJohn Marino 
805*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
806*e4b17023SJohn Marino       /**
807*e4b17023SJohn Marino        *  Returns a read-only (constant) iterator that points to the
808*e4b17023SJohn Marino        *  first element in the %list.  Iteration is done in ordinary
809*e4b17023SJohn Marino        *  element order.
810*e4b17023SJohn Marino        */
811*e4b17023SJohn Marino       const_iterator
812*e4b17023SJohn Marino       cbegin() const noexcept
813*e4b17023SJohn Marino       { return const_iterator(this->_M_impl._M_node._M_next); }
814*e4b17023SJohn Marino 
815*e4b17023SJohn Marino       /**
816*e4b17023SJohn Marino        *  Returns a read-only (constant) iterator that points one past
817*e4b17023SJohn Marino        *  the last element in the %list.  Iteration is done in ordinary
818*e4b17023SJohn Marino        *  element order.
819*e4b17023SJohn Marino        */
820*e4b17023SJohn Marino       const_iterator
821*e4b17023SJohn Marino       cend() const noexcept
822*e4b17023SJohn Marino       { return const_iterator(&this->_M_impl._M_node); }
823*e4b17023SJohn Marino 
824*e4b17023SJohn Marino       /**
825*e4b17023SJohn Marino        *  Returns a read-only (constant) reverse iterator that points to
826*e4b17023SJohn Marino        *  the last element in the %list.  Iteration is done in reverse
827*e4b17023SJohn Marino        *  element order.
828*e4b17023SJohn Marino        */
829*e4b17023SJohn Marino       const_reverse_iterator
830*e4b17023SJohn Marino       crbegin() const noexcept
831*e4b17023SJohn Marino       { return const_reverse_iterator(end()); }
832*e4b17023SJohn Marino 
833*e4b17023SJohn Marino       /**
834*e4b17023SJohn Marino        *  Returns a read-only (constant) reverse iterator that points to one
835*e4b17023SJohn Marino        *  before the first element in the %list.  Iteration is done in reverse
836*e4b17023SJohn Marino        *  element order.
837*e4b17023SJohn Marino        */
838*e4b17023SJohn Marino       const_reverse_iterator
839*e4b17023SJohn Marino       crend() const noexcept
840*e4b17023SJohn Marino       { return const_reverse_iterator(begin()); }
841*e4b17023SJohn Marino #endif
842*e4b17023SJohn Marino 
843*e4b17023SJohn Marino       // [23.2.2.2] capacity
844*e4b17023SJohn Marino       /**
845*e4b17023SJohn Marino        *  Returns true if the %list is empty.  (Thus begin() would equal
846*e4b17023SJohn Marino        *  end().)
847*e4b17023SJohn Marino        */
848*e4b17023SJohn Marino       bool
849*e4b17023SJohn Marino       empty() const _GLIBCXX_NOEXCEPT
850*e4b17023SJohn Marino       { return this->_M_impl._M_node._M_next == &this->_M_impl._M_node; }
851*e4b17023SJohn Marino 
852*e4b17023SJohn Marino       /**  Returns the number of elements in the %list.  */
853*e4b17023SJohn Marino       size_type
854*e4b17023SJohn Marino       size() const _GLIBCXX_NOEXCEPT
855*e4b17023SJohn Marino       { return std::distance(begin(), end()); }
856*e4b17023SJohn Marino 
857*e4b17023SJohn Marino       /**  Returns the size() of the largest possible %list.  */
858*e4b17023SJohn Marino       size_type
859*e4b17023SJohn Marino       max_size() const _GLIBCXX_NOEXCEPT
860*e4b17023SJohn Marino       { return _M_get_Node_allocator().max_size(); }
861*e4b17023SJohn Marino 
862*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
863*e4b17023SJohn Marino       /**
864*e4b17023SJohn Marino        *  @brief Resizes the %list to the specified number of elements.
865*e4b17023SJohn Marino        *  @param __new_size Number of elements the %list should contain.
866*e4b17023SJohn Marino        *
867*e4b17023SJohn Marino        *  This function will %resize the %list to the specified number
868*e4b17023SJohn Marino        *  of elements.  If the number is smaller than the %list's
869*e4b17023SJohn Marino        *  current size the %list is truncated, otherwise default
870*e4b17023SJohn Marino        *  constructed elements are appended.
871*e4b17023SJohn Marino        */
872*e4b17023SJohn Marino       void
873*e4b17023SJohn Marino       resize(size_type __new_size);
874*e4b17023SJohn Marino 
875*e4b17023SJohn Marino       /**
876*e4b17023SJohn Marino        *  @brief Resizes the %list to the specified number of elements.
877*e4b17023SJohn Marino        *  @param __new_size Number of elements the %list should contain.
878*e4b17023SJohn Marino        *  @param __x Data with which new elements should be populated.
879*e4b17023SJohn Marino        *
880*e4b17023SJohn Marino        *  This function will %resize the %list to the specified number
881*e4b17023SJohn Marino        *  of elements.  If the number is smaller than the %list's
882*e4b17023SJohn Marino        *  current size the %list is truncated, otherwise the %list is
883*e4b17023SJohn Marino        *  extended and new elements are populated with given data.
884*e4b17023SJohn Marino        */
885*e4b17023SJohn Marino       void
886*e4b17023SJohn Marino       resize(size_type __new_size, const value_type& __x);
887*e4b17023SJohn Marino #else
888*e4b17023SJohn Marino       /**
889*e4b17023SJohn Marino        *  @brief Resizes the %list to the specified number of elements.
890*e4b17023SJohn Marino        *  @param __new_size Number of elements the %list should contain.
891*e4b17023SJohn Marino        *  @param __x Data with which new elements should be populated.
892*e4b17023SJohn Marino        *
893*e4b17023SJohn Marino        *  This function will %resize the %list to the specified number
894*e4b17023SJohn Marino        *  of elements.  If the number is smaller than the %list's
895*e4b17023SJohn Marino        *  current size the %list is truncated, otherwise the %list is
896*e4b17023SJohn Marino        *  extended and new elements are populated with given data.
897*e4b17023SJohn Marino        */
898*e4b17023SJohn Marino       void
899*e4b17023SJohn Marino       resize(size_type __new_size, value_type __x = value_type());
900*e4b17023SJohn Marino #endif
901*e4b17023SJohn Marino 
902*e4b17023SJohn Marino       // element access
903*e4b17023SJohn Marino       /**
904*e4b17023SJohn Marino        *  Returns a read/write reference to the data at the first
905*e4b17023SJohn Marino        *  element of the %list.
906*e4b17023SJohn Marino        */
907*e4b17023SJohn Marino       reference
908*e4b17023SJohn Marino       front()
909*e4b17023SJohn Marino       { return *begin(); }
910*e4b17023SJohn Marino 
911*e4b17023SJohn Marino       /**
912*e4b17023SJohn Marino        *  Returns a read-only (constant) reference to the data at the first
913*e4b17023SJohn Marino        *  element of the %list.
914*e4b17023SJohn Marino        */
915*e4b17023SJohn Marino       const_reference
916*e4b17023SJohn Marino       front() const
917*e4b17023SJohn Marino       { return *begin(); }
918*e4b17023SJohn Marino 
919*e4b17023SJohn Marino       /**
920*e4b17023SJohn Marino        *  Returns a read/write reference to the data at the last element
921*e4b17023SJohn Marino        *  of the %list.
922*e4b17023SJohn Marino        */
923*e4b17023SJohn Marino       reference
924*e4b17023SJohn Marino       back()
925*e4b17023SJohn Marino       {
926*e4b17023SJohn Marino 	iterator __tmp = end();
927*e4b17023SJohn Marino 	--__tmp;
928*e4b17023SJohn Marino 	return *__tmp;
929*e4b17023SJohn Marino       }
930*e4b17023SJohn Marino 
931*e4b17023SJohn Marino       /**
932*e4b17023SJohn Marino        *  Returns a read-only (constant) reference to the data at the last
933*e4b17023SJohn Marino        *  element of the %list.
934*e4b17023SJohn Marino        */
935*e4b17023SJohn Marino       const_reference
936*e4b17023SJohn Marino       back() const
937*e4b17023SJohn Marino       {
938*e4b17023SJohn Marino 	const_iterator __tmp = end();
939*e4b17023SJohn Marino 	--__tmp;
940*e4b17023SJohn Marino 	return *__tmp;
941*e4b17023SJohn Marino       }
942*e4b17023SJohn Marino 
943*e4b17023SJohn Marino       // [23.2.2.3] modifiers
944*e4b17023SJohn Marino       /**
945*e4b17023SJohn Marino        *  @brief  Add data to the front of the %list.
946*e4b17023SJohn Marino        *  @param  __x  Data to be added.
947*e4b17023SJohn Marino        *
948*e4b17023SJohn Marino        *  This is a typical stack operation.  The function creates an
949*e4b17023SJohn Marino        *  element at the front of the %list and assigns the given data
950*e4b17023SJohn Marino        *  to it.  Due to the nature of a %list this operation can be
951*e4b17023SJohn Marino        *  done in constant time, and does not invalidate iterators and
952*e4b17023SJohn Marino        *  references.
953*e4b17023SJohn Marino        */
954*e4b17023SJohn Marino       void
955*e4b17023SJohn Marino       push_front(const value_type& __x)
956*e4b17023SJohn Marino       { this->_M_insert(begin(), __x); }
957*e4b17023SJohn Marino 
958*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
959*e4b17023SJohn Marino       void
960*e4b17023SJohn Marino       push_front(value_type&& __x)
961*e4b17023SJohn Marino       { this->_M_insert(begin(), std::move(__x)); }
962*e4b17023SJohn Marino 
963*e4b17023SJohn Marino       template<typename... _Args>
964*e4b17023SJohn Marino         void
965*e4b17023SJohn Marino         emplace_front(_Args&&... __args)
966*e4b17023SJohn Marino         { this->_M_insert(begin(), std::forward<_Args>(__args)...); }
967*e4b17023SJohn Marino #endif
968*e4b17023SJohn Marino 
969*e4b17023SJohn Marino       /**
970*e4b17023SJohn Marino        *  @brief  Removes first element.
971*e4b17023SJohn Marino        *
972*e4b17023SJohn Marino        *  This is a typical stack operation.  It shrinks the %list by
973*e4b17023SJohn Marino        *  one.  Due to the nature of a %list this operation can be done
974*e4b17023SJohn Marino        *  in constant time, and only invalidates iterators/references to
975*e4b17023SJohn Marino        *  the element being removed.
976*e4b17023SJohn Marino        *
977*e4b17023SJohn Marino        *  Note that no data is returned, and if the first element's data
978*e4b17023SJohn Marino        *  is needed, it should be retrieved before pop_front() is
979*e4b17023SJohn Marino        *  called.
980*e4b17023SJohn Marino        */
981*e4b17023SJohn Marino       void
982*e4b17023SJohn Marino       pop_front()
983*e4b17023SJohn Marino       { this->_M_erase(begin()); }
984*e4b17023SJohn Marino 
985*e4b17023SJohn Marino       /**
986*e4b17023SJohn Marino        *  @brief  Add data to the end of the %list.
987*e4b17023SJohn Marino        *  @param  __x  Data to be added.
988*e4b17023SJohn Marino        *
989*e4b17023SJohn Marino        *  This is a typical stack operation.  The function creates an
990*e4b17023SJohn Marino        *  element at the end of the %list and assigns the given data to
991*e4b17023SJohn Marino        *  it.  Due to the nature of a %list this operation can be done
992*e4b17023SJohn Marino        *  in constant time, and does not invalidate iterators and
993*e4b17023SJohn Marino        *  references.
994*e4b17023SJohn Marino        */
995*e4b17023SJohn Marino       void
996*e4b17023SJohn Marino       push_back(const value_type& __x)
997*e4b17023SJohn Marino       { this->_M_insert(end(), __x); }
998*e4b17023SJohn Marino 
999*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
1000*e4b17023SJohn Marino       void
1001*e4b17023SJohn Marino       push_back(value_type&& __x)
1002*e4b17023SJohn Marino       { this->_M_insert(end(), std::move(__x)); }
1003*e4b17023SJohn Marino 
1004*e4b17023SJohn Marino       template<typename... _Args>
1005*e4b17023SJohn Marino         void
1006*e4b17023SJohn Marino         emplace_back(_Args&&... __args)
1007*e4b17023SJohn Marino         { this->_M_insert(end(), std::forward<_Args>(__args)...); }
1008*e4b17023SJohn Marino #endif
1009*e4b17023SJohn Marino 
1010*e4b17023SJohn Marino       /**
1011*e4b17023SJohn Marino        *  @brief  Removes last element.
1012*e4b17023SJohn Marino        *
1013*e4b17023SJohn Marino        *  This is a typical stack operation.  It shrinks the %list by
1014*e4b17023SJohn Marino        *  one.  Due to the nature of a %list this operation can be done
1015*e4b17023SJohn Marino        *  in constant time, and only invalidates iterators/references to
1016*e4b17023SJohn Marino        *  the element being removed.
1017*e4b17023SJohn Marino        *
1018*e4b17023SJohn Marino        *  Note that no data is returned, and if the last element's data
1019*e4b17023SJohn Marino        *  is needed, it should be retrieved before pop_back() is called.
1020*e4b17023SJohn Marino        */
1021*e4b17023SJohn Marino       void
1022*e4b17023SJohn Marino       pop_back()
1023*e4b17023SJohn Marino       { this->_M_erase(iterator(this->_M_impl._M_node._M_prev)); }
1024*e4b17023SJohn Marino 
1025*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
1026*e4b17023SJohn Marino       /**
1027*e4b17023SJohn Marino        *  @brief  Constructs object in %list before specified iterator.
1028*e4b17023SJohn Marino        *  @param  __position  A const_iterator into the %list.
1029*e4b17023SJohn Marino        *  @param  __args  Arguments.
1030*e4b17023SJohn Marino        *  @return  An iterator that points to the inserted data.
1031*e4b17023SJohn Marino        *
1032*e4b17023SJohn Marino        *  This function will insert an object of type T constructed
1033*e4b17023SJohn Marino        *  with T(std::forward<Args>(args)...) before the specified
1034*e4b17023SJohn Marino        *  location.  Due to the nature of a %list this operation can
1035*e4b17023SJohn Marino        *  be done in constant time, and does not invalidate iterators
1036*e4b17023SJohn Marino        *  and references.
1037*e4b17023SJohn Marino        */
1038*e4b17023SJohn Marino       template<typename... _Args>
1039*e4b17023SJohn Marino         iterator
1040*e4b17023SJohn Marino         emplace(iterator __position, _Args&&... __args);
1041*e4b17023SJohn Marino #endif
1042*e4b17023SJohn Marino 
1043*e4b17023SJohn Marino       /**
1044*e4b17023SJohn Marino        *  @brief  Inserts given value into %list before specified iterator.
1045*e4b17023SJohn Marino        *  @param  __position  An iterator into the %list.
1046*e4b17023SJohn Marino        *  @param  __x  Data to be inserted.
1047*e4b17023SJohn Marino        *  @return  An iterator that points to the inserted data.
1048*e4b17023SJohn Marino        *
1049*e4b17023SJohn Marino        *  This function will insert a copy of the given value before
1050*e4b17023SJohn Marino        *  the specified location.  Due to the nature of a %list this
1051*e4b17023SJohn Marino        *  operation can be done in constant time, and does not
1052*e4b17023SJohn Marino        *  invalidate iterators and references.
1053*e4b17023SJohn Marino        */
1054*e4b17023SJohn Marino       iterator
1055*e4b17023SJohn Marino       insert(iterator __position, const value_type& __x);
1056*e4b17023SJohn Marino 
1057*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
1058*e4b17023SJohn Marino       /**
1059*e4b17023SJohn Marino        *  @brief  Inserts given rvalue into %list before specified iterator.
1060*e4b17023SJohn Marino        *  @param  __position  An iterator into the %list.
1061*e4b17023SJohn Marino        *  @param  __x  Data to be inserted.
1062*e4b17023SJohn Marino        *  @return  An iterator that points to the inserted data.
1063*e4b17023SJohn Marino        *
1064*e4b17023SJohn Marino        *  This function will insert a copy of the given rvalue before
1065*e4b17023SJohn Marino        *  the specified location.  Due to the nature of a %list this
1066*e4b17023SJohn Marino        *  operation can be done in constant time, and does not
1067*e4b17023SJohn Marino        *  invalidate iterators and references.
1068*e4b17023SJohn Marino         */
1069*e4b17023SJohn Marino       iterator
1070*e4b17023SJohn Marino       insert(iterator __position, value_type&& __x)
1071*e4b17023SJohn Marino       { return emplace(__position, std::move(__x)); }
1072*e4b17023SJohn Marino 
1073*e4b17023SJohn Marino       /**
1074*e4b17023SJohn Marino        *  @brief  Inserts the contents of an initializer_list into %list
1075*e4b17023SJohn Marino        *          before specified iterator.
1076*e4b17023SJohn Marino        *  @param  __p  An iterator into the %list.
1077*e4b17023SJohn Marino        *  @param  __l  An initializer_list of value_type.
1078*e4b17023SJohn Marino        *
1079*e4b17023SJohn Marino        *  This function will insert copies of the data in the
1080*e4b17023SJohn Marino        *  initializer_list @a l into the %list before the location
1081*e4b17023SJohn Marino        *  specified by @a p.
1082*e4b17023SJohn Marino        *
1083*e4b17023SJohn Marino        *  This operation is linear in the number of elements inserted and
1084*e4b17023SJohn Marino        *  does not invalidate iterators and references.
1085*e4b17023SJohn Marino        */
1086*e4b17023SJohn Marino       void
1087*e4b17023SJohn Marino       insert(iterator __p, initializer_list<value_type> __l)
1088*e4b17023SJohn Marino       { this->insert(__p, __l.begin(), __l.end()); }
1089*e4b17023SJohn Marino #endif
1090*e4b17023SJohn Marino 
1091*e4b17023SJohn Marino       /**
1092*e4b17023SJohn Marino        *  @brief  Inserts a number of copies of given data into the %list.
1093*e4b17023SJohn Marino        *  @param  __position  An iterator into the %list.
1094*e4b17023SJohn Marino        *  @param  __n  Number of elements to be inserted.
1095*e4b17023SJohn Marino        *  @param  __x  Data to be inserted.
1096*e4b17023SJohn Marino        *
1097*e4b17023SJohn Marino        *  This function will insert a specified number of copies of the
1098*e4b17023SJohn Marino        *  given data before the location specified by @a position.
1099*e4b17023SJohn Marino        *
1100*e4b17023SJohn Marino        *  This operation is linear in the number of elements inserted and
1101*e4b17023SJohn Marino        *  does not invalidate iterators and references.
1102*e4b17023SJohn Marino        */
1103*e4b17023SJohn Marino       void
1104*e4b17023SJohn Marino       insert(iterator __position, size_type __n, const value_type& __x)
1105*e4b17023SJohn Marino       {
1106*e4b17023SJohn Marino 	list __tmp(__n, __x, get_allocator());
1107*e4b17023SJohn Marino 	splice(__position, __tmp);
1108*e4b17023SJohn Marino       }
1109*e4b17023SJohn Marino 
1110*e4b17023SJohn Marino       /**
1111*e4b17023SJohn Marino        *  @brief  Inserts a range into the %list.
1112*e4b17023SJohn Marino        *  @param  __position  An iterator into the %list.
1113*e4b17023SJohn Marino        *  @param  __first  An input iterator.
1114*e4b17023SJohn Marino        *  @param  __last   An input iterator.
1115*e4b17023SJohn Marino        *
1116*e4b17023SJohn Marino        *  This function will insert copies of the data in the range [@a
1117*e4b17023SJohn Marino        *  first,@a last) into the %list before the location specified by
1118*e4b17023SJohn Marino        *  @a position.
1119*e4b17023SJohn Marino        *
1120*e4b17023SJohn Marino        *  This operation is linear in the number of elements inserted and
1121*e4b17023SJohn Marino        *  does not invalidate iterators and references.
1122*e4b17023SJohn Marino        */
1123*e4b17023SJohn Marino       template<typename _InputIterator>
1124*e4b17023SJohn Marino         void
1125*e4b17023SJohn Marino         insert(iterator __position, _InputIterator __first,
1126*e4b17023SJohn Marino 	       _InputIterator __last)
1127*e4b17023SJohn Marino         {
1128*e4b17023SJohn Marino 	  list __tmp(__first, __last, get_allocator());
1129*e4b17023SJohn Marino 	  splice(__position, __tmp);
1130*e4b17023SJohn Marino 	}
1131*e4b17023SJohn Marino 
1132*e4b17023SJohn Marino       /**
1133*e4b17023SJohn Marino        *  @brief  Remove element at given position.
1134*e4b17023SJohn Marino        *  @param  __position  Iterator pointing to element to be erased.
1135*e4b17023SJohn Marino        *  @return  An iterator pointing to the next element (or end()).
1136*e4b17023SJohn Marino        *
1137*e4b17023SJohn Marino        *  This function will erase the element at the given position and thus
1138*e4b17023SJohn Marino        *  shorten the %list by one.
1139*e4b17023SJohn Marino        *
1140*e4b17023SJohn Marino        *  Due to the nature of a %list this operation can be done in
1141*e4b17023SJohn Marino        *  constant time, and only invalidates iterators/references to
1142*e4b17023SJohn Marino        *  the element being removed.  The user is also cautioned that
1143*e4b17023SJohn Marino        *  this function only erases the element, and that if the element
1144*e4b17023SJohn Marino        *  is itself a pointer, the pointed-to memory is not touched in
1145*e4b17023SJohn Marino        *  any way.  Managing the pointer is the user's responsibility.
1146*e4b17023SJohn Marino        */
1147*e4b17023SJohn Marino       iterator
1148*e4b17023SJohn Marino       erase(iterator __position);
1149*e4b17023SJohn Marino 
1150*e4b17023SJohn Marino       /**
1151*e4b17023SJohn Marino        *  @brief  Remove a range of elements.
1152*e4b17023SJohn Marino        *  @param  __first  Iterator pointing to the first element to be erased.
1153*e4b17023SJohn Marino        *  @param  __last  Iterator pointing to one past the last element to be
1154*e4b17023SJohn Marino        *                erased.
1155*e4b17023SJohn Marino        *  @return  An iterator pointing to the element pointed to by @a last
1156*e4b17023SJohn Marino        *           prior to erasing (or end()).
1157*e4b17023SJohn Marino        *
1158*e4b17023SJohn Marino        *  This function will erase the elements in the range @a
1159*e4b17023SJohn Marino        *  [first,last) and shorten the %list accordingly.
1160*e4b17023SJohn Marino        *
1161*e4b17023SJohn Marino        *  This operation is linear time in the size of the range and only
1162*e4b17023SJohn Marino        *  invalidates iterators/references to the element being removed.
1163*e4b17023SJohn Marino        *  The user is also cautioned that this function only erases the
1164*e4b17023SJohn Marino        *  elements, and that if the elements themselves are pointers, the
1165*e4b17023SJohn Marino        *  pointed-to memory is not touched in any way.  Managing the pointer
1166*e4b17023SJohn Marino        *  is the user's responsibility.
1167*e4b17023SJohn Marino        */
1168*e4b17023SJohn Marino       iterator
1169*e4b17023SJohn Marino       erase(iterator __first, iterator __last)
1170*e4b17023SJohn Marino       {
1171*e4b17023SJohn Marino 	while (__first != __last)
1172*e4b17023SJohn Marino 	  __first = erase(__first);
1173*e4b17023SJohn Marino 	return __last;
1174*e4b17023SJohn Marino       }
1175*e4b17023SJohn Marino 
1176*e4b17023SJohn Marino       /**
1177*e4b17023SJohn Marino        *  @brief  Swaps data with another %list.
1178*e4b17023SJohn Marino        *  @param  __x  A %list of the same element and allocator types.
1179*e4b17023SJohn Marino        *
1180*e4b17023SJohn Marino        *  This exchanges the elements between two lists in constant
1181*e4b17023SJohn Marino        *  time.  Note that the global std::swap() function is
1182*e4b17023SJohn Marino        *  specialized such that std::swap(l1,l2) will feed to this
1183*e4b17023SJohn Marino        *  function.
1184*e4b17023SJohn Marino        */
1185*e4b17023SJohn Marino       void
1186*e4b17023SJohn Marino       swap(list& __x)
1187*e4b17023SJohn Marino       {
1188*e4b17023SJohn Marino 	__detail::_List_node_base::swap(this->_M_impl._M_node,
1189*e4b17023SJohn Marino 					__x._M_impl._M_node);
1190*e4b17023SJohn Marino 
1191*e4b17023SJohn Marino 	// _GLIBCXX_RESOLVE_LIB_DEFECTS
1192*e4b17023SJohn Marino 	// 431. Swapping containers with unequal allocators.
1193*e4b17023SJohn Marino 	std::__alloc_swap<typename _Base::_Node_alloc_type>::
1194*e4b17023SJohn Marino 	  _S_do_it(_M_get_Node_allocator(), __x._M_get_Node_allocator());
1195*e4b17023SJohn Marino       }
1196*e4b17023SJohn Marino 
1197*e4b17023SJohn Marino       /**
1198*e4b17023SJohn Marino        *  Erases all the elements.  Note that this function only erases
1199*e4b17023SJohn Marino        *  the elements, and that if the elements themselves are
1200*e4b17023SJohn Marino        *  pointers, the pointed-to memory is not touched in any way.
1201*e4b17023SJohn Marino        *  Managing the pointer is the user's responsibility.
1202*e4b17023SJohn Marino        */
1203*e4b17023SJohn Marino       void
1204*e4b17023SJohn Marino       clear() _GLIBCXX_NOEXCEPT
1205*e4b17023SJohn Marino       {
1206*e4b17023SJohn Marino         _Base::_M_clear();
1207*e4b17023SJohn Marino         _Base::_M_init();
1208*e4b17023SJohn Marino       }
1209*e4b17023SJohn Marino 
1210*e4b17023SJohn Marino       // [23.2.2.4] list operations
1211*e4b17023SJohn Marino       /**
1212*e4b17023SJohn Marino        *  @brief  Insert contents of another %list.
1213*e4b17023SJohn Marino        *  @param  __position  Iterator referencing the element to insert before.
1214*e4b17023SJohn Marino        *  @param  __x  Source list.
1215*e4b17023SJohn Marino        *
1216*e4b17023SJohn Marino        *  The elements of @a __x are inserted in constant time in front of
1217*e4b17023SJohn Marino        *  the element referenced by @a __position.  @a __x becomes an empty
1218*e4b17023SJohn Marino        *  list.
1219*e4b17023SJohn Marino        *
1220*e4b17023SJohn Marino        *  Requires this != @a __x.
1221*e4b17023SJohn Marino        */
1222*e4b17023SJohn Marino       void
1223*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
1224*e4b17023SJohn Marino       splice(iterator __position, list&& __x)
1225*e4b17023SJohn Marino #else
1226*e4b17023SJohn Marino       splice(iterator __position, list& __x)
1227*e4b17023SJohn Marino #endif
1228*e4b17023SJohn Marino       {
1229*e4b17023SJohn Marino 	if (!__x.empty())
1230*e4b17023SJohn Marino 	  {
1231*e4b17023SJohn Marino 	    _M_check_equal_allocators(__x);
1232*e4b17023SJohn Marino 
1233*e4b17023SJohn Marino 	    this->_M_transfer(__position, __x.begin(), __x.end());
1234*e4b17023SJohn Marino 	  }
1235*e4b17023SJohn Marino       }
1236*e4b17023SJohn Marino 
1237*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
1238*e4b17023SJohn Marino       void
1239*e4b17023SJohn Marino       splice(iterator __position, list& __x)
1240*e4b17023SJohn Marino       { splice(__position, std::move(__x)); }
1241*e4b17023SJohn Marino #endif
1242*e4b17023SJohn Marino 
1243*e4b17023SJohn Marino       /**
1244*e4b17023SJohn Marino        *  @brief  Insert element from another %list.
1245*e4b17023SJohn Marino        *  @param  __position  Iterator referencing the element to insert before.
1246*e4b17023SJohn Marino        *  @param  __x  Source list.
1247*e4b17023SJohn Marino        *  @param  __i  Iterator referencing the element to move.
1248*e4b17023SJohn Marino        *
1249*e4b17023SJohn Marino        *  Removes the element in list @a __x referenced by @a __i and
1250*e4b17023SJohn Marino        *  inserts it into the current list before @a __position.
1251*e4b17023SJohn Marino        */
1252*e4b17023SJohn Marino       void
1253*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
1254*e4b17023SJohn Marino       splice(iterator __position, list&& __x, iterator __i)
1255*e4b17023SJohn Marino #else
1256*e4b17023SJohn Marino       splice(iterator __position, list& __x, iterator __i)
1257*e4b17023SJohn Marino #endif
1258*e4b17023SJohn Marino       {
1259*e4b17023SJohn Marino 	iterator __j = __i;
1260*e4b17023SJohn Marino 	++__j;
1261*e4b17023SJohn Marino 	if (__position == __i || __position == __j)
1262*e4b17023SJohn Marino 	  return;
1263*e4b17023SJohn Marino 
1264*e4b17023SJohn Marino 	if (this != &__x)
1265*e4b17023SJohn Marino 	  _M_check_equal_allocators(__x);
1266*e4b17023SJohn Marino 
1267*e4b17023SJohn Marino 	this->_M_transfer(__position, __i, __j);
1268*e4b17023SJohn Marino       }
1269*e4b17023SJohn Marino 
1270*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
1271*e4b17023SJohn Marino       void
1272*e4b17023SJohn Marino       splice(iterator __position, list& __x, iterator __i)
1273*e4b17023SJohn Marino       { splice(__position, std::move(__x), __i); }
1274*e4b17023SJohn Marino #endif
1275*e4b17023SJohn Marino 
1276*e4b17023SJohn Marino       /**
1277*e4b17023SJohn Marino        *  @brief  Insert range from another %list.
1278*e4b17023SJohn Marino        *  @param  __position  Iterator referencing the element to insert before.
1279*e4b17023SJohn Marino        *  @param  __x  Source list.
1280*e4b17023SJohn Marino        *  @param  __first  Iterator referencing the start of range in x.
1281*e4b17023SJohn Marino        *  @param  __last  Iterator referencing the end of range in x.
1282*e4b17023SJohn Marino        *
1283*e4b17023SJohn Marino        *  Removes elements in the range [__first,__last) and inserts them
1284*e4b17023SJohn Marino        *  before @a __position in constant time.
1285*e4b17023SJohn Marino        *
1286*e4b17023SJohn Marino        *  Undefined if @a __position is in [__first,__last).
1287*e4b17023SJohn Marino        */
1288*e4b17023SJohn Marino       void
1289*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
1290*e4b17023SJohn Marino       splice(iterator __position, list&& __x, iterator __first,
1291*e4b17023SJohn Marino 	     iterator __last)
1292*e4b17023SJohn Marino #else
1293*e4b17023SJohn Marino       splice(iterator __position, list& __x, iterator __first,
1294*e4b17023SJohn Marino 	     iterator __last)
1295*e4b17023SJohn Marino #endif
1296*e4b17023SJohn Marino       {
1297*e4b17023SJohn Marino 	if (__first != __last)
1298*e4b17023SJohn Marino 	  {
1299*e4b17023SJohn Marino 	    if (this != &__x)
1300*e4b17023SJohn Marino 	      _M_check_equal_allocators(__x);
1301*e4b17023SJohn Marino 
1302*e4b17023SJohn Marino 	    this->_M_transfer(__position, __first, __last);
1303*e4b17023SJohn Marino 	  }
1304*e4b17023SJohn Marino       }
1305*e4b17023SJohn Marino 
1306*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
1307*e4b17023SJohn Marino       void
1308*e4b17023SJohn Marino       splice(iterator __position, list& __x, iterator __first, iterator __last)
1309*e4b17023SJohn Marino       { splice(__position, std::move(__x), __first, __last); }
1310*e4b17023SJohn Marino #endif
1311*e4b17023SJohn Marino 
1312*e4b17023SJohn Marino       /**
1313*e4b17023SJohn Marino        *  @brief  Remove all elements equal to value.
1314*e4b17023SJohn Marino        *  @param  __value  The value to remove.
1315*e4b17023SJohn Marino        *
1316*e4b17023SJohn Marino        *  Removes every element in the list equal to @a value.
1317*e4b17023SJohn Marino        *  Remaining elements stay in list order.  Note that this
1318*e4b17023SJohn Marino        *  function only erases the elements, and that if the elements
1319*e4b17023SJohn Marino        *  themselves are pointers, the pointed-to memory is not
1320*e4b17023SJohn Marino        *  touched in any way.  Managing the pointer is the user's
1321*e4b17023SJohn Marino        *  responsibility.
1322*e4b17023SJohn Marino        */
1323*e4b17023SJohn Marino       void
1324*e4b17023SJohn Marino       remove(const _Tp& __value);
1325*e4b17023SJohn Marino 
1326*e4b17023SJohn Marino       /**
1327*e4b17023SJohn Marino        *  @brief  Remove all elements satisfying a predicate.
1328*e4b17023SJohn Marino        *  @tparam  _Predicate  Unary predicate function or object.
1329*e4b17023SJohn Marino        *
1330*e4b17023SJohn Marino        *  Removes every element in the list for which the predicate
1331*e4b17023SJohn Marino        *  returns true.  Remaining elements stay in list order.  Note
1332*e4b17023SJohn Marino        *  that this function only erases the elements, and that if the
1333*e4b17023SJohn Marino        *  elements themselves are pointers, the pointed-to memory is
1334*e4b17023SJohn Marino        *  not touched in any way.  Managing the pointer is the user's
1335*e4b17023SJohn Marino        *  responsibility.
1336*e4b17023SJohn Marino        */
1337*e4b17023SJohn Marino       template<typename _Predicate>
1338*e4b17023SJohn Marino         void
1339*e4b17023SJohn Marino         remove_if(_Predicate);
1340*e4b17023SJohn Marino 
1341*e4b17023SJohn Marino       /**
1342*e4b17023SJohn Marino        *  @brief  Remove consecutive duplicate elements.
1343*e4b17023SJohn Marino        *
1344*e4b17023SJohn Marino        *  For each consecutive set of elements with the same value,
1345*e4b17023SJohn Marino        *  remove all but the first one.  Remaining elements stay in
1346*e4b17023SJohn Marino        *  list order.  Note that this function only erases the
1347*e4b17023SJohn Marino        *  elements, and that if the elements themselves are pointers,
1348*e4b17023SJohn Marino        *  the pointed-to memory is not touched in any way.  Managing
1349*e4b17023SJohn Marino        *  the pointer is the user's responsibility.
1350*e4b17023SJohn Marino        */
1351*e4b17023SJohn Marino       void
1352*e4b17023SJohn Marino       unique();
1353*e4b17023SJohn Marino 
1354*e4b17023SJohn Marino       /**
1355*e4b17023SJohn Marino        *  @brief  Remove consecutive elements satisfying a predicate.
1356*e4b17023SJohn Marino        *  @tparam _BinaryPredicate  Binary predicate function or object.
1357*e4b17023SJohn Marino        *
1358*e4b17023SJohn Marino        *  For each consecutive set of elements [first,last) that
1359*e4b17023SJohn Marino        *  satisfy predicate(first,i) where i is an iterator in
1360*e4b17023SJohn Marino        *  [first,last), remove all but the first one.  Remaining
1361*e4b17023SJohn Marino        *  elements stay in list order.  Note that this function only
1362*e4b17023SJohn Marino        *  erases the elements, and that if the elements themselves are
1363*e4b17023SJohn Marino        *  pointers, the pointed-to memory is not touched in any way.
1364*e4b17023SJohn Marino        *  Managing the pointer is the user's responsibility.
1365*e4b17023SJohn Marino        */
1366*e4b17023SJohn Marino       template<typename _BinaryPredicate>
1367*e4b17023SJohn Marino         void
1368*e4b17023SJohn Marino         unique(_BinaryPredicate);
1369*e4b17023SJohn Marino 
1370*e4b17023SJohn Marino       /**
1371*e4b17023SJohn Marino        *  @brief  Merge sorted lists.
1372*e4b17023SJohn Marino        *  @param  __x  Sorted list to merge.
1373*e4b17023SJohn Marino        *
1374*e4b17023SJohn Marino        *  Assumes that both @a __x and this list are sorted according to
1375*e4b17023SJohn Marino        *  operator<().  Merges elements of @a __x into this list in
1376*e4b17023SJohn Marino        *  sorted order, leaving @a __x empty when complete.  Elements in
1377*e4b17023SJohn Marino        *  this list precede elements in @a __x that are equal.
1378*e4b17023SJohn Marino        */
1379*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
1380*e4b17023SJohn Marino       void
1381*e4b17023SJohn Marino       merge(list&& __x);
1382*e4b17023SJohn Marino 
1383*e4b17023SJohn Marino       void
1384*e4b17023SJohn Marino       merge(list& __x)
1385*e4b17023SJohn Marino       { merge(std::move(__x)); }
1386*e4b17023SJohn Marino #else
1387*e4b17023SJohn Marino       void
1388*e4b17023SJohn Marino       merge(list& __x);
1389*e4b17023SJohn Marino #endif
1390*e4b17023SJohn Marino 
1391*e4b17023SJohn Marino       /**
1392*e4b17023SJohn Marino        *  @brief  Merge sorted lists according to comparison function.
1393*e4b17023SJohn Marino        *  @tparam _StrictWeakOrdering Comparison function defining
1394*e4b17023SJohn Marino        *  sort order.
1395*e4b17023SJohn Marino        *  @param  __x  Sorted list to merge.
1396*e4b17023SJohn Marino        *  @param  __comp  Comparison functor.
1397*e4b17023SJohn Marino        *
1398*e4b17023SJohn Marino        *  Assumes that both @a __x and this list are sorted according to
1399*e4b17023SJohn Marino        *  StrictWeakOrdering.  Merges elements of @a __x into this list
1400*e4b17023SJohn Marino        *  in sorted order, leaving @a __x empty when complete.  Elements
1401*e4b17023SJohn Marino        *  in this list precede elements in @a __x that are equivalent
1402*e4b17023SJohn Marino        *  according to StrictWeakOrdering().
1403*e4b17023SJohn Marino        */
1404*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
1405*e4b17023SJohn Marino       template<typename _StrictWeakOrdering>
1406*e4b17023SJohn Marino         void
1407*e4b17023SJohn Marino         merge(list&& __x, _StrictWeakOrdering __comp);
1408*e4b17023SJohn Marino 
1409*e4b17023SJohn Marino       template<typename _StrictWeakOrdering>
1410*e4b17023SJohn Marino         void
1411*e4b17023SJohn Marino         merge(list& __x, _StrictWeakOrdering __comp)
1412*e4b17023SJohn Marino         { merge(std::move(__x), __comp); }
1413*e4b17023SJohn Marino #else
1414*e4b17023SJohn Marino       template<typename _StrictWeakOrdering>
1415*e4b17023SJohn Marino         void
1416*e4b17023SJohn Marino         merge(list& __x, _StrictWeakOrdering __comp);
1417*e4b17023SJohn Marino #endif
1418*e4b17023SJohn Marino 
1419*e4b17023SJohn Marino       /**
1420*e4b17023SJohn Marino        *  @brief  Reverse the elements in list.
1421*e4b17023SJohn Marino        *
1422*e4b17023SJohn Marino        *  Reverse the order of elements in the list in linear time.
1423*e4b17023SJohn Marino        */
1424*e4b17023SJohn Marino       void
1425*e4b17023SJohn Marino       reverse() _GLIBCXX_NOEXCEPT
1426*e4b17023SJohn Marino       { this->_M_impl._M_node._M_reverse(); }
1427*e4b17023SJohn Marino 
1428*e4b17023SJohn Marino       /**
1429*e4b17023SJohn Marino        *  @brief  Sort the elements.
1430*e4b17023SJohn Marino        *
1431*e4b17023SJohn Marino        *  Sorts the elements of this list in NlogN time.  Equivalent
1432*e4b17023SJohn Marino        *  elements remain in list order.
1433*e4b17023SJohn Marino        */
1434*e4b17023SJohn Marino       void
1435*e4b17023SJohn Marino       sort();
1436*e4b17023SJohn Marino 
1437*e4b17023SJohn Marino       /**
1438*e4b17023SJohn Marino        *  @brief  Sort the elements according to comparison function.
1439*e4b17023SJohn Marino        *
1440*e4b17023SJohn Marino        *  Sorts the elements of this list in NlogN time.  Equivalent
1441*e4b17023SJohn Marino        *  elements remain in list order.
1442*e4b17023SJohn Marino        */
1443*e4b17023SJohn Marino       template<typename _StrictWeakOrdering>
1444*e4b17023SJohn Marino         void
1445*e4b17023SJohn Marino         sort(_StrictWeakOrdering);
1446*e4b17023SJohn Marino 
1447*e4b17023SJohn Marino     protected:
1448*e4b17023SJohn Marino       // Internal constructor functions follow.
1449*e4b17023SJohn Marino 
1450*e4b17023SJohn Marino       // Called by the range constructor to implement [23.1.1]/9
1451*e4b17023SJohn Marino 
1452*e4b17023SJohn Marino       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1453*e4b17023SJohn Marino       // 438. Ambiguity in the "do the right thing" clause
1454*e4b17023SJohn Marino       template<typename _Integer>
1455*e4b17023SJohn Marino         void
1456*e4b17023SJohn Marino         _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
1457*e4b17023SJohn Marino         { _M_fill_initialize(static_cast<size_type>(__n), __x); }
1458*e4b17023SJohn Marino 
1459*e4b17023SJohn Marino       // Called by the range constructor to implement [23.1.1]/9
1460*e4b17023SJohn Marino       template<typename _InputIterator>
1461*e4b17023SJohn Marino         void
1462*e4b17023SJohn Marino         _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
1463*e4b17023SJohn Marino 			       __false_type)
1464*e4b17023SJohn Marino         {
1465*e4b17023SJohn Marino 	  for (; __first != __last; ++__first)
1466*e4b17023SJohn Marino 	    push_back(*__first);
1467*e4b17023SJohn Marino 	}
1468*e4b17023SJohn Marino 
1469*e4b17023SJohn Marino       // Called by list(n,v,a), and the range constructor when it turns out
1470*e4b17023SJohn Marino       // to be the same thing.
1471*e4b17023SJohn Marino       void
1472*e4b17023SJohn Marino       _M_fill_initialize(size_type __n, const value_type& __x)
1473*e4b17023SJohn Marino       {
1474*e4b17023SJohn Marino 	for (; __n; --__n)
1475*e4b17023SJohn Marino 	  push_back(__x);
1476*e4b17023SJohn Marino       }
1477*e4b17023SJohn Marino 
1478*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
1479*e4b17023SJohn Marino       // Called by list(n).
1480*e4b17023SJohn Marino       void
1481*e4b17023SJohn Marino       _M_default_initialize(size_type __n)
1482*e4b17023SJohn Marino       {
1483*e4b17023SJohn Marino 	for (; __n; --__n)
1484*e4b17023SJohn Marino 	  emplace_back();
1485*e4b17023SJohn Marino       }
1486*e4b17023SJohn Marino 
1487*e4b17023SJohn Marino       // Called by resize(sz).
1488*e4b17023SJohn Marino       void
1489*e4b17023SJohn Marino       _M_default_append(size_type __n);
1490*e4b17023SJohn Marino #endif
1491*e4b17023SJohn Marino 
1492*e4b17023SJohn Marino       // Internal assign functions follow.
1493*e4b17023SJohn Marino 
1494*e4b17023SJohn Marino       // Called by the range assign to implement [23.1.1]/9
1495*e4b17023SJohn Marino 
1496*e4b17023SJohn Marino       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1497*e4b17023SJohn Marino       // 438. Ambiguity in the "do the right thing" clause
1498*e4b17023SJohn Marino       template<typename _Integer>
1499*e4b17023SJohn Marino         void
1500*e4b17023SJohn Marino         _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
1501*e4b17023SJohn Marino         { _M_fill_assign(__n, __val); }
1502*e4b17023SJohn Marino 
1503*e4b17023SJohn Marino       // Called by the range assign to implement [23.1.1]/9
1504*e4b17023SJohn Marino       template<typename _InputIterator>
1505*e4b17023SJohn Marino         void
1506*e4b17023SJohn Marino         _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
1507*e4b17023SJohn Marino 			   __false_type);
1508*e4b17023SJohn Marino 
1509*e4b17023SJohn Marino       // Called by assign(n,t), and the range assign when it turns out
1510*e4b17023SJohn Marino       // to be the same thing.
1511*e4b17023SJohn Marino       void
1512*e4b17023SJohn Marino       _M_fill_assign(size_type __n, const value_type& __val);
1513*e4b17023SJohn Marino 
1514*e4b17023SJohn Marino 
1515*e4b17023SJohn Marino       // Moves the elements from [first,last) before position.
1516*e4b17023SJohn Marino       void
1517*e4b17023SJohn Marino       _M_transfer(iterator __position, iterator __first, iterator __last)
1518*e4b17023SJohn Marino       { __position._M_node->_M_transfer(__first._M_node, __last._M_node); }
1519*e4b17023SJohn Marino 
1520*e4b17023SJohn Marino       // Inserts new element at position given and with value given.
1521*e4b17023SJohn Marino #ifndef __GXX_EXPERIMENTAL_CXX0X__
1522*e4b17023SJohn Marino       void
1523*e4b17023SJohn Marino       _M_insert(iterator __position, const value_type& __x)
1524*e4b17023SJohn Marino       {
1525*e4b17023SJohn Marino         _Node* __tmp = _M_create_node(__x);
1526*e4b17023SJohn Marino         __tmp->_M_hook(__position._M_node);
1527*e4b17023SJohn Marino       }
1528*e4b17023SJohn Marino #else
1529*e4b17023SJohn Marino      template<typename... _Args>
1530*e4b17023SJohn Marino        void
1531*e4b17023SJohn Marino        _M_insert(iterator __position, _Args&&... __args)
1532*e4b17023SJohn Marino        {
1533*e4b17023SJohn Marino 	 _Node* __tmp = _M_create_node(std::forward<_Args>(__args)...);
1534*e4b17023SJohn Marino 	 __tmp->_M_hook(__position._M_node);
1535*e4b17023SJohn Marino        }
1536*e4b17023SJohn Marino #endif
1537*e4b17023SJohn Marino 
1538*e4b17023SJohn Marino       // Erases element at position given.
1539*e4b17023SJohn Marino       void
1540*e4b17023SJohn Marino       _M_erase(iterator __position)
1541*e4b17023SJohn Marino       {
1542*e4b17023SJohn Marino         __position._M_node->_M_unhook();
1543*e4b17023SJohn Marino         _Node* __n = static_cast<_Node*>(__position._M_node);
1544*e4b17023SJohn Marino #ifdef __GXX_EXPERIMENTAL_CXX0X__
1545*e4b17023SJohn Marino         _M_get_Node_allocator().destroy(__n);
1546*e4b17023SJohn Marino #else
1547*e4b17023SJohn Marino 	_M_get_Tp_allocator().destroy(std::__addressof(__n->_M_data));
1548*e4b17023SJohn Marino #endif
1549*e4b17023SJohn Marino         _M_put_node(__n);
1550*e4b17023SJohn Marino       }
1551*e4b17023SJohn Marino 
1552*e4b17023SJohn Marino       // To implement the splice (and merge) bits of N1599.
1553*e4b17023SJohn Marino       void
1554*e4b17023SJohn Marino       _M_check_equal_allocators(list& __x)
1555*e4b17023SJohn Marino       {
1556*e4b17023SJohn Marino 	if (std::__alloc_neq<typename _Base::_Node_alloc_type>::
1557*e4b17023SJohn Marino 	    _S_do_it(_M_get_Node_allocator(), __x._M_get_Node_allocator()))
1558*e4b17023SJohn Marino 	  __throw_runtime_error(__N("list::_M_check_equal_allocators"));
1559*e4b17023SJohn Marino       }
1560*e4b17023SJohn Marino     };
1561*e4b17023SJohn Marino 
1562*e4b17023SJohn Marino   /**
1563*e4b17023SJohn Marino    *  @brief  List equality comparison.
1564*e4b17023SJohn Marino    *  @param  __x  A %list.
1565*e4b17023SJohn Marino    *  @param  __y  A %list of the same type as @a __x.
1566*e4b17023SJohn Marino    *  @return  True iff the size and elements of the lists are equal.
1567*e4b17023SJohn Marino    *
1568*e4b17023SJohn Marino    *  This is an equivalence relation.  It is linear in the size of
1569*e4b17023SJohn Marino    *  the lists.  Lists are considered equivalent if their sizes are
1570*e4b17023SJohn Marino    *  equal, and if corresponding elements compare equal.
1571*e4b17023SJohn Marino   */
1572*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
1573*e4b17023SJohn Marino     inline bool
1574*e4b17023SJohn Marino     operator==(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
1575*e4b17023SJohn Marino     {
1576*e4b17023SJohn Marino       typedef typename list<_Tp, _Alloc>::const_iterator const_iterator;
1577*e4b17023SJohn Marino       const_iterator __end1 = __x.end();
1578*e4b17023SJohn Marino       const_iterator __end2 = __y.end();
1579*e4b17023SJohn Marino 
1580*e4b17023SJohn Marino       const_iterator __i1 = __x.begin();
1581*e4b17023SJohn Marino       const_iterator __i2 = __y.begin();
1582*e4b17023SJohn Marino       while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2)
1583*e4b17023SJohn Marino 	{
1584*e4b17023SJohn Marino 	  ++__i1;
1585*e4b17023SJohn Marino 	  ++__i2;
1586*e4b17023SJohn Marino 	}
1587*e4b17023SJohn Marino       return __i1 == __end1 && __i2 == __end2;
1588*e4b17023SJohn Marino     }
1589*e4b17023SJohn Marino 
1590*e4b17023SJohn Marino   /**
1591*e4b17023SJohn Marino    *  @brief  List ordering relation.
1592*e4b17023SJohn Marino    *  @param  __x  A %list.
1593*e4b17023SJohn Marino    *  @param  __y  A %list of the same type as @a __x.
1594*e4b17023SJohn Marino    *  @return  True iff @a __x is lexicographically less than @a __y.
1595*e4b17023SJohn Marino    *
1596*e4b17023SJohn Marino    *  This is a total ordering relation.  It is linear in the size of the
1597*e4b17023SJohn Marino    *  lists.  The elements must be comparable with @c <.
1598*e4b17023SJohn Marino    *
1599*e4b17023SJohn Marino    *  See std::lexicographical_compare() for how the determination is made.
1600*e4b17023SJohn Marino   */
1601*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
1602*e4b17023SJohn Marino     inline bool
1603*e4b17023SJohn Marino     operator<(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
1604*e4b17023SJohn Marino     { return std::lexicographical_compare(__x.begin(), __x.end(),
1605*e4b17023SJohn Marino 					  __y.begin(), __y.end()); }
1606*e4b17023SJohn Marino 
1607*e4b17023SJohn Marino   /// Based on operator==
1608*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
1609*e4b17023SJohn Marino     inline bool
1610*e4b17023SJohn Marino     operator!=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
1611*e4b17023SJohn Marino     { return !(__x == __y); }
1612*e4b17023SJohn Marino 
1613*e4b17023SJohn Marino   /// Based on operator<
1614*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
1615*e4b17023SJohn Marino     inline bool
1616*e4b17023SJohn Marino     operator>(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
1617*e4b17023SJohn Marino     { return __y < __x; }
1618*e4b17023SJohn Marino 
1619*e4b17023SJohn Marino   /// Based on operator<
1620*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
1621*e4b17023SJohn Marino     inline bool
1622*e4b17023SJohn Marino     operator<=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
1623*e4b17023SJohn Marino     { return !(__y < __x); }
1624*e4b17023SJohn Marino 
1625*e4b17023SJohn Marino   /// Based on operator<
1626*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
1627*e4b17023SJohn Marino     inline bool
1628*e4b17023SJohn Marino     operator>=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
1629*e4b17023SJohn Marino     { return !(__x < __y); }
1630*e4b17023SJohn Marino 
1631*e4b17023SJohn Marino   /// See std::list::swap().
1632*e4b17023SJohn Marino   template<typename _Tp, typename _Alloc>
1633*e4b17023SJohn Marino     inline void
1634*e4b17023SJohn Marino     swap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y)
1635*e4b17023SJohn Marino     { __x.swap(__y); }
1636*e4b17023SJohn Marino 
1637*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_CONTAINER
1638*e4b17023SJohn Marino } // namespace std
1639*e4b17023SJohn Marino 
1640*e4b17023SJohn Marino #endif /* _STL_LIST_H */
1641