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