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