LCOV - code coverage report
Current view: top level - usr/include/c++/7/bits - stl_list.h (source / functions) Hit Total Coverage
Test: Coverage inastemp Lines: 37 37 100.0 %
Date: 2022-03-17 09:48:28 Functions: 128 128 100.0 %

          Line data    Source code
       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             : 
      67             : namespace 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_base* const __first,
      90             :                   _List_node_base* const __last) _GLIBCXX_USE_NOEXCEPT;
      91             : 
      92             :       void
      93             :       _M_reverse() _GLIBCXX_USE_NOEXCEPT;
      94             : 
      95             :       void
      96             :       _M_hook(_List_node_base* const __position) _GLIBCXX_USE_NOEXCEPT;
      97             : 
      98             :       void
      99             :       _M_unhook() _GLIBCXX_USE_NOEXCEPT;
     100             :     };
     101             : 
     102             :   _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        1716 :       _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         528 :       { 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         132 :         _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& __x) const _GLIBCXX_NOEXCEPT
     191             :       { return _M_node == __x._M_node; }
     192             : 
     193             :       bool
     194             :       operator!=(const _Self& __x) const _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          99 :       _List_const_iterator(const iterator& __x) _GLIBCXX_NOEXCEPT
     228          99 :       : _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& __x) const _GLIBCXX_NOEXCEPT
     275             :       { return _M_node == __x._M_node; }
     276             : 
     277             :       bool
     278             :       operator!=(const _Self& __x) const _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          99 :       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          99 :         _List_impl() _GLIBCXX_NOEXCEPT
     333          99 :         : _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&& __a) noexcept
     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         396 :       void _M_set_size(size_t __n) { *_M_impl._M_node._M_valptr() = __n; }
     353             : 
     354         264 :       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* __last) const
     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         264 :       { return _Node_alloc_traits::allocate(_M_impl, 1); }
     384             : 
     385             :       void
     386             :       _M_put_node(typename _Node_alloc_traits::pointer __p) _GLIBCXX_NOEXCEPT
     387         264 :       { _Node_alloc_traits::deallocate(_M_impl, __p, 1); }
     388             : 
     389             :   public:
     390             :       typedef _Alloc allocator_type;
     391             : 
     392             :       _Node_alloc_type&
     393             :       _M_get_Node_allocator() _GLIBCXX_NOEXCEPT
     394         132 :       { 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         198 :       : _M_impl()
     402          99 :       { _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&& __x) noexcept
     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             :         auto* const __xnode = std::__addressof(__x._M_impl._M_node);
     426             :         if (__xnode->_M_next == __xnode)
     427             :           _M_init();
     428             :         else
     429             :           {
     430             :             auto* const __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         198 :       { _M_clear(); }
     443             : 
     444             :       void
     445             :       _M_clear() _GLIBCXX_NOEXCEPT;
     446             : 
     447             :       void
     448             :       _M_init() _GLIBCXX_NOEXCEPT
     449             :       {
     450         198 :         this->_M_impl._M_node._M_next = &this->_M_impl._M_node;
     451         198 :         this->_M_impl._M_node._M_prev = &this->_M_impl._M_node;
     452         198 :         _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         132 :         _M_create_node(_Args&&... __args)
     571             :         {
     572         264 :           auto __p = this->_M_get_node();
     573         264 :           auto& __alloc = _M_get_Node_allocator();
     574         264 :           __allocated_ptr<_Node_alloc_type> __guard{__alloc, __p};
     575         396 :           _Node_alloc_traits::construct(__alloc, __p->_M_valptr(),
     576             :                                         std::forward<_Args>(__args)...);
     577         264 :           __guard = nullptr;
     578         264 :           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         198 :       : _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 __n, const 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 __n, const 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&& __x) noexcept
     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& __x, const allocator_type& __a)
     682             :       : _Base(_Node_alloc_type(__a))
     683             :       { _M_initialize_dispatch(__x.begin(), __x.end(), __false_type()); }
     684             : 
     685             :       list(list&& __x, const 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         198 :       ~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 __n, const 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          99 :       { 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         231 :       { 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_size, const 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         132 :       push_back(const value_type& __x)
    1118         264 :       { 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 __position, const 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 __position, value_type&& __x)
    1215             :       { return emplace(__position, std::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 __p, initializer_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 __position, size_type __n, const 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 __position) noexcept;
    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 __first, const_iterator __last) noexcept
    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          99 :         _Base::_M_clear();
    1407         198 :         _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&& __x) noexcept
    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& __x) noexcept
    1444             :       { splice(__position, std::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&& __x, const_iterator __i) noexcept
    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& __x, const_iterator __i) noexcept
    1502             :       { splice(__position, std::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&& __x, const_iterator __first,
    1521             :              const_iterator __last) noexcept
    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& __x, const_iterator __first,
    1571             :              const_iterator __last) noexcept
    1572             :       { splice(__position, std::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 __n, const 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 __n, const value_type& __val);
    1780             : 
    1781             : 
    1782             :       // Moves the elements from [first,last) before position.
    1783             :       void
    1784             :       _M_transfer(iterator __position, iterator __first, iterator __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         132 :          _Node* __tmp = _M_create_node(std::forward<_Args>(__args)...);
    1802         132 :          __tmp->_M_hook(__position._M_node);
    1803         264 :          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_size) const;
    1835             : 
    1836             : #if __cplusplus >= 201103L
    1837             :       void
    1838             :       _M_move_assign(list&& __x, true_type) noexcept
    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&& __x, false_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>& __x, const 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>& __x, const 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>& __x, const 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>& __x, const 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>& __x, const 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>& __x, const 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>& __x, list<_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 */

Generated by: LCOV version 1.13