xref: /netbsd-src/external/gpl3/gcc.old/dist/libstdc++-v3/include/bits/stl_list.h (revision 8feb0f0b7eaff0608f8350bbfa3098827b4bb91b)
1 // List implementation -*- C++ -*-
2 
3 // Copyright (C) 2001-2020 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the
7 // terms of the GNU General Public License as published by the
8 // Free Software Foundation; either version 3, or (at your option)
9 // any later version.
10 
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 // GNU General Public License for more details.
15 
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
19 
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23 // <http://www.gnu.org/licenses/>.
24 
25 /*
26  *
27  * Copyright (c) 1994
28  * Hewlett-Packard Company
29  *
30  * Permission to use, copy, modify, distribute and sell this software
31  * and its documentation for any purpose is hereby granted without fee,
32  * provided that the above copyright notice appear in all copies and
33  * that both that copyright notice and this permission notice appear
34  * in supporting documentation.  Hewlett-Packard Company makes no
35  * representations about the suitability of this software for any
36  * purpose.  It is provided "as is" without express or implied warranty.
37  *
38  *
39  * Copyright (c) 1996,1997
40  * Silicon Graphics Computer Systems, Inc.
41  *
42  * Permission to use, copy, modify, distribute and sell this software
43  * and its documentation for any purpose is hereby granted without fee,
44  * provided that the above copyright notice appear in all copies and
45  * that both that copyright notice and this permission notice appear
46  * in supporting documentation.  Silicon Graphics makes no
47  * representations about the suitability of this software for any
48  * purpose.  It is provided "as is" without express or implied warranty.
49  */
50 
51 /** @file bits/stl_list.h
52  *  This is an internal header file, included by other library headers.
53  *  Do not attempt to use it directly. @headername{list}
54  */
55 
56 #ifndef _STL_LIST_H
57 #define _STL_LIST_H 1
58 
59 #include <bits/concept_check.h>
60 #include <ext/alloc_traits.h>
61 #if __cplusplus >= 201103L
62 #include <initializer_list>
63 #include <bits/allocated_ptr.h>
64 #include <ext/aligned_buffer.h>
65 #endif
66 
_GLIBCXX_VISIBILITY(default)67 namespace std _GLIBCXX_VISIBILITY(default)
68 {
69 _GLIBCXX_BEGIN_NAMESPACE_VERSION
70 
71   namespace __detail
72   {
73     // Supporting structures are split into common and templated
74     // types; the latter publicly inherits from the former in an
75     // effort to reduce code duplication.  This results in some
76     // "needless" static_cast'ing later on, but it's all safe
77     // downcasting.
78 
79     /// Common part of a node in the %list.
80     struct _List_node_base
81     {
82       _List_node_base* _M_next;
83       _List_node_base* _M_prev;
84 
85       static void
86       swap(_List_node_base& __x, _List_node_base& __y) _GLIBCXX_USE_NOEXCEPT;
87 
88       void
89       _M_transfer(_List_node_base* const __first,
90 		  _List_node_base* const __last) _GLIBCXX_USE_NOEXCEPT;
91 
92       void
93       _M_reverse() _GLIBCXX_USE_NOEXCEPT;
94 
95       void
96       _M_hook(_List_node_base* const __position) _GLIBCXX_USE_NOEXCEPT;
97 
98       void
99       _M_unhook() _GLIBCXX_USE_NOEXCEPT;
100     };
101 
102     /// The %list node header.
103     struct _List_node_header : public _List_node_base
104     {
105 #if _GLIBCXX_USE_CXX11_ABI
106       std::size_t _M_size;
107 #endif
108 
109       _List_node_header() _GLIBCXX_NOEXCEPT
110       { _M_init(); }
111 
112 #if __cplusplus >= 201103L
113       _List_node_header(_List_node_header&& __x) noexcept
114       : _List_node_base{ __x._M_next, __x._M_prev }
115 # if _GLIBCXX_USE_CXX11_ABI
116       , _M_size(__x._M_size)
117 # endif
118       {
119 	if (__x._M_base()->_M_next == __x._M_base())
120 	  this->_M_next = this->_M_prev = this;
121 	else
122 	  {
123 	    this->_M_next->_M_prev = this->_M_prev->_M_next = this->_M_base();
124 	    __x._M_init();
125 	  }
126       }
127 
128       void
129       _M_move_nodes(_List_node_header&& __x)
130       {
131 	_List_node_base* const __xnode = __x._M_base();
132 	if (__xnode->_M_next == __xnode)
133 	  _M_init();
134 	else
135 	  {
136 	    _List_node_base* const __node = this->_M_base();
137 	    __node->_M_next = __xnode->_M_next;
138 	    __node->_M_prev = __xnode->_M_prev;
139 	    __node->_M_next->_M_prev = __node->_M_prev->_M_next = __node;
140 # if _GLIBCXX_USE_CXX11_ABI
141 	    _M_size = __x._M_size;
142 # endif
143 	    __x._M_init();
144 	  }
145       }
146 #endif
147 
148       void
149       _M_init() _GLIBCXX_NOEXCEPT
150       {
151 	this->_M_next = this->_M_prev = this;
152 #if _GLIBCXX_USE_CXX11_ABI
153 	this->_M_size = 0;
154 #endif
155       }
156 
157     private:
158       _List_node_base* _M_base() { return this; }
159     };
160   } // namespace detail
161 
162 _GLIBCXX_BEGIN_NAMESPACE_CONTAINER
163 
164   /// An actual node in the %list.
165   template<typename _Tp>
166     struct _List_node : public __detail::_List_node_base
167     {
168 #if __cplusplus >= 201103L
169       __gnu_cxx::__aligned_membuf<_Tp> _M_storage;
170       _Tp*       _M_valptr()       { return _M_storage._M_ptr(); }
171       _Tp const* _M_valptr() const { return _M_storage._M_ptr(); }
172 #else
173       _Tp _M_data;
174       _Tp*       _M_valptr()       { return std::__addressof(_M_data); }
175       _Tp const* _M_valptr() const { return std::__addressof(_M_data); }
176 #endif
177     };
178 
179   /**
180    *  @brief A list::iterator.
181    *
182    *  All the functions are op overloads.
183   */
184   template<typename _Tp>
185     struct _List_iterator
186     {
187       typedef _List_iterator<_Tp>		_Self;
188       typedef _List_node<_Tp>			_Node;
189 
190       typedef ptrdiff_t				difference_type;
191       typedef std::bidirectional_iterator_tag	iterator_category;
192       typedef _Tp				value_type;
193       typedef _Tp*				pointer;
194       typedef _Tp&				reference;
195 
196       _List_iterator() _GLIBCXX_NOEXCEPT
197       : _M_node() { }
198 
199       explicit
200       _List_iterator(__detail::_List_node_base* __x) _GLIBCXX_NOEXCEPT
201       : _M_node(__x) { }
202 
203       _Self
204       _M_const_cast() const _GLIBCXX_NOEXCEPT
205       { return *this; }
206 
207       // Must downcast from _List_node_base to _List_node to get to value.
208       reference
209       operator*() const _GLIBCXX_NOEXCEPT
210       { return *static_cast<_Node*>(_M_node)->_M_valptr(); }
211 
212       pointer
213       operator->() const _GLIBCXX_NOEXCEPT
214       { return static_cast<_Node*>(_M_node)->_M_valptr(); }
215 
216       _Self&
217       operator++() _GLIBCXX_NOEXCEPT
218       {
219 	_M_node = _M_node->_M_next;
220 	return *this;
221       }
222 
223       _Self
224       operator++(int) _GLIBCXX_NOEXCEPT
225       {
226 	_Self __tmp = *this;
227 	_M_node = _M_node->_M_next;
228 	return __tmp;
229       }
230 
231       _Self&
232       operator--() _GLIBCXX_NOEXCEPT
233       {
234 	_M_node = _M_node->_M_prev;
235 	return *this;
236       }
237 
238       _Self
239       operator--(int) _GLIBCXX_NOEXCEPT
240       {
241 	_Self __tmp = *this;
242 	_M_node = _M_node->_M_prev;
243 	return __tmp;
244       }
245 
246       friend bool
247       operator==(const _Self& __x, const _Self& __y) _GLIBCXX_NOEXCEPT
248       { return __x._M_node == __y._M_node; }
249 
250 #if __cpp_impl_three_way_comparison < 201907L
251       friend bool
252       operator!=(const _Self& __x, const _Self& __y) _GLIBCXX_NOEXCEPT
253       { return __x._M_node != __y._M_node; }
254 #endif
255 
256       // The only member points to the %list element.
257       __detail::_List_node_base* _M_node;
258     };
259 
260   /**
261    *  @brief A list::const_iterator.
262    *
263    *  All the functions are op overloads.
264   */
265   template<typename _Tp>
266     struct _List_const_iterator
267     {
268       typedef _List_const_iterator<_Tp>		_Self;
269       typedef const _List_node<_Tp>		_Node;
270       typedef _List_iterator<_Tp>		iterator;
271 
272       typedef ptrdiff_t				difference_type;
273       typedef std::bidirectional_iterator_tag	iterator_category;
274       typedef _Tp				value_type;
275       typedef const _Tp*			pointer;
276       typedef const _Tp&			reference;
277 
278       _List_const_iterator() _GLIBCXX_NOEXCEPT
279       : _M_node() { }
280 
281       explicit
282       _List_const_iterator(const __detail::_List_node_base* __x)
283       _GLIBCXX_NOEXCEPT
284       : _M_node(__x) { }
285 
286       _List_const_iterator(const iterator& __x) _GLIBCXX_NOEXCEPT
287       : _M_node(__x._M_node) { }
288 
289       iterator
290       _M_const_cast() const _GLIBCXX_NOEXCEPT
291       { return iterator(const_cast<__detail::_List_node_base*>(_M_node)); }
292 
293       // Must downcast from List_node_base to _List_node to get to value.
294       reference
295       operator*() const _GLIBCXX_NOEXCEPT
296       { return *static_cast<_Node*>(_M_node)->_M_valptr(); }
297 
298       pointer
299       operator->() const _GLIBCXX_NOEXCEPT
300       { return static_cast<_Node*>(_M_node)->_M_valptr(); }
301 
302       _Self&
303       operator++() _GLIBCXX_NOEXCEPT
304       {
305 	_M_node = _M_node->_M_next;
306 	return *this;
307       }
308 
309       _Self
310       operator++(int) _GLIBCXX_NOEXCEPT
311       {
312 	_Self __tmp = *this;
313 	_M_node = _M_node->_M_next;
314 	return __tmp;
315       }
316 
317       _Self&
318       operator--() _GLIBCXX_NOEXCEPT
319       {
320 	_M_node = _M_node->_M_prev;
321 	return *this;
322       }
323 
324       _Self
325       operator--(int) _GLIBCXX_NOEXCEPT
326       {
327 	_Self __tmp = *this;
328 	_M_node = _M_node->_M_prev;
329 	return __tmp;
330       }
331 
332       friend bool
333       operator==(const _Self& __x, const _Self& __y) _GLIBCXX_NOEXCEPT
334       { return __x._M_node == __y._M_node; }
335 
336 #if __cpp_impl_three_way_comparison < 201907L
337       friend bool
338       operator!=(const _Self& __x, const _Self& __y) _GLIBCXX_NOEXCEPT
339       { return __x._M_node != __y._M_node; }
340 #endif
341 
342       // The only member points to the %list element.
343       const __detail::_List_node_base* _M_node;
344     };
345 
346 _GLIBCXX_BEGIN_NAMESPACE_CXX11
347   /// See bits/stl_deque.h's _Deque_base for an explanation.
348   template<typename _Tp, typename _Alloc>
349     class _List_base
350     {
351     protected:
352       typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
353 	rebind<_Tp>::other				_Tp_alloc_type;
354       typedef __gnu_cxx::__alloc_traits<_Tp_alloc_type>	_Tp_alloc_traits;
355       typedef typename _Tp_alloc_traits::template
356 	rebind<_List_node<_Tp> >::other _Node_alloc_type;
357       typedef __gnu_cxx::__alloc_traits<_Node_alloc_type> _Node_alloc_traits;
358 
359 #if !_GLIBCXX_INLINE_VERSION
360       static size_t
361       _S_distance(const __detail::_List_node_base* __first,
362 		  const __detail::_List_node_base* __last)
363       {
364 	size_t __n = 0;
365 	while (__first != __last)
366 	  {
367 	    __first = __first->_M_next;
368 	    ++__n;
369 	  }
370 	return __n;
371       }
372 #endif
373 
374       struct _List_impl
375       : public _Node_alloc_type
376       {
377 	__detail::_List_node_header _M_node;
378 
379 	_List_impl() _GLIBCXX_NOEXCEPT_IF(
380 	    is_nothrow_default_constructible<_Node_alloc_type>::value)
381 	: _Node_alloc_type()
382 	{ }
383 
384 	_List_impl(const _Node_alloc_type& __a) _GLIBCXX_NOEXCEPT
385 	: _Node_alloc_type(__a)
386 	{ }
387 
388 #if __cplusplus >= 201103L
389 	_List_impl(_List_impl&&) = default;
390 
391 	_List_impl(_Node_alloc_type&& __a, _List_impl&& __x)
392 	: _Node_alloc_type(std::move(__a)), _M_node(std::move(__x._M_node))
393 	{ }
394 
395 	_List_impl(_Node_alloc_type&& __a) noexcept
396 	: _Node_alloc_type(std::move(__a))
397 	{ }
398 #endif
399       };
400 
401       _List_impl _M_impl;
402 
403 #if _GLIBCXX_USE_CXX11_ABI
404       size_t _M_get_size() const { return _M_impl._M_node._M_size; }
405 
406       void _M_set_size(size_t __n) { _M_impl._M_node._M_size = __n; }
407 
408       void _M_inc_size(size_t __n) { _M_impl._M_node._M_size += __n; }
409 
410       void _M_dec_size(size_t __n) { _M_impl._M_node._M_size -= __n; }
411 
412 # if !_GLIBCXX_INLINE_VERSION
413       size_t
414       _M_distance(const __detail::_List_node_base* __first,
415 		  const __detail::_List_node_base* __last) const
416       { return _S_distance(__first, __last); }
417 
418       // return the stored size
419       size_t _M_node_count() const { return _M_get_size(); }
420 # endif
421 #else
422       // dummy implementations used when the size is not stored
423       size_t _M_get_size() const { return 0; }
424       void _M_set_size(size_t) { }
425       void _M_inc_size(size_t) { }
426       void _M_dec_size(size_t) { }
427 
428 # if !_GLIBCXX_INLINE_VERSION
429       size_t _M_distance(const void*, const void*) const { return 0; }
430 
431       // count the number of nodes
432       size_t _M_node_count() const
433       {
434 	return _S_distance(_M_impl._M_node._M_next,
435 			   std::__addressof(_M_impl._M_node));
436       }
437 # endif
438 #endif
439 
440       typename _Node_alloc_traits::pointer
441       _M_get_node()
442       { return _Node_alloc_traits::allocate(_M_impl, 1); }
443 
444       void
445       _M_put_node(typename _Node_alloc_traits::pointer __p) _GLIBCXX_NOEXCEPT
446       { _Node_alloc_traits::deallocate(_M_impl, __p, 1); }
447 
448   public:
449       typedef _Alloc allocator_type;
450 
451       _Node_alloc_type&
452       _M_get_Node_allocator() _GLIBCXX_NOEXCEPT
453       { return _M_impl; }
454 
455       const _Node_alloc_type&
456       _M_get_Node_allocator() const _GLIBCXX_NOEXCEPT
457       { return _M_impl; }
458 
459 #if __cplusplus >= 201103L
460       _List_base() = default;
461 #else
462       _List_base() { }
463 #endif
464 
465       _List_base(const _Node_alloc_type& __a) _GLIBCXX_NOEXCEPT
466       : _M_impl(__a)
467       { }
468 
469 #if __cplusplus >= 201103L
470       _List_base(_List_base&&) = default;
471 
472 # if !_GLIBCXX_INLINE_VERSION
473       _List_base(_List_base&& __x, _Node_alloc_type&& __a)
474       : _M_impl(std::move(__a))
475       {
476 	if (__x._M_get_Node_allocator() == _M_get_Node_allocator())
477 	  _M_move_nodes(std::move(__x));
478 	// else caller must move individual elements.
479       }
480 # endif
481 
482       // Used when allocator is_always_equal.
483       _List_base(_Node_alloc_type&& __a, _List_base&& __x)
484       : _M_impl(std::move(__a), std::move(__x._M_impl))
485       { }
486 
487       // Used when allocator !is_always_equal.
488       _List_base(_Node_alloc_type&& __a)
489       : _M_impl(std::move(__a))
490       { }
491 
492       void
493       _M_move_nodes(_List_base&& __x)
494       { _M_impl._M_node._M_move_nodes(std::move(__x._M_impl._M_node)); }
495 #endif
496 
497       // This is what actually destroys the list.
498       ~_List_base() _GLIBCXX_NOEXCEPT
499       { _M_clear(); }
500 
501       void
502       _M_clear() _GLIBCXX_NOEXCEPT;
503 
504       void
505       _M_init() _GLIBCXX_NOEXCEPT
506       { this->_M_impl._M_node._M_init(); }
507     };
508 
509   /**
510    *  @brief A standard container with linear time access to elements,
511    *  and fixed time insertion/deletion at any point in the sequence.
512    *
513    *  @ingroup sequences
514    *
515    *  @tparam _Tp  Type of element.
516    *  @tparam _Alloc  Allocator type, defaults to allocator<_Tp>.
517    *
518    *  Meets the requirements of a <a href="tables.html#65">container</a>, a
519    *  <a href="tables.html#66">reversible container</a>, and a
520    *  <a href="tables.html#67">sequence</a>, including the
521    *  <a href="tables.html#68">optional sequence requirements</a> with the
522    *  %exception of @c at and @c operator[].
523    *
524    *  This is a @e doubly @e linked %list.  Traversal up and down the
525    *  %list requires linear time, but adding and removing elements (or
526    *  @e nodes) is done in constant time, regardless of where the
527    *  change takes place.  Unlike std::vector and std::deque,
528    *  random-access iterators are not provided, so subscripting ( @c
529    *  [] ) access is not allowed.  For algorithms which only need
530    *  sequential access, this lack makes no difference.
531    *
532    *  Also unlike the other standard containers, std::list provides
533    *  specialized algorithms %unique to linked lists, such as
534    *  splicing, sorting, and in-place reversal.
535    *
536    *  A couple points on memory allocation for list<Tp>:
537    *
538    *  First, we never actually allocate a Tp, we allocate
539    *  List_node<Tp>'s and trust [20.1.5]/4 to DTRT.  This is to ensure
540    *  that after elements from %list<X,Alloc1> are spliced into
541    *  %list<X,Alloc2>, destroying the memory of the second %list is a
542    *  valid operation, i.e., Alloc1 giveth and Alloc2 taketh away.
543    *
544    *  Second, a %list conceptually represented as
545    *  @code
546    *    A <---> B <---> C <---> D
547    *  @endcode
548    *  is actually circular; a link exists between A and D.  The %list
549    *  class holds (as its only data member) a private list::iterator
550    *  pointing to @e D, not to @e A!  To get to the head of the %list,
551    *  we start at the tail and move forward by one.  When this member
552    *  iterator's next/previous pointers refer to itself, the %list is
553    *  %empty.
554   */
555   template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
556     class list : protected _List_base<_Tp, _Alloc>
557     {
558 #ifdef _GLIBCXX_CONCEPT_CHECKS
559       // concept requirements
560       typedef typename _Alloc::value_type		_Alloc_value_type;
561 # if __cplusplus < 201103L
562       __glibcxx_class_requires(_Tp, _SGIAssignableConcept)
563 # endif
564       __glibcxx_class_requires2(_Tp, _Alloc_value_type, _SameTypeConcept)
565 #endif
566 
567 #if __cplusplus >= 201103L
568       static_assert(is_same<typename remove_cv<_Tp>::type, _Tp>::value,
569 	  "std::list must have a non-const, non-volatile value_type");
570 # if __cplusplus > 201703L || defined __STRICT_ANSI__
571       static_assert(is_same<typename _Alloc::value_type, _Tp>::value,
572 	  "std::list must have the same value_type as its allocator");
573 # endif
574 #endif
575 
576       typedef _List_base<_Tp, _Alloc>			_Base;
577       typedef typename _Base::_Tp_alloc_type		_Tp_alloc_type;
578       typedef typename _Base::_Tp_alloc_traits		_Tp_alloc_traits;
579       typedef typename _Base::_Node_alloc_type		_Node_alloc_type;
580       typedef typename _Base::_Node_alloc_traits	_Node_alloc_traits;
581 
582     public:
583       typedef _Tp					 value_type;
584       typedef typename _Tp_alloc_traits::pointer	 pointer;
585       typedef typename _Tp_alloc_traits::const_pointer	 const_pointer;
586       typedef typename _Tp_alloc_traits::reference	 reference;
587       typedef typename _Tp_alloc_traits::const_reference const_reference;
588       typedef _List_iterator<_Tp>			 iterator;
589       typedef _List_const_iterator<_Tp>			 const_iterator;
590       typedef std::reverse_iterator<const_iterator>	 const_reverse_iterator;
591       typedef std::reverse_iterator<iterator>		 reverse_iterator;
592       typedef size_t					 size_type;
593       typedef ptrdiff_t					 difference_type;
594       typedef _Alloc					 allocator_type;
595 
596     protected:
597       // Note that pointers-to-_Node's can be ctor-converted to
598       // iterator types.
599       typedef _List_node<_Tp>				 _Node;
600 
601       using _Base::_M_impl;
602       using _Base::_M_put_node;
603       using _Base::_M_get_node;
604       using _Base::_M_get_Node_allocator;
605 
606       /**
607        *  @param  __args  An instance of user data.
608        *
609        *  Allocates space for a new node and constructs a copy of
610        *  @a __args in it.
611        */
612 #if __cplusplus < 201103L
613       _Node*
614       _M_create_node(const value_type& __x)
615       {
616 	_Node* __p = this->_M_get_node();
617 	__try
618 	  {
619 	    _Tp_alloc_type __alloc(_M_get_Node_allocator());
620 	    __alloc.construct(__p->_M_valptr(), __x);
621 	  }
622 	__catch(...)
623 	  {
624 	    _M_put_node(__p);
625 	    __throw_exception_again;
626 	  }
627 	return __p;
628       }
629 #else
630       template<typename... _Args>
631 	_Node*
632 	_M_create_node(_Args&&... __args)
633 	{
634 	  auto __p = this->_M_get_node();
635 	  auto& __alloc = _M_get_Node_allocator();
636 	  __allocated_ptr<_Node_alloc_type> __guard{__alloc, __p};
637 	  _Node_alloc_traits::construct(__alloc, __p->_M_valptr(),
638 					std::forward<_Args>(__args)...);
639 	  __guard = nullptr;
640 	  return __p;
641 	}
642 #endif
643 
644 #if _GLIBCXX_USE_CXX11_ABI
645       static size_t
646       _S_distance(const_iterator __first, const_iterator __last)
647       { return std::distance(__first, __last); }
648 
649       // return the stored size
650       size_t
651       _M_node_count() const
652       { return this->_M_get_size(); }
653 #else
654       // dummy implementations used when the size is not stored
655       static size_t
656       _S_distance(const_iterator, const_iterator)
657       { return 0; }
658 
659       // count the number of nodes
660       size_t
661       _M_node_count() const
662       { return std::distance(begin(), end()); }
663 #endif
664 
665     public:
666       // [23.2.2.1] construct/copy/destroy
667       // (assign() and get_allocator() are also listed in this section)
668 
669       /**
670        *  @brief  Creates a %list with no elements.
671        */
672 #if __cplusplus >= 201103L
673       list() = default;
674 #else
675       list() { }
676 #endif
677 
678       /**
679        *  @brief  Creates a %list with no elements.
680        *  @param  __a  An allocator object.
681        */
682       explicit
683       list(const allocator_type& __a) _GLIBCXX_NOEXCEPT
684       : _Base(_Node_alloc_type(__a)) { }
685 
686 #if __cplusplus >= 201103L
687       /**
688        *  @brief  Creates a %list with default constructed elements.
689        *  @param  __n  The number of elements to initially create.
690        *  @param  __a  An allocator object.
691        *
692        *  This constructor fills the %list with @a __n default
693        *  constructed elements.
694        */
695       explicit
696       list(size_type __n, const allocator_type& __a = allocator_type())
697       : _Base(_Node_alloc_type(__a))
698       { _M_default_initialize(__n); }
699 
700       /**
701        *  @brief  Creates a %list with copies of an exemplar element.
702        *  @param  __n  The number of elements to initially create.
703        *  @param  __value  An element to copy.
704        *  @param  __a  An allocator object.
705        *
706        *  This constructor fills the %list with @a __n copies of @a __value.
707        */
708       list(size_type __n, const value_type& __value,
709 	   const allocator_type& __a = allocator_type())
710       : _Base(_Node_alloc_type(__a))
711       { _M_fill_initialize(__n, __value); }
712 #else
713       /**
714        *  @brief  Creates a %list with copies of an exemplar element.
715        *  @param  __n  The number of elements to initially create.
716        *  @param  __value  An element to copy.
717        *  @param  __a  An allocator object.
718        *
719        *  This constructor fills the %list with @a __n copies of @a __value.
720        */
721       explicit
722       list(size_type __n, const value_type& __value = value_type(),
723 	   const allocator_type& __a = allocator_type())
724       : _Base(_Node_alloc_type(__a))
725       { _M_fill_initialize(__n, __value); }
726 #endif
727 
728       /**
729        *  @brief  %List copy constructor.
730        *  @param  __x  A %list of identical element and allocator types.
731        *
732        *  The newly-created %list uses a copy of the allocation object used
733        *  by @a __x (unless the allocator traits dictate a different object).
734        */
735       list(const list& __x)
736       : _Base(_Node_alloc_traits::
737 	      _S_select_on_copy(__x._M_get_Node_allocator()))
738       { _M_initialize_dispatch(__x.begin(), __x.end(), __false_type()); }
739 
740 #if __cplusplus >= 201103L
741       /**
742        *  @brief  %List move constructor.
743        *
744        *  The newly-created %list contains the exact contents of the moved
745        *  instance. The contents of the moved instance are a valid, but
746        *  unspecified %list.
747        */
748       list(list&&) = default;
749 
750       /**
751        *  @brief  Builds a %list from an initializer_list
752        *  @param  __l  An initializer_list of value_type.
753        *  @param  __a  An allocator object.
754        *
755        *  Create a %list consisting of copies of the elements in the
756        *  initializer_list @a __l.  This is linear in __l.size().
757        */
758       list(initializer_list<value_type> __l,
759 	   const allocator_type& __a = allocator_type())
760       : _Base(_Node_alloc_type(__a))
761       { _M_initialize_dispatch(__l.begin(), __l.end(), __false_type()); }
762 
763       list(const list& __x, const allocator_type& __a)
764       : _Base(_Node_alloc_type(__a))
765       { _M_initialize_dispatch(__x.begin(), __x.end(), __false_type()); }
766 
767     private:
768       list(list&& __x, const allocator_type& __a, true_type) noexcept
769       : _Base(_Node_alloc_type(__a), std::move(__x))
770       { }
771 
772       list(list&& __x, const allocator_type& __a, false_type)
773       : _Base(_Node_alloc_type(__a))
774       {
775 	if (__x._M_get_Node_allocator() == this->_M_get_Node_allocator())
776 	  this->_M_move_nodes(std::move(__x));
777 	else
778 	  insert(begin(), std::__make_move_if_noexcept_iterator(__x.begin()),
779 			  std::__make_move_if_noexcept_iterator(__x.end()));
780       }
781 
782     public:
783       list(list&& __x, const allocator_type& __a)
784       noexcept(_Node_alloc_traits::_S_always_equal())
785       : list(std::move(__x), __a,
786 	     typename _Node_alloc_traits::is_always_equal{})
787       { }
788 #endif
789 
790       /**
791        *  @brief  Builds a %list from a range.
792        *  @param  __first  An input iterator.
793        *  @param  __last  An input iterator.
794        *  @param  __a  An allocator object.
795        *
796        *  Create a %list consisting of copies of the elements from
797        *  [@a __first,@a __last).  This is linear in N (where N is
798        *  distance(@a __first,@a __last)).
799        */
800 #if __cplusplus >= 201103L
801       template<typename _InputIterator,
802 	       typename = std::_RequireInputIter<_InputIterator>>
803 	list(_InputIterator __first, _InputIterator __last,
804 	     const allocator_type& __a = allocator_type())
805 	: _Base(_Node_alloc_type(__a))
806 	{ _M_initialize_dispatch(__first, __last, __false_type()); }
807 #else
808       template<typename _InputIterator>
809 	list(_InputIterator __first, _InputIterator __last,
810 	     const allocator_type& __a = allocator_type())
811 	: _Base(_Node_alloc_type(__a))
812 	{
813 	  // Check whether it's an integral type.  If so, it's not an iterator.
814 	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
815 	  _M_initialize_dispatch(__first, __last, _Integral());
816 	}
817 #endif
818 
819 #if __cplusplus >= 201103L
820       /**
821        *  No explicit dtor needed as the _Base dtor takes care of
822        *  things.  The _Base dtor only erases the elements, and note
823        *  that if the elements themselves are pointers, the pointed-to
824        *  memory is not touched in any way.  Managing the pointer is
825        *  the user's responsibility.
826        */
827       ~list() = default;
828 #endif
829 
830       /**
831        *  @brief  %List assignment operator.
832        *  @param  __x  A %list of identical element and allocator types.
833        *
834        *  All the elements of @a __x are copied.
835        *
836        *  Whether the allocator is copied depends on the allocator traits.
837        */
838       list&
839       operator=(const list& __x);
840 
841 #if __cplusplus >= 201103L
842       /**
843        *  @brief  %List move assignment operator.
844        *  @param  __x  A %list of identical element and allocator types.
845        *
846        *  The contents of @a __x are moved into this %list (without copying).
847        *
848        *  Afterwards @a __x is a valid, but unspecified %list
849        *
850        *  Whether the allocator is moved depends on the allocator traits.
851        */
852       list&
853       operator=(list&& __x)
854       noexcept(_Node_alloc_traits::_S_nothrow_move())
855       {
856 	constexpr bool __move_storage =
857 	  _Node_alloc_traits::_S_propagate_on_move_assign()
858 	  || _Node_alloc_traits::_S_always_equal();
859 	_M_move_assign(std::move(__x), __bool_constant<__move_storage>());
860 	return *this;
861       }
862 
863       /**
864        *  @brief  %List initializer list assignment operator.
865        *  @param  __l  An initializer_list of value_type.
866        *
867        *  Replace the contents of the %list with copies of the elements
868        *  in the initializer_list @a __l.  This is linear in l.size().
869        */
870       list&
871       operator=(initializer_list<value_type> __l)
872       {
873 	this->assign(__l.begin(), __l.end());
874 	return *this;
875       }
876 #endif
877 
878       /**
879        *  @brief  Assigns a given value to a %list.
880        *  @param  __n  Number of elements to be assigned.
881        *  @param  __val  Value to be assigned.
882        *
883        *  This function fills a %list with @a __n copies of the given
884        *  value.  Note that the assignment completely changes the %list
885        *  and that the resulting %list's size is the same as the number
886        *  of elements assigned.
887        */
888       void
889       assign(size_type __n, const value_type& __val)
890       { _M_fill_assign(__n, __val); }
891 
892       /**
893        *  @brief  Assigns a range to a %list.
894        *  @param  __first  An input iterator.
895        *  @param  __last   An input iterator.
896        *
897        *  This function fills a %list with copies of the elements in the
898        *  range [@a __first,@a __last).
899        *
900        *  Note that the assignment completely changes the %list and
901        *  that the resulting %list's size is the same as the number of
902        *  elements assigned.
903        */
904 #if __cplusplus >= 201103L
905       template<typename _InputIterator,
906 	       typename = std::_RequireInputIter<_InputIterator>>
907 	void
908 	assign(_InputIterator __first, _InputIterator __last)
909 	{ _M_assign_dispatch(__first, __last, __false_type()); }
910 #else
911       template<typename _InputIterator>
912 	void
913 	assign(_InputIterator __first, _InputIterator __last)
914 	{
915 	  // Check whether it's an integral type.  If so, it's not an iterator.
916 	  typedef typename std::__is_integer<_InputIterator>::__type _Integral;
917 	  _M_assign_dispatch(__first, __last, _Integral());
918 	}
919 #endif
920 
921 #if __cplusplus >= 201103L
922       /**
923        *  @brief  Assigns an initializer_list to a %list.
924        *  @param  __l  An initializer_list of value_type.
925        *
926        *  Replace the contents of the %list with copies of the elements
927        *  in the initializer_list @a __l.  This is linear in __l.size().
928        */
929       void
930       assign(initializer_list<value_type> __l)
931       { this->_M_assign_dispatch(__l.begin(), __l.end(), __false_type()); }
932 #endif
933 
934       /// Get a copy of the memory allocation object.
935       allocator_type
936       get_allocator() const _GLIBCXX_NOEXCEPT
937       { return allocator_type(_Base::_M_get_Node_allocator()); }
938 
939       // iterators
940       /**
941        *  Returns a read/write iterator that points to the first element in the
942        *  %list.  Iteration is done in ordinary element order.
943        */
944       iterator
945       begin() _GLIBCXX_NOEXCEPT
946       { return iterator(this->_M_impl._M_node._M_next); }
947 
948       /**
949        *  Returns a read-only (constant) iterator that points to the
950        *  first element in the %list.  Iteration is done in ordinary
951        *  element order.
952        */
953       const_iterator
954       begin() const _GLIBCXX_NOEXCEPT
955       { return const_iterator(this->_M_impl._M_node._M_next); }
956 
957       /**
958        *  Returns a read/write iterator that points one past the last
959        *  element in the %list.  Iteration is done in ordinary element
960        *  order.
961        */
962       iterator
963       end() _GLIBCXX_NOEXCEPT
964       { return iterator(&this->_M_impl._M_node); }
965 
966       /**
967        *  Returns a read-only (constant) iterator that points one past
968        *  the last element in the %list.  Iteration is done in ordinary
969        *  element order.
970        */
971       const_iterator
972       end() const _GLIBCXX_NOEXCEPT
973       { return const_iterator(&this->_M_impl._M_node); }
974 
975       /**
976        *  Returns a read/write reverse iterator that points to the last
977        *  element in the %list.  Iteration is done in reverse element
978        *  order.
979        */
980       reverse_iterator
981       rbegin() _GLIBCXX_NOEXCEPT
982       { return reverse_iterator(end()); }
983 
984       /**
985        *  Returns a read-only (constant) reverse iterator that points to
986        *  the last element in the %list.  Iteration is done in reverse
987        *  element order.
988        */
989       const_reverse_iterator
990       rbegin() const _GLIBCXX_NOEXCEPT
991       { return const_reverse_iterator(end()); }
992 
993       /**
994        *  Returns a read/write reverse iterator that points to one
995        *  before the first element in the %list.  Iteration is done in
996        *  reverse element order.
997        */
998       reverse_iterator
999       rend() _GLIBCXX_NOEXCEPT
1000       { return reverse_iterator(begin()); }
1001 
1002       /**
1003        *  Returns a read-only (constant) reverse iterator that points to one
1004        *  before the first element in the %list.  Iteration is done in reverse
1005        *  element order.
1006        */
1007       const_reverse_iterator
1008       rend() const _GLIBCXX_NOEXCEPT
1009       { return const_reverse_iterator(begin()); }
1010 
1011 #if __cplusplus >= 201103L
1012       /**
1013        *  Returns a read-only (constant) iterator that points to the
1014        *  first element in the %list.  Iteration is done in ordinary
1015        *  element order.
1016        */
1017       const_iterator
1018       cbegin() const noexcept
1019       { return const_iterator(this->_M_impl._M_node._M_next); }
1020 
1021       /**
1022        *  Returns a read-only (constant) iterator that points one past
1023        *  the last element in the %list.  Iteration is done in ordinary
1024        *  element order.
1025        */
1026       const_iterator
1027       cend() const noexcept
1028       { return const_iterator(&this->_M_impl._M_node); }
1029 
1030       /**
1031        *  Returns a read-only (constant) reverse iterator that points to
1032        *  the last element in the %list.  Iteration is done in reverse
1033        *  element order.
1034        */
1035       const_reverse_iterator
1036       crbegin() const noexcept
1037       { return const_reverse_iterator(end()); }
1038 
1039       /**
1040        *  Returns a read-only (constant) reverse iterator that points to one
1041        *  before the first element in the %list.  Iteration is done in reverse
1042        *  element order.
1043        */
1044       const_reverse_iterator
1045       crend() const noexcept
1046       { return const_reverse_iterator(begin()); }
1047 #endif
1048 
1049       // [23.2.2.2] capacity
1050       /**
1051        *  Returns true if the %list is empty.  (Thus begin() would equal
1052        *  end().)
1053        */
1054       _GLIBCXX_NODISCARD bool
1055       empty() const _GLIBCXX_NOEXCEPT
1056       { return this->_M_impl._M_node._M_next == &this->_M_impl._M_node; }
1057 
1058       /**  Returns the number of elements in the %list.  */
1059       size_type
1060       size() const _GLIBCXX_NOEXCEPT
1061       { return _M_node_count(); }
1062 
1063       /**  Returns the size() of the largest possible %list.  */
1064       size_type
1065       max_size() const _GLIBCXX_NOEXCEPT
1066       { return _Node_alloc_traits::max_size(_M_get_Node_allocator()); }
1067 
1068 #if __cplusplus >= 201103L
1069       /**
1070        *  @brief Resizes the %list to the specified number of elements.
1071        *  @param __new_size Number of elements the %list should contain.
1072        *
1073        *  This function will %resize the %list to the specified number
1074        *  of elements.  If the number is smaller than the %list's
1075        *  current size the %list is truncated, otherwise default
1076        *  constructed elements are appended.
1077        */
1078       void
1079       resize(size_type __new_size);
1080 
1081       /**
1082        *  @brief Resizes the %list to the specified number of elements.
1083        *  @param __new_size Number of elements the %list should contain.
1084        *  @param __x Data with which new elements should be populated.
1085        *
1086        *  This function will %resize the %list to the specified number
1087        *  of elements.  If the number is smaller than the %list's
1088        *  current size the %list is truncated, otherwise the %list is
1089        *  extended and new elements are populated with given data.
1090        */
1091       void
1092       resize(size_type __new_size, const value_type& __x);
1093 #else
1094       /**
1095        *  @brief Resizes the %list to the specified number of elements.
1096        *  @param __new_size Number of elements the %list should contain.
1097        *  @param __x Data with which new elements should be populated.
1098        *
1099        *  This function will %resize the %list to the specified number
1100        *  of elements.  If the number is smaller than the %list's
1101        *  current size the %list is truncated, otherwise the %list is
1102        *  extended and new elements are populated with given data.
1103        */
1104       void
1105       resize(size_type __new_size, value_type __x = value_type());
1106 #endif
1107 
1108       // element access
1109       /**
1110        *  Returns a read/write reference to the data at the first
1111        *  element of the %list.
1112        */
1113       reference
1114       front() _GLIBCXX_NOEXCEPT
1115       { return *begin(); }
1116 
1117       /**
1118        *  Returns a read-only (constant) reference to the data at the first
1119        *  element of the %list.
1120        */
1121       const_reference
1122       front() const _GLIBCXX_NOEXCEPT
1123       { return *begin(); }
1124 
1125       /**
1126        *  Returns a read/write reference to the data at the last element
1127        *  of the %list.
1128        */
1129       reference
1130       back() _GLIBCXX_NOEXCEPT
1131       {
1132 	iterator __tmp = end();
1133 	--__tmp;
1134 	return *__tmp;
1135       }
1136 
1137       /**
1138        *  Returns a read-only (constant) reference to the data at the last
1139        *  element of the %list.
1140        */
1141       const_reference
1142       back() const _GLIBCXX_NOEXCEPT
1143       {
1144 	const_iterator __tmp = end();
1145 	--__tmp;
1146 	return *__tmp;
1147       }
1148 
1149       // [23.2.2.3] modifiers
1150       /**
1151        *  @brief  Add data to the front of the %list.
1152        *  @param  __x  Data to be added.
1153        *
1154        *  This is a typical stack operation.  The function creates an
1155        *  element at the front of the %list and assigns the given data
1156        *  to it.  Due to the nature of a %list this operation can be
1157        *  done in constant time, and does not invalidate iterators and
1158        *  references.
1159        */
1160       void
1161       push_front(const value_type& __x)
1162       { this->_M_insert(begin(), __x); }
1163 
1164 #if __cplusplus >= 201103L
1165       void
1166       push_front(value_type&& __x)
1167       { this->_M_insert(begin(), std::move(__x)); }
1168 
1169       template<typename... _Args>
1170 #if __cplusplus > 201402L
1171 	reference
1172 #else
1173 	void
1174 #endif
1175 	emplace_front(_Args&&... __args)
1176 	{
1177 	  this->_M_insert(begin(), std::forward<_Args>(__args)...);
1178 #if __cplusplus > 201402L
1179 	  return front();
1180 #endif
1181 	}
1182 #endif
1183 
1184       /**
1185        *  @brief  Removes first element.
1186        *
1187        *  This is a typical stack operation.  It shrinks the %list by
1188        *  one.  Due to the nature of a %list this operation can be done
1189        *  in constant time, and only invalidates iterators/references to
1190        *  the element being removed.
1191        *
1192        *  Note that no data is returned, and if the first element's data
1193        *  is needed, it should be retrieved before pop_front() is
1194        *  called.
1195        */
1196       void
1197       pop_front() _GLIBCXX_NOEXCEPT
1198       { this->_M_erase(begin()); }
1199 
1200       /**
1201        *  @brief  Add data to the end of the %list.
1202        *  @param  __x  Data to be added.
1203        *
1204        *  This is a typical stack operation.  The function creates an
1205        *  element at the end of the %list and assigns the given data to
1206        *  it.  Due to the nature of a %list this operation can be done
1207        *  in constant time, and does not invalidate iterators and
1208        *  references.
1209        */
1210       void
1211       push_back(const value_type& __x)
1212       { this->_M_insert(end(), __x); }
1213 
1214 #if __cplusplus >= 201103L
1215       void
1216       push_back(value_type&& __x)
1217       { this->_M_insert(end(), std::move(__x)); }
1218 
1219       template<typename... _Args>
1220 #if __cplusplus > 201402L
1221 	reference
1222 #else
1223 	void
1224 #endif
1225 	emplace_back(_Args&&... __args)
1226 	{
1227 	  this->_M_insert(end(), std::forward<_Args>(__args)...);
1228 #if __cplusplus > 201402L
1229 	return back();
1230 #endif
1231 	}
1232 #endif
1233 
1234       /**
1235        *  @brief  Removes last element.
1236        *
1237        *  This is a typical stack operation.  It shrinks the %list by
1238        *  one.  Due to the nature of a %list this operation can be done
1239        *  in constant time, and only invalidates iterators/references to
1240        *  the element being removed.
1241        *
1242        *  Note that no data is returned, and if the last element's data
1243        *  is needed, it should be retrieved before pop_back() is called.
1244        */
1245       void
1246       pop_back() _GLIBCXX_NOEXCEPT
1247       { this->_M_erase(iterator(this->_M_impl._M_node._M_prev)); }
1248 
1249 #if __cplusplus >= 201103L
1250       /**
1251        *  @brief  Constructs object in %list before specified iterator.
1252        *  @param  __position  A const_iterator into the %list.
1253        *  @param  __args  Arguments.
1254        *  @return  An iterator that points to the inserted data.
1255        *
1256        *  This function will insert an object of type T constructed
1257        *  with T(std::forward<Args>(args)...) before the specified
1258        *  location.  Due to the nature of a %list this operation can
1259        *  be done in constant time, and does not invalidate iterators
1260        *  and references.
1261        */
1262       template<typename... _Args>
1263 	iterator
1264 	emplace(const_iterator __position, _Args&&... __args);
1265 
1266       /**
1267        *  @brief  Inserts given value into %list before specified iterator.
1268        *  @param  __position  A const_iterator into the %list.
1269        *  @param  __x  Data to be inserted.
1270        *  @return  An iterator that points to the inserted data.
1271        *
1272        *  This function will insert a copy of the given value before
1273        *  the specified location.  Due to the nature of a %list this
1274        *  operation can be done in constant time, and does not
1275        *  invalidate iterators and references.
1276        */
1277       iterator
1278       insert(const_iterator __position, const value_type& __x);
1279 #else
1280       /**
1281        *  @brief  Inserts given value into %list before specified iterator.
1282        *  @param  __position  An iterator into the %list.
1283        *  @param  __x  Data to be inserted.
1284        *  @return  An iterator that points to the inserted data.
1285        *
1286        *  This function will insert a copy of the given value before
1287        *  the specified location.  Due to the nature of a %list this
1288        *  operation can be done in constant time, and does not
1289        *  invalidate iterators and references.
1290        */
1291       iterator
1292       insert(iterator __position, const value_type& __x);
1293 #endif
1294 
1295 #if __cplusplus >= 201103L
1296       /**
1297        *  @brief  Inserts given rvalue into %list before specified iterator.
1298        *  @param  __position  A const_iterator into the %list.
1299        *  @param  __x  Data to be inserted.
1300        *  @return  An iterator that points to the inserted data.
1301        *
1302        *  This function will insert a copy of the given rvalue before
1303        *  the specified location.  Due to the nature of a %list this
1304        *  operation can be done in constant time, and does not
1305        *  invalidate iterators and references.
1306 	*/
1307       iterator
1308       insert(const_iterator __position, value_type&& __x)
1309       { return emplace(__position, std::move(__x)); }
1310 
1311       /**
1312        *  @brief  Inserts the contents of an initializer_list into %list
1313        *          before specified const_iterator.
1314        *  @param  __p  A const_iterator into the %list.
1315        *  @param  __l  An initializer_list of value_type.
1316        *  @return  An iterator pointing to the first element inserted
1317        *           (or __position).
1318        *
1319        *  This function will insert copies of the data in the
1320        *  initializer_list @a l into the %list before the location
1321        *  specified by @a p.
1322        *
1323        *  This operation is linear in the number of elements inserted and
1324        *  does not invalidate iterators and references.
1325        */
1326       iterator
1327       insert(const_iterator __p, initializer_list<value_type> __l)
1328       { return this->insert(__p, __l.begin(), __l.end()); }
1329 #endif
1330 
1331 #if __cplusplus >= 201103L
1332       /**
1333        *  @brief  Inserts a number of copies of given data into the %list.
1334        *  @param  __position  A const_iterator into the %list.
1335        *  @param  __n  Number of elements to be inserted.
1336        *  @param  __x  Data to be inserted.
1337        *  @return  An iterator pointing to the first element inserted
1338        *           (or __position).
1339        *
1340        *  This function will insert a specified number of copies of the
1341        *  given data before the location specified by @a position.
1342        *
1343        *  This operation is linear in the number of elements inserted and
1344        *  does not invalidate iterators and references.
1345        */
1346       iterator
1347       insert(const_iterator __position, size_type __n, const value_type& __x);
1348 #else
1349       /**
1350        *  @brief  Inserts a number of copies of given data into the %list.
1351        *  @param  __position  An iterator into the %list.
1352        *  @param  __n  Number of elements to be inserted.
1353        *  @param  __x  Data to be inserted.
1354        *
1355        *  This function will insert a specified number of copies of the
1356        *  given data before the location specified by @a position.
1357        *
1358        *  This operation is linear in the number of elements inserted and
1359        *  does not invalidate iterators and references.
1360        */
1361       void
1362       insert(iterator __position, size_type __n, const value_type& __x)
1363       {
1364 	list __tmp(__n, __x, get_allocator());
1365 	splice(__position, __tmp);
1366       }
1367 #endif
1368 
1369 #if __cplusplus >= 201103L
1370       /**
1371        *  @brief  Inserts a range into the %list.
1372        *  @param  __position  A const_iterator into the %list.
1373        *  @param  __first  An input iterator.
1374        *  @param  __last   An input iterator.
1375        *  @return  An iterator pointing to the first element inserted
1376        *           (or __position).
1377        *
1378        *  This function will insert copies of the data in the range [@a
1379        *  first,@a last) into the %list before the location specified by
1380        *  @a position.
1381        *
1382        *  This operation is linear in the number of elements inserted and
1383        *  does not invalidate iterators and references.
1384        */
1385       template<typename _InputIterator,
1386 	       typename = std::_RequireInputIter<_InputIterator>>
1387 	iterator
1388 	insert(const_iterator __position, _InputIterator __first,
1389 	       _InputIterator __last);
1390 #else
1391       /**
1392        *  @brief  Inserts a range into the %list.
1393        *  @param  __position  An iterator into the %list.
1394        *  @param  __first  An input iterator.
1395        *  @param  __last   An input iterator.
1396        *
1397        *  This function will insert copies of the data in the range [@a
1398        *  first,@a last) into the %list before the location specified by
1399        *  @a position.
1400        *
1401        *  This operation is linear in the number of elements inserted and
1402        *  does not invalidate iterators and references.
1403        */
1404       template<typename _InputIterator>
1405 	void
1406 	insert(iterator __position, _InputIterator __first,
1407 	       _InputIterator __last)
1408 	{
1409 	  list __tmp(__first, __last, get_allocator());
1410 	  splice(__position, __tmp);
1411 	}
1412 #endif
1413 
1414       /**
1415        *  @brief  Remove element at given position.
1416        *  @param  __position  Iterator pointing to element to be erased.
1417        *  @return  An iterator pointing to the next element (or end()).
1418        *
1419        *  This function will erase the element at the given position and thus
1420        *  shorten the %list by one.
1421        *
1422        *  Due to the nature of a %list this operation can be done in
1423        *  constant time, and only invalidates iterators/references to
1424        *  the element being removed.  The user is also cautioned that
1425        *  this function only erases the element, and that if the element
1426        *  is itself a pointer, the pointed-to memory is not touched in
1427        *  any way.  Managing the pointer is the user's responsibility.
1428        */
1429       iterator
1430 #if __cplusplus >= 201103L
1431       erase(const_iterator __position) noexcept;
1432 #else
1433       erase(iterator __position);
1434 #endif
1435 
1436       /**
1437        *  @brief  Remove a range of elements.
1438        *  @param  __first  Iterator pointing to the first element to be erased.
1439        *  @param  __last  Iterator pointing to one past the last element to be
1440        *                erased.
1441        *  @return  An iterator pointing to the element pointed to by @a last
1442        *           prior to erasing (or end()).
1443        *
1444        *  This function will erase the elements in the range @a
1445        *  [first,last) and shorten the %list accordingly.
1446        *
1447        *  This operation is linear time in the size of the range and only
1448        *  invalidates iterators/references to the element being removed.
1449        *  The user is also cautioned that this function only erases the
1450        *  elements, and that if the elements themselves are pointers, the
1451        *  pointed-to memory is not touched in any way.  Managing the pointer
1452        *  is the user's responsibility.
1453        */
1454       iterator
1455 #if __cplusplus >= 201103L
1456       erase(const_iterator __first, const_iterator __last) noexcept
1457 #else
1458       erase(iterator __first, iterator __last)
1459 #endif
1460       {
1461 	while (__first != __last)
1462 	  __first = erase(__first);
1463 	return __last._M_const_cast();
1464       }
1465 
1466       /**
1467        *  @brief  Swaps data with another %list.
1468        *  @param  __x  A %list of the same element and allocator types.
1469        *
1470        *  This exchanges the elements between two lists in constant
1471        *  time.  Note that the global std::swap() function is
1472        *  specialized such that std::swap(l1,l2) will feed to this
1473        *  function.
1474        *
1475        *  Whether the allocators are swapped depends on the allocator traits.
1476        */
1477       void
1478       swap(list& __x) _GLIBCXX_NOEXCEPT
1479       {
1480 	__detail::_List_node_base::swap(this->_M_impl._M_node,
1481 					__x._M_impl._M_node);
1482 
1483 	size_t __xsize = __x._M_get_size();
1484 	__x._M_set_size(this->_M_get_size());
1485 	this->_M_set_size(__xsize);
1486 
1487 	_Node_alloc_traits::_S_on_swap(this->_M_get_Node_allocator(),
1488 				       __x._M_get_Node_allocator());
1489       }
1490 
1491       /**
1492        *  Erases all the elements.  Note that this function only erases
1493        *  the elements, and that if the elements themselves are
1494        *  pointers, the pointed-to memory is not touched in any way.
1495        *  Managing the pointer is the user's responsibility.
1496        */
1497       void
1498       clear() _GLIBCXX_NOEXCEPT
1499       {
1500 	_Base::_M_clear();
1501 	_Base::_M_init();
1502       }
1503 
1504       // [23.2.2.4] list operations
1505       /**
1506        *  @brief  Insert contents of another %list.
1507        *  @param  __position  Iterator referencing the element to insert before.
1508        *  @param  __x  Source list.
1509        *
1510        *  The elements of @a __x are inserted in constant time in front of
1511        *  the element referenced by @a __position.  @a __x becomes an empty
1512        *  list.
1513        *
1514        *  Requires this != @a __x.
1515        */
1516       void
1517 #if __cplusplus >= 201103L
1518       splice(const_iterator __position, list&& __x) noexcept
1519 #else
1520       splice(iterator __position, list& __x)
1521 #endif
1522       {
1523 	if (!__x.empty())
1524 	  {
1525 	    _M_check_equal_allocators(__x);
1526 
1527 	    this->_M_transfer(__position._M_const_cast(),
1528 			      __x.begin(), __x.end());
1529 
1530 	    this->_M_inc_size(__x._M_get_size());
1531 	    __x._M_set_size(0);
1532 	  }
1533       }
1534 
1535 #if __cplusplus >= 201103L
1536       void
1537       splice(const_iterator __position, list& __x) noexcept
1538       { splice(__position, std::move(__x)); }
1539 #endif
1540 
1541 #if __cplusplus >= 201103L
1542       /**
1543        *  @brief  Insert element from another %list.
1544        *  @param  __position  Const_iterator referencing the element to
1545        *                      insert before.
1546        *  @param  __x  Source list.
1547        *  @param  __i  Const_iterator referencing the element to move.
1548        *
1549        *  Removes the element in list @a __x referenced by @a __i and
1550        *  inserts it into the current list before @a __position.
1551        */
1552       void
1553       splice(const_iterator __position, list&& __x, const_iterator __i) noexcept
1554 #else
1555       /**
1556        *  @brief  Insert element from another %list.
1557        *  @param  __position  Iterator referencing the element to insert before.
1558        *  @param  __x  Source list.
1559        *  @param  __i  Iterator referencing the element to move.
1560        *
1561        *  Removes the element in list @a __x referenced by @a __i and
1562        *  inserts it into the current list before @a __position.
1563        */
1564       void
1565       splice(iterator __position, list& __x, iterator __i)
1566 #endif
1567       {
1568 	iterator __j = __i._M_const_cast();
1569 	++__j;
1570 	if (__position == __i || __position == __j)
1571 	  return;
1572 
1573 	if (this != std::__addressof(__x))
1574 	  _M_check_equal_allocators(__x);
1575 
1576 	this->_M_transfer(__position._M_const_cast(),
1577 			  __i._M_const_cast(), __j);
1578 
1579 	this->_M_inc_size(1);
1580 	__x._M_dec_size(1);
1581       }
1582 
1583 #if __cplusplus >= 201103L
1584       /**
1585        *  @brief  Insert element from another %list.
1586        *  @param  __position  Const_iterator referencing the element to
1587        *                      insert before.
1588        *  @param  __x  Source list.
1589        *  @param  __i  Const_iterator referencing the element to move.
1590        *
1591        *  Removes the element in list @a __x referenced by @a __i and
1592        *  inserts it into the current list before @a __position.
1593        */
1594       void
1595       splice(const_iterator __position, list& __x, const_iterator __i) noexcept
1596       { splice(__position, std::move(__x), __i); }
1597 #endif
1598 
1599 #if __cplusplus >= 201103L
1600       /**
1601        *  @brief  Insert range from another %list.
1602        *  @param  __position  Const_iterator referencing the element to
1603        *                      insert before.
1604        *  @param  __x  Source list.
1605        *  @param  __first  Const_iterator referencing the start of range in x.
1606        *  @param  __last  Const_iterator referencing the end of range in x.
1607        *
1608        *  Removes elements in the range [__first,__last) and inserts them
1609        *  before @a __position in constant time.
1610        *
1611        *  Undefined if @a __position is in [__first,__last).
1612        */
1613       void
1614       splice(const_iterator __position, list&& __x, const_iterator __first,
1615 	     const_iterator __last) noexcept
1616 #else
1617       /**
1618        *  @brief  Insert range from another %list.
1619        *  @param  __position  Iterator referencing the element to insert before.
1620        *  @param  __x  Source list.
1621        *  @param  __first  Iterator referencing the start of range in x.
1622        *  @param  __last  Iterator referencing the end of range in x.
1623        *
1624        *  Removes elements in the range [__first,__last) and inserts them
1625        *  before @a __position in constant time.
1626        *
1627        *  Undefined if @a __position is in [__first,__last).
1628        */
1629       void
1630       splice(iterator __position, list& __x, iterator __first,
1631 	     iterator __last)
1632 #endif
1633       {
1634 	if (__first != __last)
1635 	  {
1636 	    if (this != std::__addressof(__x))
1637 	      _M_check_equal_allocators(__x);
1638 
1639 	    size_t __n = _S_distance(__first, __last);
1640 	    this->_M_inc_size(__n);
1641 	    __x._M_dec_size(__n);
1642 
1643 	    this->_M_transfer(__position._M_const_cast(),
1644 			      __first._M_const_cast(),
1645 			      __last._M_const_cast());
1646 	  }
1647       }
1648 
1649 #if __cplusplus >= 201103L
1650       /**
1651        *  @brief  Insert range from another %list.
1652        *  @param  __position  Const_iterator referencing the element to
1653        *                      insert before.
1654        *  @param  __x  Source list.
1655        *  @param  __first  Const_iterator referencing the start of range in x.
1656        *  @param  __last  Const_iterator referencing the end of range in x.
1657        *
1658        *  Removes elements in the range [__first,__last) and inserts them
1659        *  before @a __position in constant time.
1660        *
1661        *  Undefined if @a __position is in [__first,__last).
1662        */
1663       void
1664       splice(const_iterator __position, list& __x, const_iterator __first,
1665 	     const_iterator __last) noexcept
1666       { splice(__position, std::move(__x), __first, __last); }
1667 #endif
1668 
1669     private:
1670 #if __cplusplus > 201703L
1671 # define __cpp_lib_list_remove_return_type 201806L
1672       typedef size_type __remove_return_type;
1673 # define _GLIBCXX_LIST_REMOVE_RETURN_TYPE_TAG \
1674       __attribute__((__abi_tag__("__cxx20")))
1675 #else
1676       typedef void __remove_return_type;
1677 # define _GLIBCXX_LIST_REMOVE_RETURN_TYPE_TAG
1678 #endif
1679     public:
1680 
1681       /**
1682        *  @brief  Remove all elements equal to value.
1683        *  @param  __value  The value to remove.
1684        *
1685        *  Removes every element in the list equal to @a value.
1686        *  Remaining elements stay in list order.  Note that this
1687        *  function only erases the elements, and that if the elements
1688        *  themselves are pointers, the pointed-to memory is not
1689        *  touched in any way.  Managing the pointer is the user's
1690        *  responsibility.
1691        */
1692       _GLIBCXX_LIST_REMOVE_RETURN_TYPE_TAG
1693       __remove_return_type
1694       remove(const _Tp& __value);
1695 
1696       /**
1697        *  @brief  Remove all elements satisfying a predicate.
1698        *  @tparam  _Predicate  Unary predicate function or object.
1699        *
1700        *  Removes every element in the list for which the predicate
1701        *  returns true.  Remaining elements stay in list order.  Note
1702        *  that this function only erases the elements, and that if the
1703        *  elements themselves are pointers, the pointed-to memory is
1704        *  not touched in any way.  Managing the pointer is the user's
1705        *  responsibility.
1706        */
1707       template<typename _Predicate>
1708 	__remove_return_type
1709 	remove_if(_Predicate);
1710 
1711       /**
1712        *  @brief  Remove consecutive duplicate elements.
1713        *
1714        *  For each consecutive set of elements with the same value,
1715        *  remove all but the first one.  Remaining elements stay in
1716        *  list order.  Note that this function only erases the
1717        *  elements, and that if the elements themselves are pointers,
1718        *  the pointed-to memory is not touched in any way.  Managing
1719        *  the pointer is the user's responsibility.
1720        */
1721       _GLIBCXX_LIST_REMOVE_RETURN_TYPE_TAG
1722       __remove_return_type
1723       unique();
1724 
1725       /**
1726        *  @brief  Remove consecutive elements satisfying a predicate.
1727        *  @tparam _BinaryPredicate  Binary predicate function or object.
1728        *
1729        *  For each consecutive set of elements [first,last) that
1730        *  satisfy predicate(first,i) where i is an iterator in
1731        *  [first,last), remove all but the first one.  Remaining
1732        *  elements stay in list order.  Note that this function only
1733        *  erases the elements, and that if the elements themselves are
1734        *  pointers, the pointed-to memory is not touched in any way.
1735        *  Managing the pointer is the user's responsibility.
1736        */
1737       template<typename _BinaryPredicate>
1738 	__remove_return_type
1739 	unique(_BinaryPredicate);
1740 
1741 #undef _GLIBCXX_LIST_REMOVE_RETURN_TYPE_TAG
1742 
1743       /**
1744        *  @brief  Merge sorted lists.
1745        *  @param  __x  Sorted list to merge.
1746        *
1747        *  Assumes that both @a __x and this list are sorted according to
1748        *  operator<().  Merges elements of @a __x into this list in
1749        *  sorted order, leaving @a __x empty when complete.  Elements in
1750        *  this list precede elements in @a __x that are equal.
1751        */
1752 #if __cplusplus >= 201103L
1753       void
1754       merge(list&& __x);
1755 
1756       void
1757       merge(list& __x)
1758       { merge(std::move(__x)); }
1759 #else
1760       void
1761       merge(list& __x);
1762 #endif
1763 
1764       /**
1765        *  @brief  Merge sorted lists according to comparison function.
1766        *  @tparam _StrictWeakOrdering Comparison function defining
1767        *  sort order.
1768        *  @param  __x  Sorted list to merge.
1769        *  @param  __comp  Comparison functor.
1770        *
1771        *  Assumes that both @a __x and this list are sorted according to
1772        *  StrictWeakOrdering.  Merges elements of @a __x into this list
1773        *  in sorted order, leaving @a __x empty when complete.  Elements
1774        *  in this list precede elements in @a __x that are equivalent
1775        *  according to StrictWeakOrdering().
1776        */
1777 #if __cplusplus >= 201103L
1778       template<typename _StrictWeakOrdering>
1779 	void
1780 	merge(list&& __x, _StrictWeakOrdering __comp);
1781 
1782       template<typename _StrictWeakOrdering>
1783 	void
1784 	merge(list& __x, _StrictWeakOrdering __comp)
1785 	{ merge(std::move(__x), __comp); }
1786 #else
1787       template<typename _StrictWeakOrdering>
1788 	void
1789 	merge(list& __x, _StrictWeakOrdering __comp);
1790 #endif
1791 
1792       /**
1793        *  @brief  Reverse the elements in list.
1794        *
1795        *  Reverse the order of elements in the list in linear time.
1796        */
1797       void
1798       reverse() _GLIBCXX_NOEXCEPT
1799       { this->_M_impl._M_node._M_reverse(); }
1800 
1801       /**
1802        *  @brief  Sort the elements.
1803        *
1804        *  Sorts the elements of this list in NlogN time.  Equivalent
1805        *  elements remain in list order.
1806        */
1807       void
1808       sort();
1809 
1810       /**
1811        *  @brief  Sort the elements according to comparison function.
1812        *
1813        *  Sorts the elements of this list in NlogN time.  Equivalent
1814        *  elements remain in list order.
1815        */
1816       template<typename _StrictWeakOrdering>
1817 	void
1818 	sort(_StrictWeakOrdering);
1819 
1820     protected:
1821       // Internal constructor functions follow.
1822 
1823       // Called by the range constructor to implement [23.1.1]/9
1824 
1825       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1826       // 438. Ambiguity in the "do the right thing" clause
1827       template<typename _Integer>
1828 	void
1829 	_M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
1830 	{ _M_fill_initialize(static_cast<size_type>(__n), __x); }
1831 
1832       // Called by the range constructor to implement [23.1.1]/9
1833       template<typename _InputIterator>
1834 	void
1835 	_M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
1836 			       __false_type)
1837 	{
1838 	  for (; __first != __last; ++__first)
1839 #if __cplusplus >= 201103L
1840 	    emplace_back(*__first);
1841 #else
1842 	    push_back(*__first);
1843 #endif
1844 	}
1845 
1846       // Called by list(n,v,a), and the range constructor when it turns out
1847       // to be the same thing.
1848       void
1849       _M_fill_initialize(size_type __n, const value_type& __x)
1850       {
1851 	for (; __n; --__n)
1852 	  push_back(__x);
1853       }
1854 
1855 #if __cplusplus >= 201103L
1856       // Called by list(n).
1857       void
1858       _M_default_initialize(size_type __n)
1859       {
1860 	for (; __n; --__n)
1861 	  emplace_back();
1862       }
1863 
1864       // Called by resize(sz).
1865       void
1866       _M_default_append(size_type __n);
1867 #endif
1868 
1869       // Internal assign functions follow.
1870 
1871       // Called by the range assign to implement [23.1.1]/9
1872 
1873       // _GLIBCXX_RESOLVE_LIB_DEFECTS
1874       // 438. Ambiguity in the "do the right thing" clause
1875       template<typename _Integer>
1876 	void
1877 	_M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
1878 	{ _M_fill_assign(__n, __val); }
1879 
1880       // Called by the range assign to implement [23.1.1]/9
1881       template<typename _InputIterator>
1882 	void
1883 	_M_assign_dispatch(_InputIterator __first, _InputIterator __last,
1884 			   __false_type);
1885 
1886       // Called by assign(n,t), and the range assign when it turns out
1887       // to be the same thing.
1888       void
1889       _M_fill_assign(size_type __n, const value_type& __val);
1890 
1891 
1892       // Moves the elements from [first,last) before position.
1893       void
1894       _M_transfer(iterator __position, iterator __first, iterator __last)
1895       { __position._M_node->_M_transfer(__first._M_node, __last._M_node); }
1896 
1897       // Inserts new element at position given and with value given.
1898 #if __cplusplus < 201103L
1899       void
1900       _M_insert(iterator __position, const value_type& __x)
1901       {
1902 	_Node* __tmp = _M_create_node(__x);
1903 	__tmp->_M_hook(__position._M_node);
1904 	this->_M_inc_size(1);
1905       }
1906 #else
1907      template<typename... _Args>
1908        void
1909        _M_insert(iterator __position, _Args&&... __args)
1910        {
1911 	 _Node* __tmp = _M_create_node(std::forward<_Args>(__args)...);
1912 	 __tmp->_M_hook(__position._M_node);
1913 	 this->_M_inc_size(1);
1914        }
1915 #endif
1916 
1917       // Erases element at position given.
1918       void
1919       _M_erase(iterator __position) _GLIBCXX_NOEXCEPT
1920       {
1921 	this->_M_dec_size(1);
1922 	__position._M_node->_M_unhook();
1923 	_Node* __n = static_cast<_Node*>(__position._M_node);
1924 #if __cplusplus >= 201103L
1925 	_Node_alloc_traits::destroy(_M_get_Node_allocator(), __n->_M_valptr());
1926 #else
1927 	_Tp_alloc_type(_M_get_Node_allocator()).destroy(__n->_M_valptr());
1928 #endif
1929 
1930 	_M_put_node(__n);
1931       }
1932 
1933       // To implement the splice (and merge) bits of N1599.
1934       void
1935       _M_check_equal_allocators(list& __x) _GLIBCXX_NOEXCEPT
1936       {
1937 	if (std::__alloc_neq<typename _Base::_Node_alloc_type>::
1938 	    _S_do_it(_M_get_Node_allocator(), __x._M_get_Node_allocator()))
1939 	  __builtin_abort();
1940       }
1941 
1942       // Used to implement resize.
1943       const_iterator
1944       _M_resize_pos(size_type& __new_size) const;
1945 
1946 #if __cplusplus >= 201103L
1947       void
1948       _M_move_assign(list&& __x, true_type) noexcept
1949       {
1950 	this->_M_clear();
1951 	this->_M_move_nodes(std::move(__x));
1952 	std::__alloc_on_move(this->_M_get_Node_allocator(),
1953 			     __x._M_get_Node_allocator());
1954       }
1955 
1956       void
1957       _M_move_assign(list&& __x, false_type)
1958       {
1959 	if (__x._M_get_Node_allocator() == this->_M_get_Node_allocator())
1960 	  _M_move_assign(std::move(__x), true_type{});
1961 	else
1962 	  // The rvalue's allocator cannot be moved, or is not equal,
1963 	  // so we need to individually move each element.
1964 	  _M_assign_dispatch(std::make_move_iterator(__x.begin()),
1965 			     std::make_move_iterator(__x.end()),
1966 			     __false_type{});
1967       }
1968 #endif
1969     };
1970 
1971 #if __cpp_deduction_guides >= 201606
1972   template<typename _InputIterator, typename _ValT
1973 	     = typename iterator_traits<_InputIterator>::value_type,
1974 	   typename _Allocator = allocator<_ValT>,
1975 	   typename = _RequireInputIter<_InputIterator>,
1976 	   typename = _RequireAllocator<_Allocator>>
1977     list(_InputIterator, _InputIterator, _Allocator = _Allocator())
1978       -> list<_ValT, _Allocator>;
1979 #endif
1980 
1981 _GLIBCXX_END_NAMESPACE_CXX11
1982 
1983   /**
1984    *  @brief  List equality comparison.
1985    *  @param  __x  A %list.
1986    *  @param  __y  A %list of the same type as @a __x.
1987    *  @return  True iff the size and elements of the lists are equal.
1988    *
1989    *  This is an equivalence relation.  It is linear in the size of
1990    *  the lists.  Lists are considered equivalent if their sizes are
1991    *  equal, and if corresponding elements compare equal.
1992   */
1993   template<typename _Tp, typename _Alloc>
1994     inline bool
1995     operator==(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
1996     {
1997 #if _GLIBCXX_USE_CXX11_ABI
1998       if (__x.size() != __y.size())
1999 	return false;
2000 #endif
2001 
2002       typedef typename list<_Tp, _Alloc>::const_iterator const_iterator;
2003       const_iterator __end1 = __x.end();
2004       const_iterator __end2 = __y.end();
2005 
2006       const_iterator __i1 = __x.begin();
2007       const_iterator __i2 = __y.begin();
2008       while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2)
2009 	{
2010 	  ++__i1;
2011 	  ++__i2;
2012 	}
2013       return __i1 == __end1 && __i2 == __end2;
2014     }
2015 
2016 #if __cpp_lib_three_way_comparison
2017 /**
2018    *  @brief  List ordering relation.
2019    *  @param  __x  A `list`.
2020    *  @param  __y  A `list` of the same type as `__x`.
2021    *  @return  A value indicating whether `__x` is less than, equal to,
2022    *           greater than, or incomparable with `__y`.
2023    *
2024    *  See `std::lexicographical_compare_three_way()` for how the determination
2025    *  is made. This operator is used to synthesize relational operators like
2026    *  `<` and `>=` etc.
2027   */
2028   template<typename _Tp, typename _Alloc>
2029     inline __detail::__synth3way_t<_Tp>
2030     operator<=>(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2031     {
2032       return std::lexicographical_compare_three_way(__x.begin(), __x.end(),
2033 						    __y.begin(), __y.end(),
2034 						    __detail::__synth3way);
2035     }
2036 #else
2037   /**
2038    *  @brief  List ordering relation.
2039    *  @param  __x  A %list.
2040    *  @param  __y  A %list of the same type as @a __x.
2041    *  @return  True iff @a __x is lexicographically less than @a __y.
2042    *
2043    *  This is a total ordering relation.  It is linear in the size of the
2044    *  lists.  The elements must be comparable with @c <.
2045    *
2046    *  See std::lexicographical_compare() for how the determination is made.
2047   */
2048   template<typename _Tp, typename _Alloc>
2049     inline bool
2050     operator<(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2051     { return std::lexicographical_compare(__x.begin(), __x.end(),
2052 					  __y.begin(), __y.end()); }
2053 
2054   /// Based on operator==
2055   template<typename _Tp, typename _Alloc>
2056     inline bool
2057     operator!=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2058     { return !(__x == __y); }
2059 
2060   /// Based on operator<
2061   template<typename _Tp, typename _Alloc>
2062     inline bool
2063     operator>(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2064     { return __y < __x; }
2065 
2066   /// Based on operator<
2067   template<typename _Tp, typename _Alloc>
2068     inline bool
2069     operator<=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2070     { return !(__y < __x); }
2071 
2072   /// Based on operator<
2073   template<typename _Tp, typename _Alloc>
2074     inline bool
2075     operator>=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2076     { return !(__x < __y); }
2077 #endif // three-way comparison
2078 
2079   /// See std::list::swap().
2080   template<typename _Tp, typename _Alloc>
2081     inline void
2082     swap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y)
2083     _GLIBCXX_NOEXCEPT_IF(noexcept(__x.swap(__y)))
2084     { __x.swap(__y); }
2085 
2086 _GLIBCXX_END_NAMESPACE_CONTAINER
2087 
2088 #if _GLIBCXX_USE_CXX11_ABI
2089 
2090   // Detect when distance is used to compute the size of the whole list.
2091   template<typename _Tp>
2092     inline ptrdiff_t
2093     __distance(_GLIBCXX_STD_C::_List_iterator<_Tp> __first,
2094 	       _GLIBCXX_STD_C::_List_iterator<_Tp> __last,
2095 	       input_iterator_tag __tag)
2096     {
2097       typedef _GLIBCXX_STD_C::_List_const_iterator<_Tp> _CIter;
2098       return std::__distance(_CIter(__first), _CIter(__last), __tag);
2099     }
2100 
2101   template<typename _Tp>
2102     inline ptrdiff_t
2103     __distance(_GLIBCXX_STD_C::_List_const_iterator<_Tp> __first,
2104 	       _GLIBCXX_STD_C::_List_const_iterator<_Tp> __last,
2105 	       input_iterator_tag)
2106     {
2107       typedef __detail::_List_node_header _Sentinel;
2108       _GLIBCXX_STD_C::_List_const_iterator<_Tp> __beyond = __last;
2109       ++__beyond;
2110       const bool __whole = __first == __beyond;
2111       if (__builtin_constant_p (__whole) && __whole)
2112 	return static_cast<const _Sentinel*>(__last._M_node)->_M_size;
2113 
2114       ptrdiff_t __n = 0;
2115       while (__first != __last)
2116 	{
2117 	  ++__first;
2118 	  ++__n;
2119 	}
2120       return __n;
2121     }
2122 #endif
2123 
2124 _GLIBCXX_END_NAMESPACE_VERSION
2125 } // namespace std
2126 
2127 #endif /* _STL_LIST_H */
2128