Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

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