Clang Project

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