Home | History | Annotate | Download | only in include
      1 // -*- C++ -*-
      2 //===---------------------------- list ------------------------------------===//
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is dual licensed under the MIT and the University of Illinois Open
      7 // Source Licenses. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 #ifndef _LIBCPP_LIST
     12 #define _LIBCPP_LIST
     13 
     14 /*
     15     list synopsis
     16 
     17 namespace std
     18 {
     19 
     20 template <class T, class Alloc = allocator<T> >
     21 class list
     22 {
     23 public:
     24 
     25     // types:
     26     typedef T value_type;
     27     typedef Alloc allocator_type;
     28     typedef typename allocator_type::reference reference;
     29     typedef typename allocator_type::const_reference const_reference;
     30     typedef typename allocator_type::pointer pointer;
     31     typedef typename allocator_type::const_pointer const_pointer;
     32     typedef implementation-defined iterator;
     33     typedef implementation-defined const_iterator;
     34     typedef implementation-defined size_type;
     35     typedef implementation-defined difference_type;
     36     typedef reverse_iterator<iterator> reverse_iterator;
     37     typedef reverse_iterator<const_iterator> const_reverse_iterator;
     38 
     39     list()
     40         noexcept(is_nothrow_default_constructible<allocator_type>::value);
     41     explicit list(const allocator_type& a);
     42     explicit list(size_type n);
     43     explicit list(size_type n, const allocator_type& a); // C++14
     44     list(size_type n, const value_type& value);
     45     list(size_type n, const value_type& value, const allocator_type& a);
     46     template <class Iter>
     47         list(Iter first, Iter last);
     48     template <class Iter>
     49         list(Iter first, Iter last, const allocator_type& a);
     50     list(const list& x);
     51     list(const list&, const allocator_type& a);
     52     list(list&& x)
     53         noexcept(is_nothrow_move_constructible<allocator_type>::value);
     54     list(list&&, const allocator_type& a);
     55     list(initializer_list<value_type>);
     56     list(initializer_list<value_type>, const allocator_type& a);
     57 
     58     ~list();
     59 
     60     list& operator=(const list& x);
     61     list& operator=(list&& x)
     62         noexcept(
     63              allocator_type::propagate_on_container_move_assignment::value &&
     64              is_nothrow_move_assignable<allocator_type>::value);
     65     list& operator=(initializer_list<value_type>);
     66     template <class Iter>
     67         void assign(Iter first, Iter last);
     68     void assign(size_type n, const value_type& t);
     69     void assign(initializer_list<value_type>);
     70 
     71     allocator_type get_allocator() const noexcept;
     72 
     73     iterator begin() noexcept;
     74     const_iterator begin() const noexcept;
     75     iterator end() noexcept;
     76     const_iterator end() const noexcept;
     77     reverse_iterator rbegin() noexcept;
     78     const_reverse_iterator rbegin() const noexcept;
     79     reverse_iterator rend() noexcept;
     80     const_reverse_iterator rend() const noexcept;
     81     const_iterator cbegin() const noexcept;
     82     const_iterator cend() const noexcept;
     83     const_reverse_iterator crbegin() const noexcept;
     84     const_reverse_iterator crend() const noexcept;
     85 
     86     reference front();
     87     const_reference front() const;
     88     reference back();
     89     const_reference back() const;
     90 
     91     bool empty() const noexcept;
     92     size_type size() const noexcept;
     93     size_type max_size() const noexcept;
     94 
     95     template <class... Args>
     96         void emplace_front(Args&&... args);
     97     void pop_front();
     98     template <class... Args>
     99         void emplace_back(Args&&... args);
    100     void pop_back();
    101     void push_front(const value_type& x);
    102     void push_front(value_type&& x);
    103     void push_back(const value_type& x);
    104     void push_back(value_type&& x);
    105     template <class... Args>
    106         iterator emplace(const_iterator position, Args&&... args);
    107     iterator insert(const_iterator position, const value_type& x);
    108     iterator insert(const_iterator position, value_type&& x);
    109     iterator insert(const_iterator position, size_type n, const value_type& x);
    110     template <class Iter>
    111         iterator insert(const_iterator position, Iter first, Iter last);
    112     iterator insert(const_iterator position, initializer_list<value_type> il);
    113 
    114     iterator erase(const_iterator position);
    115     iterator erase(const_iterator position, const_iterator last);
    116 
    117     void resize(size_type sz);
    118     void resize(size_type sz, const value_type& c);
    119 
    120     void swap(list&)
    121         noexcept(!allocator_type::propagate_on_container_swap::value ||
    122                  __is_nothrow_swappable<allocator_type>::value);
    123     void clear() noexcept;
    124 
    125     void splice(const_iterator position, list& x);
    126     void splice(const_iterator position, list&& x);
    127     void splice(const_iterator position, list& x, const_iterator i);
    128     void splice(const_iterator position, list&& x, const_iterator i);
    129     void splice(const_iterator position, list& x, const_iterator first,
    130                                                   const_iterator last);
    131     void splice(const_iterator position, list&& x, const_iterator first,
    132                                                   const_iterator last);
    133 
    134     void remove(const value_type& value);
    135     template <class Pred> void remove_if(Pred pred);
    136     void unique();
    137     template <class BinaryPredicate>
    138         void unique(BinaryPredicate binary_pred);
    139     void merge(list& x);
    140     void merge(list&& x);
    141     template <class Compare>
    142         void merge(list& x, Compare comp);
    143     template <class Compare>
    144         void merge(list&& x, Compare comp);
    145     void sort();
    146     template <class Compare>
    147         void sort(Compare comp);
    148     void reverse() noexcept;
    149 };
    150 
    151 template <class T, class Alloc>
    152     bool operator==(const list<T,Alloc>& x, const list<T,Alloc>& y);
    153 template <class T, class Alloc>
    154     bool operator< (const list<T,Alloc>& x, const list<T,Alloc>& y);
    155 template <class T, class Alloc>
    156     bool operator!=(const list<T,Alloc>& x, const list<T,Alloc>& y);
    157 template <class T, class Alloc>
    158     bool operator> (const list<T,Alloc>& x, const list<T,Alloc>& y);
    159 template <class T, class Alloc>
    160     bool operator>=(const list<T,Alloc>& x, const list<T,Alloc>& y);
    161 template <class T, class Alloc>
    162     bool operator<=(const list<T,Alloc>& x, const list<T,Alloc>& y);
    163 
    164 template <class T, class Alloc>
    165     void swap(list<T,Alloc>& x, list<T,Alloc>& y)
    166          noexcept(noexcept(x.swap(y)));
    167 
    168 }  // std
    169 
    170 */
    171 
    172 #include <__config>
    173 
    174 #include <memory>
    175 #include <limits>
    176 #include <initializer_list>
    177 #include <iterator>
    178 #include <algorithm>
    179 
    180 #include <__undef_min_max>
    181 
    182 #include <__debug>
    183 
    184 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
    185 #pragma GCC system_header
    186 #endif
    187 
    188 _LIBCPP_BEGIN_NAMESPACE_STD
    189 
    190 template <class _Tp, class _VoidPtr> struct __list_node;
    191 
    192 template <class _Tp, class _VoidPtr>
    193 struct __list_node_base
    194 {
    195     typedef typename pointer_traits<_VoidPtr>::template
    196 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
    197         rebind<__list_node<_Tp, _VoidPtr> > pointer;
    198 #else
    199         rebind<__list_node<_Tp, _VoidPtr> >::other pointer;
    200 #endif
    201 
    202     typedef typename pointer_traits<_VoidPtr>::template
    203 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
    204         rebind<__list_node_base> __base_pointer;
    205 #else
    206         rebind<__list_node_base>::other __base_pointer;
    207 #endif
    208 
    209     pointer __prev_;
    210     pointer __next_;
    211 
    212     _LIBCPP_INLINE_VISIBILITY
    213     __list_node_base() : __prev_(__self()), __next_(__self()) {}
    214 
    215     _LIBCPP_INLINE_VISIBILITY
    216     pointer __self()
    217     {
    218         return static_cast<pointer>(pointer_traits<__base_pointer>::pointer_to(*this));
    219     }
    220 };
    221 
    222 template <class _Tp, class _VoidPtr>
    223 struct __list_node
    224     : public __list_node_base<_Tp, _VoidPtr>
    225 {
    226     _Tp __value_;
    227 };
    228 
    229 template <class _Tp, class _Alloc = allocator<_Tp> > class _LIBCPP_TYPE_VIS_ONLY list;
    230 template <class _Tp, class _Alloc> class __list_imp;
    231 template <class _Tp, class _VoidPtr> class _LIBCPP_TYPE_VIS_ONLY __list_const_iterator;
    232 
    233 template <class _Tp, class _VoidPtr>
    234 class _LIBCPP_TYPE_VIS_ONLY __list_iterator
    235 {
    236     typedef typename pointer_traits<_VoidPtr>::template
    237 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
    238         rebind<__list_node<_Tp, _VoidPtr> > __node_pointer;
    239 #else
    240         rebind<__list_node<_Tp, _VoidPtr> >::other __node_pointer;
    241 #endif
    242 
    243     __node_pointer __ptr_;
    244 
    245 #if _LIBCPP_DEBUG_LEVEL >= 2
    246     _LIBCPP_INLINE_VISIBILITY
    247     explicit __list_iterator(__node_pointer __p, const void* __c) _NOEXCEPT
    248         : __ptr_(__p)
    249     {
    250         __get_db()->__insert_ic(this, __c);
    251     }
    252 #else
    253     _LIBCPP_INLINE_VISIBILITY
    254     explicit __list_iterator(__node_pointer __p) _NOEXCEPT : __ptr_(__p) {}
    255 #endif
    256 
    257 
    258 
    259     template<class, class> friend class list;
    260     template<class, class> friend class __list_imp;
    261     template<class, class> friend class __list_const_iterator;
    262 public:
    263     typedef bidirectional_iterator_tag       iterator_category;
    264     typedef _Tp                              value_type;
    265     typedef value_type&                      reference;
    266     typedef typename pointer_traits<_VoidPtr>::template
    267 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
    268             rebind<value_type>
    269 #else
    270             rebind<value_type>::other
    271 #endif
    272                                              pointer;
    273     typedef typename pointer_traits<pointer>::difference_type difference_type;
    274 
    275     _LIBCPP_INLINE_VISIBILITY
    276     __list_iterator() _NOEXCEPT : __ptr_(nullptr)
    277     {
    278 #if _LIBCPP_DEBUG_LEVEL >= 2
    279         __get_db()->__insert_i(this);
    280 #endif
    281     }
    282 
    283 #if _LIBCPP_DEBUG_LEVEL >= 2
    284 
    285     _LIBCPP_INLINE_VISIBILITY
    286     __list_iterator(const __list_iterator& __p)
    287         : __ptr_(__p.__ptr_)
    288     {
    289         __get_db()->__iterator_copy(this, &__p);
    290     }
    291 
    292     _LIBCPP_INLINE_VISIBILITY
    293     ~__list_iterator()
    294     {
    295         __get_db()->__erase_i(this);
    296     }
    297 
    298     _LIBCPP_INLINE_VISIBILITY
    299     __list_iterator& operator=(const __list_iterator& __p)
    300     {
    301         if (this != &__p)
    302         {
    303             __get_db()->__iterator_copy(this, &__p);
    304             __ptr_ = __p.__ptr_;
    305         }
    306         return *this;
    307     }
    308 
    309 #endif  // _LIBCPP_DEBUG_LEVEL >= 2
    310 
    311     _LIBCPP_INLINE_VISIBILITY
    312     reference operator*() const
    313     {
    314 #if _LIBCPP_DEBUG_LEVEL >= 2
    315         _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
    316                        "Attempted to dereference a non-dereferenceable list::iterator");
    317 #endif
    318         return __ptr_->__value_;
    319     }
    320     _LIBCPP_INLINE_VISIBILITY
    321     pointer operator->() const
    322     {
    323 #if _LIBCPP_DEBUG_LEVEL >= 2
    324         _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
    325                        "Attempted to dereference a non-dereferenceable list::iterator");
    326 #endif
    327         return pointer_traits<pointer>::pointer_to(__ptr_->__value_);
    328     }
    329 
    330     _LIBCPP_INLINE_VISIBILITY
    331     __list_iterator& operator++()
    332     {
    333 #if _LIBCPP_DEBUG_LEVEL >= 2
    334         _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
    335                        "Attempted to increment non-incrementable list::iterator");
    336 #endif
    337         __ptr_ = __ptr_->__next_;
    338         return *this;
    339     }
    340     _LIBCPP_INLINE_VISIBILITY
    341     __list_iterator operator++(int) {__list_iterator __t(*this); ++(*this); return __t;}
    342 
    343     _LIBCPP_INLINE_VISIBILITY
    344     __list_iterator& operator--()
    345     {
    346 #if _LIBCPP_DEBUG_LEVEL >= 2
    347         _LIBCPP_ASSERT(__get_const_db()->__decrementable(this),
    348                        "Attempted to decrement non-decrementable list::iterator");
    349 #endif
    350         __ptr_ = __ptr_->__prev_;
    351         return *this;
    352     }
    353     _LIBCPP_INLINE_VISIBILITY
    354     __list_iterator operator--(int) {__list_iterator __t(*this); --(*this); return __t;}
    355 
    356     friend _LIBCPP_INLINE_VISIBILITY
    357     bool operator==(const __list_iterator& __x, const __list_iterator& __y)
    358     {
    359         return __x.__ptr_ == __y.__ptr_;
    360     }
    361     friend _LIBCPP_INLINE_VISIBILITY
    362      bool operator!=(const __list_iterator& __x, const __list_iterator& __y)
    363         {return !(__x == __y);}
    364 };
    365 
    366 template <class _Tp, class _VoidPtr>
    367 class _LIBCPP_TYPE_VIS_ONLY __list_const_iterator
    368 {
    369     typedef typename pointer_traits<_VoidPtr>::template
    370 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
    371         rebind<__list_node<_Tp, _VoidPtr> > __node_pointer;
    372 #else
    373         rebind<__list_node<_Tp, _VoidPtr> >::other __node_pointer;
    374 #endif
    375 
    376     __node_pointer __ptr_;
    377 
    378 #if _LIBCPP_DEBUG_LEVEL >= 2
    379     _LIBCPP_INLINE_VISIBILITY
    380     explicit __list_const_iterator(__node_pointer __p, const void* __c) _NOEXCEPT
    381         : __ptr_(__p)
    382     {
    383         __get_db()->__insert_ic(this, __c);
    384     }
    385 #else
    386     _LIBCPP_INLINE_VISIBILITY
    387     explicit __list_const_iterator(__node_pointer __p) _NOEXCEPT : __ptr_(__p) {}
    388 #endif
    389 
    390     template<class, class> friend class list;
    391     template<class, class> friend class __list_imp;
    392 public:
    393     typedef bidirectional_iterator_tag       iterator_category;
    394     typedef _Tp                              value_type;
    395     typedef const value_type&                reference;
    396     typedef typename pointer_traits<_VoidPtr>::template
    397 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
    398             rebind<const value_type>
    399 #else
    400             rebind<const value_type>::other
    401 #endif
    402                                              pointer;
    403     typedef typename pointer_traits<pointer>::difference_type difference_type;
    404 
    405     _LIBCPP_INLINE_VISIBILITY
    406     __list_const_iterator() _NOEXCEPT : __ptr_(nullptr)
    407     {
    408 #if _LIBCPP_DEBUG_LEVEL >= 2
    409         __get_db()->__insert_i(this);
    410 #endif
    411     }
    412     _LIBCPP_INLINE_VISIBILITY
    413     __list_const_iterator(const __list_iterator<_Tp, _VoidPtr>& __p) _NOEXCEPT
    414         : __ptr_(__p.__ptr_)
    415     {
    416 #if _LIBCPP_DEBUG_LEVEL >= 2
    417         __get_db()->__iterator_copy(this, &__p);
    418 #endif
    419     }
    420 
    421 #if _LIBCPP_DEBUG_LEVEL >= 2
    422 
    423     _LIBCPP_INLINE_VISIBILITY
    424     __list_const_iterator(const __list_const_iterator& __p)
    425         : __ptr_(__p.__ptr_)
    426     {
    427         __get_db()->__iterator_copy(this, &__p);
    428     }
    429 
    430     _LIBCPP_INLINE_VISIBILITY
    431     ~__list_const_iterator()
    432     {
    433         __get_db()->__erase_i(this);
    434     }
    435 
    436     _LIBCPP_INLINE_VISIBILITY
    437     __list_const_iterator& operator=(const __list_const_iterator& __p)
    438     {
    439         if (this != &__p)
    440         {
    441             __get_db()->__iterator_copy(this, &__p);
    442             __ptr_ = __p.__ptr_;
    443         }
    444         return *this;
    445     }
    446 
    447 #endif  // _LIBCPP_DEBUG_LEVEL >= 2
    448     _LIBCPP_INLINE_VISIBILITY
    449     reference operator*() const
    450     {
    451 #if _LIBCPP_DEBUG_LEVEL >= 2
    452         _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
    453                        "Attempted to dereference a non-dereferenceable list::const_iterator");
    454 #endif
    455         return __ptr_->__value_;
    456     }
    457     _LIBCPP_INLINE_VISIBILITY
    458     pointer operator->() const
    459     {
    460 #if _LIBCPP_DEBUG_LEVEL >= 2
    461         _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
    462                        "Attempted to dereference a non-dereferenceable list::iterator");
    463 #endif
    464         return pointer_traits<pointer>::pointer_to(__ptr_->__value_);
    465     }
    466 
    467     _LIBCPP_INLINE_VISIBILITY
    468     __list_const_iterator& operator++()
    469     {
    470 #if _LIBCPP_DEBUG_LEVEL >= 2
    471         _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
    472                        "Attempted to increment non-incrementable list::const_iterator");
    473 #endif
    474         __ptr_ = __ptr_->__next_;
    475         return *this;
    476     }
    477     _LIBCPP_INLINE_VISIBILITY
    478     __list_const_iterator operator++(int) {__list_const_iterator __t(*this); ++(*this); return __t;}
    479 
    480     _LIBCPP_INLINE_VISIBILITY
    481     __list_const_iterator& operator--()
    482     {
    483 #if _LIBCPP_DEBUG_LEVEL >= 2
    484         _LIBCPP_ASSERT(__get_const_db()->__decrementable(this),
    485                        "Attempted to decrement non-decrementable list::const_iterator");
    486 #endif
    487         __ptr_ = __ptr_->__prev_;
    488         return *this;
    489     }
    490     _LIBCPP_INLINE_VISIBILITY
    491     __list_const_iterator operator--(int) {__list_const_iterator __t(*this); --(*this); return __t;}
    492 
    493     friend _LIBCPP_INLINE_VISIBILITY
    494     bool operator==(const __list_const_iterator& __x, const __list_const_iterator& __y)
    495     {
    496         return __x.__ptr_ == __y.__ptr_;
    497     }
    498     friend _LIBCPP_INLINE_VISIBILITY
    499     bool operator!=(const __list_const_iterator& __x, const __list_const_iterator& __y)
    500         {return !(__x == __y);}
    501 };
    502 
    503 template <class _Tp, class _Alloc>
    504 class __list_imp
    505 {
    506     __list_imp(const __list_imp&);
    507     __list_imp& operator=(const __list_imp&);
    508 protected:
    509     typedef _Tp                                                     value_type;
    510     typedef _Alloc                                                  allocator_type;
    511     typedef allocator_traits<allocator_type>                        __alloc_traits;
    512     typedef typename __alloc_traits::size_type                      size_type;
    513     typedef typename __alloc_traits::void_pointer                   __void_pointer;
    514     typedef __list_iterator<value_type, __void_pointer>             iterator;
    515     typedef __list_const_iterator<value_type, __void_pointer>       const_iterator;
    516     typedef __list_node_base<value_type, __void_pointer>            __node_base;
    517     typedef __list_node<value_type, __void_pointer>                 __node;
    518     typedef typename __alloc_traits::template
    519 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
    520                 rebind_alloc<__node>
    521 #else
    522                 rebind_alloc<__node>::other
    523 #endif
    524                                                                      __node_allocator;
    525     typedef allocator_traits<__node_allocator>                       __node_alloc_traits;
    526     typedef typename __node_alloc_traits::pointer                    __node_pointer;
    527     typedef typename __node_alloc_traits::pointer                    __node_const_pointer;
    528     typedef typename __alloc_traits::pointer                         pointer;
    529     typedef typename __alloc_traits::const_pointer                   const_pointer;
    530     typedef typename __alloc_traits::difference_type                 difference_type;
    531 
    532     typedef typename __alloc_traits::template
    533 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
    534                 rebind_alloc<__node_base>
    535 #else
    536                 rebind_alloc<__node_base>::other
    537 #endif
    538                                                                      __node_base_allocator;
    539     typedef typename allocator_traits<__node_base_allocator>::pointer __node_base_pointer;
    540 
    541     __node_base __end_;
    542     __compressed_pair<size_type, __node_allocator> __size_alloc_;
    543 
    544     _LIBCPP_INLINE_VISIBILITY
    545           size_type& __sz() _NOEXCEPT {return __size_alloc_.first();}
    546     _LIBCPP_INLINE_VISIBILITY
    547     const size_type& __sz() const _NOEXCEPT
    548         {return __size_alloc_.first();}
    549     _LIBCPP_INLINE_VISIBILITY
    550           __node_allocator& __node_alloc() _NOEXCEPT
    551           {return __size_alloc_.second();}
    552     _LIBCPP_INLINE_VISIBILITY
    553     const __node_allocator& __node_alloc() const _NOEXCEPT
    554         {return __size_alloc_.second();}
    555 
    556     static void __unlink_nodes(__node_pointer __f, __node_pointer __l) _NOEXCEPT;
    557 
    558     __list_imp()
    559         _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value);
    560     __list_imp(const allocator_type& __a);
    561     ~__list_imp();
    562     void clear() _NOEXCEPT;
    563     _LIBCPP_INLINE_VISIBILITY
    564     bool empty() const _NOEXCEPT {return __sz() == 0;}
    565 
    566     _LIBCPP_INLINE_VISIBILITY
    567     iterator begin() _NOEXCEPT
    568     {
    569 #if _LIBCPP_DEBUG_LEVEL >= 2
    570         return iterator(__end_.__next_, this);
    571 #else
    572         return iterator(__end_.__next_);
    573 #endif
    574     }
    575     _LIBCPP_INLINE_VISIBILITY
    576     const_iterator begin() const  _NOEXCEPT
    577     {
    578 #if _LIBCPP_DEBUG_LEVEL >= 2
    579         return const_iterator(__end_.__next_, this);
    580 #else
    581         return const_iterator(__end_.__next_);
    582 #endif
    583     }
    584     _LIBCPP_INLINE_VISIBILITY
    585     iterator end() _NOEXCEPT
    586     {
    587 #if _LIBCPP_DEBUG_LEVEL >= 2
    588         return iterator(static_cast<__node_pointer>(
    589                 pointer_traits<__node_base_pointer>::pointer_to(__end_)), this);
    590 #else
    591         return iterator(static_cast<__node_pointer>(
    592                       pointer_traits<__node_base_pointer>::pointer_to(__end_)));
    593 #endif
    594     }
    595     _LIBCPP_INLINE_VISIBILITY
    596     const_iterator end() const _NOEXCEPT
    597     {
    598 #if _LIBCPP_DEBUG_LEVEL >= 2
    599         return const_iterator(static_cast<__node_const_pointer>(
    600         pointer_traits<__node_base_pointer>::pointer_to(const_cast<__node_base&>(__end_))), this);
    601 #else
    602         return const_iterator(static_cast<__node_const_pointer>(
    603         pointer_traits<__node_base_pointer>::pointer_to(const_cast<__node_base&>(__end_))));
    604 #endif
    605     }
    606 
    607     void swap(__list_imp& __c)
    608         _NOEXCEPT_(!__node_alloc_traits::propagate_on_container_swap::value ||
    609                    __is_nothrow_swappable<__node_allocator>::value);
    610 
    611     _LIBCPP_INLINE_VISIBILITY
    612     void __copy_assign_alloc(const __list_imp& __c)
    613         {__copy_assign_alloc(__c, integral_constant<bool,
    614                       __node_alloc_traits::propagate_on_container_copy_assignment::value>());}
    615 
    616     _LIBCPP_INLINE_VISIBILITY
    617     void __move_assign_alloc(__list_imp& __c)
    618         _NOEXCEPT_(
    619             !__node_alloc_traits::propagate_on_container_move_assignment::value ||
    620             is_nothrow_move_assignable<__node_allocator>::value)
    621         {__move_assign_alloc(__c, integral_constant<bool,
    622                       __node_alloc_traits::propagate_on_container_move_assignment::value>());}
    623 
    624 private:
    625     _LIBCPP_INLINE_VISIBILITY
    626     static void __swap_alloc(__node_allocator& __x, __node_allocator& __y)
    627         _NOEXCEPT_(!__node_alloc_traits::propagate_on_container_swap::value ||
    628                    __is_nothrow_swappable<__node_allocator>::value)
    629         {__swap_alloc(__x, __y, integral_constant<bool,
    630                       __node_alloc_traits::propagate_on_container_swap::value>());}
    631     _LIBCPP_INLINE_VISIBILITY
    632     static void __swap_alloc(__node_allocator& __x, __node_allocator& __y, true_type)
    633         _NOEXCEPT_(__is_nothrow_swappable<__node_allocator>::value)
    634         {
    635             using _VSTD::swap;
    636             swap(__x, __y);
    637         }
    638     _LIBCPP_INLINE_VISIBILITY
    639     static void __swap_alloc(__node_allocator& __x, __node_allocator& __y, false_type)
    640         _NOEXCEPT
    641         {}
    642 
    643     _LIBCPP_INLINE_VISIBILITY
    644     void __copy_assign_alloc(const __list_imp& __c, true_type)
    645         {
    646             if (__node_alloc() != __c.__node_alloc())
    647                 clear();
    648             __node_alloc() = __c.__node_alloc();
    649         }
    650 
    651     _LIBCPP_INLINE_VISIBILITY
    652     void __copy_assign_alloc(const __list_imp& __c, false_type)
    653         {}
    654 
    655     _LIBCPP_INLINE_VISIBILITY
    656     void __move_assign_alloc(__list_imp& __c, true_type)
    657         _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value)
    658         {
    659             __node_alloc() = _VSTD::move(__c.__node_alloc());
    660         }
    661 
    662     _LIBCPP_INLINE_VISIBILITY
    663     void __move_assign_alloc(__list_imp& __c, false_type)
    664         _NOEXCEPT
    665         {}
    666 };
    667 
    668 // Unlink nodes [__f, __l]
    669 template <class _Tp, class _Alloc>
    670 inline _LIBCPP_INLINE_VISIBILITY
    671 void
    672 __list_imp<_Tp, _Alloc>::__unlink_nodes(__node_pointer __f, __node_pointer __l)
    673     _NOEXCEPT
    674 {
    675     __f->__prev_->__next_ = __l->__next_;
    676     __l->__next_->__prev_ = __f->__prev_;
    677 }
    678 
    679 template <class _Tp, class _Alloc>
    680 inline _LIBCPP_INLINE_VISIBILITY
    681 __list_imp<_Tp, _Alloc>::__list_imp()
    682         _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value)
    683     : __size_alloc_(0)
    684 {
    685 }
    686 
    687 template <class _Tp, class _Alloc>
    688 inline _LIBCPP_INLINE_VISIBILITY
    689 __list_imp<_Tp, _Alloc>::__list_imp(const allocator_type& __a)
    690     : __size_alloc_(0, __node_allocator(__a))
    691 {
    692 }
    693 
    694 template <class _Tp, class _Alloc>
    695 __list_imp<_Tp, _Alloc>::~__list_imp()
    696 {
    697     clear();
    698 #if _LIBCPP_DEBUG_LEVEL >= 2
    699     __get_db()->__erase_c(this);
    700 #endif
    701 }
    702 
    703 template <class _Tp, class _Alloc>
    704 void
    705 __list_imp<_Tp, _Alloc>::clear() _NOEXCEPT
    706 {
    707     if (!empty())
    708     {
    709         __node_allocator& __na = __node_alloc();
    710         __node_pointer __f = __end_.__next_;
    711         __node_pointer __l = static_cast<__node_pointer>(
    712                        pointer_traits<__node_base_pointer>::pointer_to(__end_));
    713         __unlink_nodes(__f, __l->__prev_);
    714         __sz() = 0;
    715         while (__f != __l)
    716         {
    717             __node_pointer __n = __f;
    718             __f = __f->__next_;
    719             __node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
    720             __node_alloc_traits::deallocate(__na, __n, 1);
    721         }
    722 #if _LIBCPP_DEBUG_LEVEL >= 2
    723         __c_node* __c = __get_db()->__find_c_and_lock(this);
    724         for (__i_node** __p = __c->end_; __p != __c->beg_; )
    725         {
    726             --__p;
    727             const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
    728             if (__i->__ptr_ != __l)
    729             {
    730                 (*__p)->__c_ = nullptr;
    731                 if (--__c->end_ != __p)
    732                     memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
    733             }
    734         }
    735         __get_db()->unlock();
    736 #endif
    737     }
    738 }
    739 
    740 template <class _Tp, class _Alloc>
    741 void
    742 __list_imp<_Tp, _Alloc>::swap(__list_imp& __c)
    743         _NOEXCEPT_(!__node_alloc_traits::propagate_on_container_swap::value ||
    744                    __is_nothrow_swappable<__node_allocator>::value)
    745 {
    746     _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value ||
    747                    this->__node_alloc() == __c.__node_alloc(),
    748                    "list::swap: Either propagate_on_container_swap must be true"
    749                    " or the allocators must compare equal");
    750     using _VSTD::swap;
    751     __swap_alloc(__node_alloc(), __c.__node_alloc());
    752     swap(__sz(), __c.__sz());
    753     swap(__end_, __c.__end_);
    754     if (__sz() == 0)
    755         __end_.__next_ = __end_.__prev_ = __end_.__self();
    756     else
    757         __end_.__prev_->__next_ = __end_.__next_->__prev_ = __end_.__self();
    758     if (__c.__sz() == 0)
    759         __c.__end_.__next_ = __c.__end_.__prev_ = __c.__end_.__self();
    760     else
    761         __c.__end_.__prev_->__next_ = __c.__end_.__next_->__prev_ = __c.__end_.__self();
    762 
    763 #if _LIBCPP_DEBUG_LEVEL >= 2
    764     __libcpp_db* __db = __get_db();
    765     __c_node* __cn1 = __db->__find_c_and_lock(this);
    766     __c_node* __cn2 = __db->__find_c(&__c);
    767     std::swap(__cn1->beg_, __cn2->beg_);
    768     std::swap(__cn1->end_, __cn2->end_);
    769     std::swap(__cn1->cap_, __cn2->cap_);
    770     for (__i_node** __p = __cn1->end_; __p != __cn1->beg_;)
    771     {
    772         --__p;
    773         const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
    774         if (__i->__ptr_ == static_cast<__node_pointer>(
    775                        pointer_traits<__node_base_pointer>::pointer_to(__c.__end_)))
    776         {
    777             __cn2->__add(*__p);
    778             if (--__cn1->end_ != __p)
    779                 memmove(__p, __p+1, (__cn1->end_ - __p)*sizeof(__i_node*));
    780         }
    781         else
    782             (*__p)->__c_ = __cn1;
    783     }
    784     for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;)
    785     {
    786         --__p;
    787         const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
    788         if (__i->__ptr_ == static_cast<__node_pointer>(
    789                        pointer_traits<__node_base_pointer>::pointer_to(__end_)))
    790         {
    791             __cn1->__add(*__p);
    792             if (--__cn2->end_ != __p)
    793                 memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*));
    794         }
    795         else
    796             (*__p)->__c_ = __cn2;
    797     }
    798     __db->unlock();
    799 #endif
    800 }
    801 
    802 template <class _Tp, class _Alloc /*= allocator<_Tp>*/>
    803 class _LIBCPP_TYPE_VIS_ONLY list
    804     : private __list_imp<_Tp, _Alloc>
    805 {
    806     typedef __list_imp<_Tp, _Alloc> base;
    807     typedef typename base::__node              __node;
    808     typedef typename base::__node_allocator    __node_allocator;
    809     typedef typename base::__node_pointer      __node_pointer;
    810     typedef typename base::__node_alloc_traits __node_alloc_traits;
    811     typedef typename base::__node_base         __node_base;
    812     typedef typename base::__node_base_pointer __node_base_pointer;
    813 
    814 public:
    815     typedef _Tp                                      value_type;
    816     typedef _Alloc                                   allocator_type;
    817     static_assert((is_same<value_type, typename allocator_type::value_type>::value),
    818                   "Invalid allocator::value_type");
    819     typedef value_type&                              reference;
    820     typedef const value_type&                        const_reference;
    821     typedef typename base::pointer                   pointer;
    822     typedef typename base::const_pointer             const_pointer;
    823     typedef typename base::size_type                 size_type;
    824     typedef typename base::difference_type           difference_type;
    825     typedef typename base::iterator                  iterator;
    826     typedef typename base::const_iterator            const_iterator;
    827     typedef _VSTD::reverse_iterator<iterator>         reverse_iterator;
    828     typedef _VSTD::reverse_iterator<const_iterator>   const_reverse_iterator;
    829 
    830     _LIBCPP_INLINE_VISIBILITY
    831     list()
    832         _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value)
    833     {
    834 #if _LIBCPP_DEBUG_LEVEL >= 2
    835         __get_db()->__insert_c(this);
    836 #endif
    837     }
    838     _LIBCPP_INLINE_VISIBILITY
    839     explicit list(const allocator_type& __a) : base(__a)
    840     {
    841 #if _LIBCPP_DEBUG_LEVEL >= 2
    842         __get_db()->__insert_c(this);
    843 #endif
    844     }
    845     explicit list(size_type __n);
    846 #if _LIBCPP_STD_VER > 11
    847     explicit list(size_type __n, const allocator_type& __a);
    848 #endif
    849     list(size_type __n, const value_type& __x);
    850     list(size_type __n, const value_type& __x, const allocator_type& __a);
    851     template <class _InpIter>
    852         list(_InpIter __f, _InpIter __l,
    853              typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0);
    854     template <class _InpIter>
    855         list(_InpIter __f, _InpIter __l, const allocator_type& __a,
    856              typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0);
    857 
    858     list(const list& __c);
    859     list(const list& __c, const allocator_type& __a);
    860     list& operator=(const list& __c);
    861 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    862     list(initializer_list<value_type> __il);
    863     list(initializer_list<value_type> __il, const allocator_type& __a);
    864 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    865 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    866     list(list&& __c)
    867         _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value);
    868     list(list&& __c, const allocator_type& __a);
    869     list& operator=(list&& __c)
    870         _NOEXCEPT_(
    871             __node_alloc_traits::propagate_on_container_move_assignment::value &&
    872             is_nothrow_move_assignable<__node_allocator>::value);
    873 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    874 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    875     _LIBCPP_INLINE_VISIBILITY
    876     list& operator=(initializer_list<value_type> __il)
    877         {assign(__il.begin(), __il.end()); return *this;}
    878 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    879 
    880     template <class _InpIter>
    881         void assign(_InpIter __f, _InpIter __l,
    882              typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0);
    883     void assign(size_type __n, const value_type& __x);
    884 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    885     _LIBCPP_INLINE_VISIBILITY
    886     void assign(initializer_list<value_type> __il)
    887         {assign(__il.begin(), __il.end());}
    888 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    889 
    890     allocator_type get_allocator() const _NOEXCEPT;
    891 
    892     _LIBCPP_INLINE_VISIBILITY
    893     size_type size() const _NOEXCEPT     {return base::__sz();}
    894     _LIBCPP_INLINE_VISIBILITY
    895     bool empty() const _NOEXCEPT         {return base::empty();}
    896     _LIBCPP_INLINE_VISIBILITY
    897     size_type max_size() const _NOEXCEPT
    898         {return numeric_limits<difference_type>::max();}
    899 
    900     _LIBCPP_INLINE_VISIBILITY
    901           iterator begin() _NOEXCEPT        {return base::begin();}
    902     _LIBCPP_INLINE_VISIBILITY
    903     const_iterator begin()  const _NOEXCEPT {return base::begin();}
    904     _LIBCPP_INLINE_VISIBILITY
    905           iterator end() _NOEXCEPT          {return base::end();}
    906     _LIBCPP_INLINE_VISIBILITY
    907     const_iterator end()    const _NOEXCEPT {return base::end();}
    908     _LIBCPP_INLINE_VISIBILITY
    909     const_iterator cbegin() const _NOEXCEPT {return base::begin();}
    910     _LIBCPP_INLINE_VISIBILITY
    911     const_iterator cend()   const _NOEXCEPT {return base::end();}
    912 
    913     _LIBCPP_INLINE_VISIBILITY
    914           reverse_iterator rbegin() _NOEXCEPT
    915             {return       reverse_iterator(end());}
    916     _LIBCPP_INLINE_VISIBILITY
    917     const_reverse_iterator rbegin()  const _NOEXCEPT
    918         {return const_reverse_iterator(end());}
    919     _LIBCPP_INLINE_VISIBILITY
    920           reverse_iterator rend() _NOEXCEPT
    921             {return       reverse_iterator(begin());}
    922     _LIBCPP_INLINE_VISIBILITY
    923     const_reverse_iterator rend()    const _NOEXCEPT
    924         {return const_reverse_iterator(begin());}
    925     _LIBCPP_INLINE_VISIBILITY
    926     const_reverse_iterator crbegin() const _NOEXCEPT
    927         {return const_reverse_iterator(end());}
    928     _LIBCPP_INLINE_VISIBILITY
    929     const_reverse_iterator crend()   const _NOEXCEPT
    930         {return const_reverse_iterator(begin());}
    931 
    932     _LIBCPP_INLINE_VISIBILITY
    933     reference front()
    934     {
    935         _LIBCPP_ASSERT(!empty(), "list::front called on empty list");
    936         return base::__end_.__next_->__value_;
    937     }
    938     _LIBCPP_INLINE_VISIBILITY
    939     const_reference front() const
    940     {
    941         _LIBCPP_ASSERT(!empty(), "list::front called on empty list");
    942         return base::__end_.__next_->__value_;
    943     }
    944     _LIBCPP_INLINE_VISIBILITY
    945     reference back()
    946     {
    947         _LIBCPP_ASSERT(!empty(), "list::back called on empty list");
    948         return base::__end_.__prev_->__value_;
    949     }
    950     _LIBCPP_INLINE_VISIBILITY
    951     const_reference back() const
    952     {
    953         _LIBCPP_ASSERT(!empty(), "list::back called on empty list");
    954         return base::__end_.__prev_->__value_;
    955     }
    956 
    957 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    958     void push_front(value_type&& __x);
    959     void push_back(value_type&& __x);
    960 #ifndef _LIBCPP_HAS_NO_VARIADICS
    961     template <class... _Args>
    962        void emplace_front(_Args&&... __args);
    963     template <class... _Args>
    964         void emplace_back(_Args&&... __args);
    965     template <class... _Args>
    966         iterator emplace(const_iterator __p, _Args&&... __args);
    967 #endif  // _LIBCPP_HAS_NO_VARIADICS
    968     iterator insert(const_iterator __p, value_type&& __x);
    969 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    970 
    971     void push_front(const value_type& __x);
    972     void push_back(const value_type& __x);
    973 
    974     iterator insert(const_iterator __p, const value_type& __x);
    975     iterator insert(const_iterator __p, size_type __n, const value_type& __x);
    976     template <class _InpIter>
    977         iterator insert(const_iterator __p, _InpIter __f, _InpIter __l,
    978              typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0);
    979 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    980     _LIBCPP_INLINE_VISIBILITY
    981     iterator insert(const_iterator __p, initializer_list<value_type> __il)
    982         {return insert(__p, __il.begin(), __il.end());}
    983 #endif   // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
    984 
    985     _LIBCPP_INLINE_VISIBILITY
    986     void swap(list& __c)
    987         _NOEXCEPT_(!__node_alloc_traits::propagate_on_container_swap::value ||
    988                    __is_nothrow_swappable<__node_allocator>::value)
    989         {base::swap(__c);}
    990     _LIBCPP_INLINE_VISIBILITY
    991     void clear() _NOEXCEPT {base::clear();}
    992 
    993     void pop_front();
    994     void pop_back();
    995 
    996     iterator erase(const_iterator __p);
    997     iterator erase(const_iterator __f, const_iterator __l);
    998 
    999     void resize(size_type __n);
   1000     void resize(size_type __n, const value_type& __x);
   1001 
   1002     void splice(const_iterator __p, list& __c);
   1003 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1004     _LIBCPP_INLINE_VISIBILITY
   1005     void splice(const_iterator __p, list&& __c) {splice(__p, __c);}
   1006 #endif
   1007     void splice(const_iterator __p, list& __c, const_iterator __i);
   1008 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1009     _LIBCPP_INLINE_VISIBILITY
   1010     void splice(const_iterator __p, list&& __c, const_iterator __i)
   1011         {splice(__p, __c, __i);}
   1012 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1013     void splice(const_iterator __p, list& __c, const_iterator __f, const_iterator __l);
   1014 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1015     _LIBCPP_INLINE_VISIBILITY
   1016     void splice(const_iterator __p, list&& __c, const_iterator __f, const_iterator __l)
   1017         {splice(__p, __c, __f, __l);}
   1018 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1019 
   1020     void remove(const value_type& __x);
   1021     template <class _Pred> void remove_if(_Pred __pred);
   1022     void unique();
   1023     template <class _BinaryPred>
   1024         void unique(_BinaryPred __binary_pred);
   1025     void merge(list& __c);
   1026 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1027     _LIBCPP_INLINE_VISIBILITY
   1028     void merge(list&& __c) {merge(__c);}
   1029 #endif
   1030     template <class _Comp>
   1031         void merge(list& __c, _Comp __comp);
   1032 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1033     template <class _Comp>
   1034     _LIBCPP_INLINE_VISIBILITY
   1035         void merge(list&& __c, _Comp __comp) {merge(__c, __comp);}
   1036 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1037     void sort();
   1038     template <class _Comp>
   1039         void sort(_Comp __comp);
   1040 
   1041     void reverse() _NOEXCEPT;
   1042 
   1043     bool __invariants() const;
   1044 
   1045 #if _LIBCPP_DEBUG_LEVEL >= 2
   1046 
   1047     bool __dereferenceable(const const_iterator* __i) const;
   1048     bool __decrementable(const const_iterator* __i) const;
   1049     bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
   1050     bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
   1051 
   1052 #endif  // _LIBCPP_DEBUG_LEVEL >= 2
   1053 
   1054 private:
   1055     static void __link_nodes  (__node_pointer __p, __node_pointer __f, __node_pointer __l);
   1056     void __link_nodes_at_front(__node_pointer __f, __node_pointer __l);
   1057     void __link_nodes_at_back (__node_pointer __f, __node_pointer __l);
   1058     iterator __iterator(size_type __n);
   1059     template <class _Comp>
   1060         static iterator __sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp);
   1061 
   1062     void __move_assign(list& __c, true_type)
   1063         _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value);
   1064     void __move_assign(list& __c, false_type);
   1065 };
   1066 
   1067 // Link in nodes [__f, __l] just prior to __p
   1068 template <class _Tp, class _Alloc>
   1069 inline _LIBCPP_INLINE_VISIBILITY
   1070 void
   1071 list<_Tp, _Alloc>::__link_nodes(__node_pointer __p, __node_pointer __f, __node_pointer __l)
   1072 {
   1073     __p->__prev_->__next_ = __f;
   1074     __f->__prev_ = __p->__prev_;
   1075     __p->__prev_ = __l;
   1076     __l->__next_ = __p;
   1077 }
   1078 
   1079 // Link in nodes [__f, __l] at the front of the list
   1080 template <class _Tp, class _Alloc>
   1081 inline _LIBCPP_INLINE_VISIBILITY
   1082 void
   1083 list<_Tp, _Alloc>::__link_nodes_at_front(__node_pointer __f, __node_pointer __l)
   1084 {
   1085     __f->__prev_ = base::__end_.__self();
   1086     __l->__next_ = base::__end_.__next_;
   1087     __l->__next_->__prev_ = __l;
   1088     base::__end_.__next_ = __f;
   1089 }
   1090 
   1091 // Link in nodes [__f, __l] at the front of the list
   1092 template <class _Tp, class _Alloc>
   1093 inline _LIBCPP_INLINE_VISIBILITY
   1094 void
   1095 list<_Tp, _Alloc>::__link_nodes_at_back(__node_pointer __f, __node_pointer __l)
   1096 {
   1097     __l->__next_ = base::__end_.__self();
   1098     __f->__prev_ = base::__end_.__prev_;
   1099     __f->__prev_->__next_ = __f;
   1100     base::__end_.__prev_ = __l;
   1101 }
   1102 
   1103 
   1104 template <class _Tp, class _Alloc>
   1105 inline _LIBCPP_INLINE_VISIBILITY
   1106 typename list<_Tp, _Alloc>::iterator
   1107 list<_Tp, _Alloc>::__iterator(size_type __n)
   1108 {
   1109     return __n <= base::__sz() / 2 ? _VSTD::next(begin(), __n)
   1110                                    : _VSTD::prev(end(), base::__sz() - __n);
   1111 }
   1112 
   1113 template <class _Tp, class _Alloc>
   1114 list<_Tp, _Alloc>::list(size_type __n)
   1115 {
   1116 #if _LIBCPP_DEBUG_LEVEL >= 2
   1117     __get_db()->__insert_c(this);
   1118 #endif
   1119     for (; __n > 0; --__n)
   1120 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1121         emplace_back();
   1122 #else
   1123         push_back(value_type());
   1124 #endif
   1125 }
   1126 
   1127 #if _LIBCPP_STD_VER > 11
   1128 template <class _Tp, class _Alloc>
   1129 list<_Tp, _Alloc>::list(size_type __n, const allocator_type& __a) : base(__a)
   1130 {
   1131 #if _LIBCPP_DEBUG_LEVEL >= 2
   1132     __get_db()->__insert_c(this);
   1133 #endif
   1134     for (; __n > 0; --__n)
   1135 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1136         emplace_back();
   1137 #else
   1138         push_back(value_type());
   1139 #endif
   1140 }
   1141 #endif
   1142 
   1143 template <class _Tp, class _Alloc>
   1144 list<_Tp, _Alloc>::list(size_type __n, const value_type& __x)
   1145 {
   1146 #if _LIBCPP_DEBUG_LEVEL >= 2
   1147     __get_db()->__insert_c(this);
   1148 #endif
   1149     for (; __n > 0; --__n)
   1150         push_back(__x);
   1151 }
   1152 
   1153 template <class _Tp, class _Alloc>
   1154 list<_Tp, _Alloc>::list(size_type __n, const value_type& __x, const allocator_type& __a)
   1155     : base(__a)
   1156 {
   1157 #if _LIBCPP_DEBUG_LEVEL >= 2
   1158     __get_db()->__insert_c(this);
   1159 #endif
   1160     for (; __n > 0; --__n)
   1161         push_back(__x);
   1162 }
   1163 
   1164 template <class _Tp, class _Alloc>
   1165 template <class _InpIter>
   1166 list<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l,
   1167                         typename enable_if<__is_input_iterator<_InpIter>::value>::type*)
   1168 {
   1169 #if _LIBCPP_DEBUG_LEVEL >= 2
   1170     __get_db()->__insert_c(this);
   1171 #endif
   1172     for (; __f != __l; ++__f)
   1173         push_back(*__f);
   1174 }
   1175 
   1176 template <class _Tp, class _Alloc>
   1177 template <class _InpIter>
   1178 list<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l, const allocator_type& __a,
   1179                         typename enable_if<__is_input_iterator<_InpIter>::value>::type*)
   1180     : base(__a)
   1181 {
   1182 #if _LIBCPP_DEBUG_LEVEL >= 2
   1183     __get_db()->__insert_c(this);
   1184 #endif
   1185     for (; __f != __l; ++__f)
   1186         push_back(*__f);
   1187 }
   1188 
   1189 template <class _Tp, class _Alloc>
   1190 list<_Tp, _Alloc>::list(const list& __c)
   1191     : base(allocator_type(
   1192            __node_alloc_traits::select_on_container_copy_construction(
   1193                 __c.__node_alloc())))
   1194 {
   1195 #if _LIBCPP_DEBUG_LEVEL >= 2
   1196     __get_db()->__insert_c(this);
   1197 #endif
   1198     for (const_iterator __i = __c.begin(), __e = __c.end(); __i != __e; ++__i)
   1199         push_back(*__i);
   1200 }
   1201 
   1202 template <class _Tp, class _Alloc>
   1203 list<_Tp, _Alloc>::list(const list& __c, const allocator_type& __a)
   1204     : base(__a)
   1205 {
   1206 #if _LIBCPP_DEBUG_LEVEL >= 2
   1207     __get_db()->__insert_c(this);
   1208 #endif
   1209     for (const_iterator __i = __c.begin(), __e = __c.end(); __i != __e; ++__i)
   1210         push_back(*__i);
   1211 }
   1212 
   1213 #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1214 
   1215 template <class _Tp, class _Alloc>
   1216 list<_Tp, _Alloc>::list(initializer_list<value_type> __il, const allocator_type& __a)
   1217     : base(__a)
   1218 {
   1219 #if _LIBCPP_DEBUG_LEVEL >= 2
   1220     __get_db()->__insert_c(this);
   1221 #endif
   1222     for (typename initializer_list<value_type>::const_iterator __i = __il.begin(),
   1223             __e = __il.end(); __i != __e; ++__i)
   1224         push_back(*__i);
   1225 }
   1226 
   1227 template <class _Tp, class _Alloc>
   1228 list<_Tp, _Alloc>::list(initializer_list<value_type> __il)
   1229 {
   1230 #if _LIBCPP_DEBUG_LEVEL >= 2
   1231     __get_db()->__insert_c(this);
   1232 #endif
   1233     for (typename initializer_list<value_type>::const_iterator __i = __il.begin(),
   1234             __e = __il.end(); __i != __e; ++__i)
   1235         push_back(*__i);
   1236 }
   1237 
   1238 #endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
   1239 
   1240 template <class _Tp, class _Alloc>
   1241 inline _LIBCPP_INLINE_VISIBILITY
   1242 list<_Tp, _Alloc>&
   1243 list<_Tp, _Alloc>::operator=(const list& __c)
   1244 {
   1245     if (this != &__c)
   1246     {
   1247         base::__copy_assign_alloc(__c);
   1248         assign(__c.begin(), __c.end());
   1249     }
   1250     return *this;
   1251 }
   1252 
   1253 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1254 
   1255 template <class _Tp, class _Alloc>
   1256 inline _LIBCPP_INLINE_VISIBILITY
   1257 list<_Tp, _Alloc>::list(list&& __c)
   1258     _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value)
   1259     : base(allocator_type(_VSTD::move(__c.__node_alloc())))
   1260 {
   1261 #if _LIBCPP_DEBUG_LEVEL >= 2
   1262     __get_db()->__insert_c(this);
   1263 #endif
   1264     splice(end(), __c);
   1265 }
   1266 
   1267 template <class _Tp, class _Alloc>
   1268 inline _LIBCPP_INLINE_VISIBILITY
   1269 list<_Tp, _Alloc>::list(list&& __c, const allocator_type& __a)
   1270     : base(__a)
   1271 {
   1272 #if _LIBCPP_DEBUG_LEVEL >= 2
   1273     __get_db()->__insert_c(this);
   1274 #endif
   1275     if (__a == __c.get_allocator())
   1276         splice(end(), __c);
   1277     else
   1278     {
   1279         typedef move_iterator<iterator> _Ip;
   1280         assign(_Ip(__c.begin()), _Ip(__c.end()));
   1281     }
   1282 }
   1283 
   1284 template <class _Tp, class _Alloc>
   1285 inline _LIBCPP_INLINE_VISIBILITY
   1286 list<_Tp, _Alloc>&
   1287 list<_Tp, _Alloc>::operator=(list&& __c)
   1288         _NOEXCEPT_(
   1289             __node_alloc_traits::propagate_on_container_move_assignment::value &&
   1290             is_nothrow_move_assignable<__node_allocator>::value)
   1291 {
   1292     __move_assign(__c, integral_constant<bool,
   1293           __node_alloc_traits::propagate_on_container_move_assignment::value>());
   1294     return *this;
   1295 }
   1296 
   1297 template <class _Tp, class _Alloc>
   1298 void
   1299 list<_Tp, _Alloc>::__move_assign(list& __c, false_type)
   1300 {
   1301     if (base::__node_alloc() != __c.__node_alloc())
   1302     {
   1303         typedef move_iterator<iterator> _Ip;
   1304         assign(_Ip(__c.begin()), _Ip(__c.end()));
   1305     }
   1306     else
   1307         __move_assign(__c, true_type());
   1308 }
   1309 
   1310 template <class _Tp, class _Alloc>
   1311 void
   1312 list<_Tp, _Alloc>::__move_assign(list& __c, true_type)
   1313         _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value)
   1314 {
   1315     clear();
   1316     base::__move_assign_alloc(__c);
   1317     splice(end(), __c);
   1318 }
   1319 
   1320 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1321 
   1322 template <class _Tp, class _Alloc>
   1323 template <class _InpIter>
   1324 void
   1325 list<_Tp, _Alloc>::assign(_InpIter __f, _InpIter __l,
   1326                           typename enable_if<__is_input_iterator<_InpIter>::value>::type*)
   1327 {
   1328     iterator __i = begin();
   1329     iterator __e = end();
   1330     for (; __f != __l && __i != __e; ++__f, ++__i)
   1331         *__i = *__f;
   1332     if (__i == __e)
   1333         insert(__e, __f, __l);
   1334     else
   1335         erase(__i, __e);
   1336 }
   1337 
   1338 template <class _Tp, class _Alloc>
   1339 void
   1340 list<_Tp, _Alloc>::assign(size_type __n, const value_type& __x)
   1341 {
   1342     iterator __i = begin();
   1343     iterator __e = end();
   1344     for (; __n > 0 && __i != __e; --__n, ++__i)
   1345         *__i = __x;
   1346     if (__i == __e)
   1347         insert(__e, __n, __x);
   1348     else
   1349         erase(__i, __e);
   1350 }
   1351 
   1352 template <class _Tp, class _Alloc>
   1353 inline _LIBCPP_INLINE_VISIBILITY
   1354 _Alloc
   1355 list<_Tp, _Alloc>::get_allocator() const _NOEXCEPT
   1356 {
   1357     return allocator_type(base::__node_alloc());
   1358 }
   1359 
   1360 template <class _Tp, class _Alloc>
   1361 typename list<_Tp, _Alloc>::iterator
   1362 list<_Tp, _Alloc>::insert(const_iterator __p, const value_type& __x)
   1363 {
   1364 #if _LIBCPP_DEBUG_LEVEL >= 2
   1365     _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
   1366         "list::insert(iterator, x) called with an iterator not"
   1367         " referring to this list");
   1368 #endif
   1369     __node_allocator& __na = base::__node_alloc();
   1370     typedef __allocator_destructor<__node_allocator> _Dp;
   1371     unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
   1372     __hold->__prev_ = 0;
   1373     __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
   1374     __link_nodes(__p.__ptr_, __hold.get(), __hold.get());
   1375     ++base::__sz();
   1376 #if _LIBCPP_DEBUG_LEVEL >= 2
   1377     return iterator(__hold.release(), this);
   1378 #else
   1379     return iterator(__hold.release());
   1380 #endif
   1381 }
   1382 
   1383 template <class _Tp, class _Alloc>
   1384 typename list<_Tp, _Alloc>::iterator
   1385 list<_Tp, _Alloc>::insert(const_iterator __p, size_type __n, const value_type& __x)
   1386 {
   1387 #if _LIBCPP_DEBUG_LEVEL >= 2
   1388     _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
   1389         "list::insert(iterator, n, x) called with an iterator not"
   1390         " referring to this list");
   1391     iterator __r(__p.__ptr_, this);
   1392 #else
   1393     iterator __r(__p.__ptr_);
   1394 #endif
   1395     if (__n > 0)
   1396     {
   1397         size_type __ds = 0;
   1398         __node_allocator& __na = base::__node_alloc();
   1399         typedef __allocator_destructor<__node_allocator> _Dp;
   1400         unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
   1401         __hold->__prev_ = 0;
   1402         __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
   1403         ++__ds;
   1404 #if _LIBCPP_DEBUG_LEVEL >= 2
   1405         __r = iterator(__hold.get(), this);
   1406 #else
   1407         __r = iterator(__hold.get());
   1408 #endif
   1409         __hold.release();
   1410         iterator __e = __r;
   1411 #ifndef _LIBCPP_NO_EXCEPTIONS
   1412         try
   1413         {
   1414 #endif  // _LIBCPP_NO_EXCEPTIONS
   1415             for (--__n; __n != 0; --__n, ++__e, ++__ds)
   1416             {
   1417                 __hold.reset(__node_alloc_traits::allocate(__na, 1));
   1418                 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
   1419                 __e.__ptr_->__next_ = __hold.get();
   1420                 __hold->__prev_ = __e.__ptr_;
   1421                 __hold.release();
   1422             }
   1423 #ifndef _LIBCPP_NO_EXCEPTIONS
   1424         }
   1425         catch (...)
   1426         {
   1427             while (true)
   1428             {
   1429                 __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
   1430                 __node_pointer __prev = __e.__ptr_->__prev_;
   1431                 __node_alloc_traits::deallocate(__na, __e.__ptr_, 1);
   1432                 if (__prev == 0)
   1433                     break;
   1434 #if _LIBCPP_DEBUG_LEVEL >= 2
   1435                 __e = iterator(__prev, this);
   1436 #else
   1437                 __e = iterator(__prev);
   1438 #endif
   1439             }
   1440             throw;
   1441         }
   1442 #endif  // _LIBCPP_NO_EXCEPTIONS
   1443         __link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_);
   1444         base::__sz() += __ds;
   1445     }
   1446     return __r;
   1447 }
   1448 
   1449 template <class _Tp, class _Alloc>
   1450 template <class _InpIter>
   1451 typename list<_Tp, _Alloc>::iterator
   1452 list<_Tp, _Alloc>::insert(const_iterator __p, _InpIter __f, _InpIter __l,
   1453              typename enable_if<__is_input_iterator<_InpIter>::value>::type*)
   1454 {
   1455 #if _LIBCPP_DEBUG_LEVEL >= 2
   1456     _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
   1457         "list::insert(iterator, range) called with an iterator not"
   1458         " referring to this list");
   1459     iterator __r(__p.__ptr_, this);
   1460 #else
   1461     iterator __r(__p.__ptr_);
   1462 #endif
   1463     if (__f != __l)
   1464     {
   1465         size_type __ds = 0;
   1466         __node_allocator& __na = base::__node_alloc();
   1467         typedef __allocator_destructor<__node_allocator> _Dp;
   1468         unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
   1469         __hold->__prev_ = 0;
   1470         __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f);
   1471         ++__ds;
   1472 #if _LIBCPP_DEBUG_LEVEL >= 2
   1473         __r = iterator(__hold.get(), this);
   1474 #else
   1475         __r = iterator(__hold.get());
   1476 #endif
   1477         __hold.release();
   1478         iterator __e = __r;
   1479 #ifndef _LIBCPP_NO_EXCEPTIONS
   1480         try
   1481         {
   1482 #endif  // _LIBCPP_NO_EXCEPTIONS
   1483             for (++__f; __f != __l; ++__f, ++__e, ++__ds)
   1484             {
   1485                 __hold.reset(__node_alloc_traits::allocate(__na, 1));
   1486                 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f);
   1487                 __e.__ptr_->__next_ = __hold.get();
   1488                 __hold->__prev_ = __e.__ptr_;
   1489                 __hold.release();
   1490             }
   1491 #ifndef _LIBCPP_NO_EXCEPTIONS
   1492         }
   1493         catch (...)
   1494         {
   1495             while (true)
   1496             {
   1497                 __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
   1498                 __node_pointer __prev = __e.__ptr_->__prev_;
   1499                 __node_alloc_traits::deallocate(__na, __e.__ptr_, 1);
   1500                 if (__prev == 0)
   1501                     break;
   1502 #if _LIBCPP_DEBUG_LEVEL >= 2
   1503                 __e = iterator(__prev, this);
   1504 #else
   1505                 __e = iterator(__prev);
   1506 #endif
   1507             }
   1508             throw;
   1509         }
   1510 #endif  // _LIBCPP_NO_EXCEPTIONS
   1511         __link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_);
   1512         base::__sz() += __ds;
   1513     }
   1514     return __r;
   1515 }
   1516 
   1517 template <class _Tp, class _Alloc>
   1518 void
   1519 list<_Tp, _Alloc>::push_front(const value_type& __x)
   1520 {
   1521     __node_allocator& __na = base::__node_alloc();
   1522     typedef __allocator_destructor<__node_allocator> _Dp;
   1523     unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
   1524     __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
   1525     __link_nodes_at_front(__hold.get(), __hold.get());
   1526     ++base::__sz();
   1527     __hold.release();
   1528 }
   1529 
   1530 template <class _Tp, class _Alloc>
   1531 void
   1532 list<_Tp, _Alloc>::push_back(const value_type& __x)
   1533 {
   1534     __node_allocator& __na = base::__node_alloc();
   1535     typedef __allocator_destructor<__node_allocator> _Dp;
   1536     unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
   1537     __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
   1538     __link_nodes_at_back(__hold.get(), __hold.get());
   1539     ++base::__sz();
   1540     __hold.release();
   1541 }
   1542 
   1543 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1544 
   1545 template <class _Tp, class _Alloc>
   1546 void
   1547 list<_Tp, _Alloc>::push_front(value_type&& __x)
   1548 {
   1549     __node_allocator& __na = base::__node_alloc();
   1550     typedef __allocator_destructor<__node_allocator> _Dp;
   1551     unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
   1552     __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
   1553     __link_nodes_at_front(__hold.get(), __hold.get());
   1554     ++base::__sz();
   1555     __hold.release();
   1556 }
   1557 
   1558 template <class _Tp, class _Alloc>
   1559 void
   1560 list<_Tp, _Alloc>::push_back(value_type&& __x)
   1561 {
   1562     __node_allocator& __na = base::__node_alloc();
   1563     typedef __allocator_destructor<__node_allocator> _Dp;
   1564     unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
   1565     __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
   1566     __link_nodes_at_back(__hold.get(), __hold.get());
   1567     ++base::__sz();
   1568     __hold.release();
   1569 }
   1570 
   1571 #ifndef _LIBCPP_HAS_NO_VARIADICS
   1572 
   1573 template <class _Tp, class _Alloc>
   1574 template <class... _Args>
   1575 void
   1576 list<_Tp, _Alloc>::emplace_front(_Args&&... __args)
   1577 {
   1578     __node_allocator& __na = base::__node_alloc();
   1579     typedef __allocator_destructor<__node_allocator> _Dp;
   1580     unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
   1581     __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
   1582     __link_nodes_at_front(__hold.get(), __hold.get());
   1583     ++base::__sz();
   1584     __hold.release();
   1585 }
   1586 
   1587 template <class _Tp, class _Alloc>
   1588 template <class... _Args>
   1589 void
   1590 list<_Tp, _Alloc>::emplace_back(_Args&&... __args)
   1591 {
   1592     __node_allocator& __na = base::__node_alloc();
   1593     typedef __allocator_destructor<__node_allocator> _Dp;
   1594     unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
   1595     __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
   1596     __link_nodes_at_back(__hold.get(), __hold.get());
   1597     ++base::__sz();
   1598     __hold.release();
   1599 }
   1600 
   1601 template <class _Tp, class _Alloc>
   1602 template <class... _Args>
   1603 typename list<_Tp, _Alloc>::iterator
   1604 list<_Tp, _Alloc>::emplace(const_iterator __p, _Args&&... __args)
   1605 {
   1606 #if _LIBCPP_DEBUG_LEVEL >= 2
   1607     _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
   1608         "list::emplace(iterator, args...) called with an iterator not"
   1609         " referring to this list");
   1610 #endif
   1611     __node_allocator& __na = base::__node_alloc();
   1612     typedef __allocator_destructor<__node_allocator> _Dp;
   1613     unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
   1614     __hold->__prev_ = 0;
   1615     __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
   1616     __link_nodes(__p.__ptr_, __hold.get(), __hold.get());
   1617     ++base::__sz();
   1618 #if _LIBCPP_DEBUG_LEVEL >= 2
   1619     return iterator(__hold.release(), this);
   1620 #else
   1621     return iterator(__hold.release());
   1622 #endif
   1623 }
   1624 
   1625 #endif  // _LIBCPP_HAS_NO_VARIADICS
   1626 
   1627 template <class _Tp, class _Alloc>
   1628 typename list<_Tp, _Alloc>::iterator
   1629 list<_Tp, _Alloc>::insert(const_iterator __p, value_type&& __x)
   1630 {
   1631 #if _LIBCPP_DEBUG_LEVEL >= 2
   1632     _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
   1633         "list::insert(iterator, x) called with an iterator not"
   1634         " referring to this list");
   1635 #endif
   1636     __node_allocator& __na = base::__node_alloc();
   1637     typedef __allocator_destructor<__node_allocator> _Dp;
   1638     unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
   1639     __hold->__prev_ = 0;
   1640     __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
   1641     __link_nodes(__p.__ptr_, __hold.get(), __hold.get());
   1642     ++base::__sz();
   1643 #if _LIBCPP_DEBUG_LEVEL >= 2
   1644     return iterator(__hold.release(), this);
   1645 #else
   1646     return iterator(__hold.release());
   1647 #endif
   1648 }
   1649 
   1650 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
   1651 
   1652 template <class _Tp, class _Alloc>
   1653 void
   1654 list<_Tp, _Alloc>::pop_front()
   1655 {
   1656     _LIBCPP_ASSERT(!empty(), "list::pop_front() called with empty list");
   1657     __node_allocator& __na = base::__node_alloc();
   1658     __node_pointer __n = base::__end_.__next_;
   1659     base::__unlink_nodes(__n, __n);
   1660     --base::__sz();
   1661 #if _LIBCPP_DEBUG_LEVEL >= 2
   1662     __c_node* __c = __get_db()->__find_c_and_lock(this);
   1663     for (__i_node** __p = __c->end_; __p != __c->beg_; )
   1664     {
   1665         --__p;
   1666         iterator* __i = static_cast<iterator*>((*__p)->__i_);
   1667         if (__i->__ptr_ == __n)
   1668         {
   1669             (*__p)->__c_ = nullptr;
   1670             if (--__c->end_ != __p)
   1671                 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
   1672         }
   1673     }
   1674     __get_db()->unlock();
   1675 #endif
   1676     __node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
   1677     __node_alloc_traits::deallocate(__na, __n, 1);
   1678 }
   1679 
   1680 template <class _Tp, class _Alloc>
   1681 void
   1682 list<_Tp, _Alloc>::pop_back()
   1683 {
   1684     _LIBCPP_ASSERT(!empty(), "list::pop_back() called with empty list");
   1685     __node_allocator& __na = base::__node_alloc();
   1686     __node_pointer __n = base::__end_.__prev_;
   1687     base::__unlink_nodes(__n, __n);
   1688     --base::__sz();
   1689 #if _LIBCPP_DEBUG_LEVEL >= 2
   1690     __c_node* __c = __get_db()->__find_c_and_lock(this);
   1691     for (__i_node** __p = __c->end_; __p != __c->beg_; )
   1692     {
   1693         --__p;
   1694         iterator* __i = static_cast<iterator*>((*__p)->__i_);
   1695         if (__i->__ptr_ == __n)
   1696         {
   1697             (*__p)->__c_ = nullptr;
   1698             if (--__c->end_ != __p)
   1699                 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
   1700         }
   1701     }
   1702     __get_db()->unlock();
   1703 #endif
   1704     __node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
   1705     __node_alloc_traits::deallocate(__na, __n, 1);
   1706 }
   1707 
   1708 template <class _Tp, class _Alloc>
   1709 typename list<_Tp, _Alloc>::iterator
   1710 list<_Tp, _Alloc>::erase(const_iterator __p)
   1711 {
   1712 #if _LIBCPP_DEBUG_LEVEL >= 2
   1713     _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
   1714         "list::erase(iterator) called with an iterator not"
   1715         " referring to this list");
   1716 #endif
   1717     _LIBCPP_ASSERT(__p != end(),
   1718         "list::erase(iterator) called with a non-dereferenceable iterator");
   1719     __node_allocator& __na = base::__node_alloc();
   1720     __node_pointer __n = __p.__ptr_;
   1721     __node_pointer __r = __n->__next_;
   1722     base::__unlink_nodes(__n, __n);
   1723     --base::__sz();
   1724 #if _LIBCPP_DEBUG_LEVEL >= 2
   1725     __c_node* __c = __get_db()->__find_c_and_lock(this);
   1726     for (__i_node** __p = __c->end_; __p != __c->beg_; )
   1727     {
   1728         --__p;
   1729         iterator* __i = static_cast<iterator*>((*__p)->__i_);
   1730         if (__i->__ptr_ == __n)
   1731         {
   1732             (*__p)->__c_ = nullptr;
   1733             if (--__c->end_ != __p)
   1734                 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
   1735         }
   1736     }
   1737     __get_db()->unlock();
   1738 #endif
   1739     __node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
   1740     __node_alloc_traits::deallocate(__na, __n, 1);
   1741 #if _LIBCPP_DEBUG_LEVEL >= 2
   1742     return iterator(__r, this);
   1743 #else
   1744     return iterator(__r);
   1745 #endif
   1746 }
   1747 
   1748 template <class _Tp, class _Alloc>
   1749 typename list<_Tp, _Alloc>::iterator
   1750 list<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l)
   1751 {
   1752 #if _LIBCPP_DEBUG_LEVEL >= 2
   1753     _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__f) == this,
   1754         "list::erase(iterator, iterator) called with an iterator not"
   1755         " referring to this list");
   1756 #endif
   1757     if (__f != __l)
   1758     {
   1759         __node_allocator& __na = base::__node_alloc();
   1760         base::__unlink_nodes(__f.__ptr_, __l.__ptr_->__prev_);
   1761         while (__f != __l)
   1762         {
   1763             __node_pointer __n = __f.__ptr_;
   1764             ++__f;
   1765             --base::__sz();
   1766 #if _LIBCPP_DEBUG_LEVEL >= 2
   1767             __c_node* __c = __get_db()->__find_c_and_lock(this);
   1768             for (__i_node** __p = __c->end_; __p != __c->beg_; )
   1769             {
   1770                 --__p;
   1771                 iterator* __i = static_cast<iterator*>((*__p)->__i_);
   1772                 if (__i->__ptr_ == __n)
   1773                 {
   1774                     (*__p)->__c_ = nullptr;
   1775                     if (--__c->end_ != __p)
   1776                         memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
   1777                 }
   1778             }
   1779             __get_db()->unlock();
   1780 #endif
   1781             __node_alloc_traits::destroy(__na, _VSTD::addressof(__n->__value_));
   1782             __node_alloc_traits::deallocate(__na, __n, 1);
   1783         }
   1784     }
   1785 #if _LIBCPP_DEBUG_LEVEL >= 2
   1786     return iterator(__l.__ptr_, this);
   1787 #else
   1788     return iterator(__l.__ptr_);
   1789 #endif
   1790 }
   1791 
   1792 template <class _Tp, class _Alloc>
   1793 void
   1794 list<_Tp, _Alloc>::resize(size_type __n)
   1795 {
   1796     if (__n < base::__sz())
   1797         erase(__iterator(__n), end());
   1798     else if (__n > base::__sz())
   1799     {
   1800         __n -= base::__sz();
   1801         size_type __ds = 0;
   1802         __node_allocator& __na = base::__node_alloc();
   1803         typedef __allocator_destructor<__node_allocator> _Dp;
   1804         unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
   1805         __hold->__prev_ = 0;
   1806         __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_));
   1807         ++__ds;
   1808 #if _LIBCPP_DEBUG_LEVEL >= 2
   1809         iterator __r = iterator(__hold.release(), this);
   1810 #else
   1811         iterator __r = iterator(__hold.release());
   1812 #endif
   1813         iterator __e = __r;
   1814 #ifndef _LIBCPP_NO_EXCEPTIONS
   1815         try
   1816         {
   1817 #endif  // _LIBCPP_NO_EXCEPTIONS
   1818             for (--__n; __n != 0; --__n, ++__e, ++__ds)
   1819             {
   1820                 __hold.reset(__node_alloc_traits::allocate(__na, 1));
   1821                 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_));
   1822                 __e.__ptr_->__next_ = __hold.get();
   1823                 __hold->__prev_ = __e.__ptr_;
   1824                 __hold.release();
   1825             }
   1826 #ifndef _LIBCPP_NO_EXCEPTIONS
   1827         }
   1828         catch (...)
   1829         {
   1830             while (true)
   1831             {
   1832                 __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
   1833                 __node_pointer __prev = __e.__ptr_->__prev_;
   1834                 __node_alloc_traits::deallocate(__na, __e.__ptr_, 1);
   1835                 if (__prev == 0)
   1836                     break;
   1837 #if _LIBCPP_DEBUG_LEVEL >= 2
   1838                 __e = iterator(__prev, this);
   1839 #else
   1840                 __e = iterator(__prev);
   1841 #endif
   1842             }
   1843             throw;
   1844         }
   1845 #endif  // _LIBCPP_NO_EXCEPTIONS
   1846         __link_nodes_at_back(__r.__ptr_, __e.__ptr_);
   1847         base::__sz() += __ds;
   1848     }
   1849 }
   1850 
   1851 template <class _Tp, class _Alloc>
   1852 void
   1853 list<_Tp, _Alloc>::resize(size_type __n, const value_type& __x)
   1854 {
   1855     if (__n < base::__sz())
   1856         erase(__iterator(__n), end());
   1857     else if (__n > base::__sz())
   1858     {
   1859         __n -= base::__sz();
   1860         size_type __ds = 0;
   1861         __node_allocator& __na = base::__node_alloc();
   1862         typedef __allocator_destructor<__node_allocator> _Dp;
   1863         unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
   1864         __hold->__prev_ = 0;
   1865         __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
   1866         ++__ds;
   1867 #if _LIBCPP_DEBUG_LEVEL >= 2
   1868         iterator __r = iterator(__hold.release(), this);
   1869 #else
   1870         iterator __r = iterator(__hold.release());
   1871 #endif
   1872         iterator __e = __r;
   1873 #ifndef _LIBCPP_NO_EXCEPTIONS
   1874         try
   1875         {
   1876 #endif  // _LIBCPP_NO_EXCEPTIONS
   1877             for (--__n; __n != 0; --__n, ++__e, ++__ds)
   1878             {
   1879                 __hold.reset(__node_alloc_traits::allocate(__na, 1));
   1880                 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
   1881                 __e.__ptr_->__next_ = __hold.get();
   1882                 __hold->__prev_ = __e.__ptr_;
   1883                 __hold.release();
   1884             }
   1885 #ifndef _LIBCPP_NO_EXCEPTIONS
   1886         }
   1887         catch (...)
   1888         {
   1889             while (true)
   1890             {
   1891                 __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
   1892                 __node_pointer __prev = __e.__ptr_->__prev_;
   1893                 __node_alloc_traits::deallocate(__na, __e.__ptr_, 1);
   1894                 if (__prev == 0)
   1895                     break;
   1896 #if _LIBCPP_DEBUG_LEVEL >= 2
   1897                 __e = iterator(__prev, this);
   1898 #else
   1899                 __e = iterator(__prev);
   1900 #endif
   1901             }
   1902             throw;
   1903         }
   1904 #endif  // _LIBCPP_NO_EXCEPTIONS
   1905         __link_nodes(static_cast<__node_pointer>(pointer_traits<__node_base_pointer>::
   1906                          pointer_to(base::__end_)), __r.__ptr_, __e.__ptr_);
   1907         base::__sz() += __ds;
   1908     }
   1909 }
   1910 
   1911 template <class _Tp, class _Alloc>
   1912 void
   1913 list<_Tp, _Alloc>::splice(const_iterator __p, list& __c)
   1914 {
   1915     _LIBCPP_ASSERT(this != &__c,
   1916                    "list::splice(iterator, list) called with this == &list");
   1917 #if _LIBCPP_DEBUG_LEVEL >= 2
   1918     _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
   1919         "list::splice(iterator, list) called with an iterator not"
   1920         " referring to this list");
   1921 #endif
   1922     if (!__c.empty())
   1923     {
   1924         __node_pointer __f = __c.__end_.__next_;
   1925         __node_pointer __l = __c.__end_.__prev_;
   1926         base::__unlink_nodes(__f, __l);
   1927         __link_nodes(__p.__ptr_, __f, __l);
   1928         base::__sz() += __c.__sz();
   1929         __c.__sz() = 0;
   1930 #if _LIBCPP_DEBUG_LEVEL >= 2
   1931         __libcpp_db* __db = __get_db();
   1932         __c_node* __cn1 = __db->__find_c_and_lock(this);
   1933         __c_node* __cn2 = __db->__find_c(&__c);
   1934         for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;)
   1935         {
   1936             --__p;
   1937             iterator* __i = static_cast<iterator*>((*__p)->__i_);
   1938             if (__i->__ptr_ != static_cast<__node_pointer>(
   1939                        pointer_traits<__node_base_pointer>::pointer_to(__c.__end_)))
   1940             {
   1941                 __cn1->__add(*__p);
   1942                 (*__p)->__c_ = __cn1;
   1943                 if (--__cn2->end_ != __p)
   1944                     memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*));
   1945             }
   1946         }
   1947         __db->unlock();
   1948 #endif
   1949     }
   1950 }
   1951 
   1952 template <class _Tp, class _Alloc>
   1953 void
   1954 list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __i)
   1955 {
   1956 #if _LIBCPP_DEBUG_LEVEL >= 2
   1957     _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
   1958         "list::splice(iterator, list, iterator) called with first iterator not"
   1959         " referring to this list");
   1960     _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__i) == &__c,
   1961         "list::splice(iterator, list, iterator) called with second iterator not"
   1962         " referring to list argument");
   1963     _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(&__i),
   1964         "list::splice(iterator, list, iterator) called with second iterator not"
   1965         " derefereceable");
   1966 #endif
   1967     if (__p.__ptr_ != __i.__ptr_ && __p.__ptr_ != __i.__ptr_->__next_)
   1968     {
   1969         __node_pointer __f = __i.__ptr_;
   1970         base::__unlink_nodes(__f, __f);
   1971         __link_nodes(__p.__ptr_, __f, __f);
   1972         --__c.__sz();
   1973         ++base::__sz();
   1974 #if _LIBCPP_DEBUG_LEVEL >= 2
   1975         __libcpp_db* __db = __get_db();
   1976         __c_node* __cn1 = __db->__find_c_and_lock(this);
   1977         __c_node* __cn2 = __db->__find_c(&__c);
   1978         for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;)
   1979         {
   1980             --__p;
   1981             iterator* __j = static_cast<iterator*>((*__p)->__i_);
   1982             if (__j->__ptr_ == __f)
   1983             {
   1984                 __cn1->__add(*__p);
   1985                 (*__p)->__c_ = __cn1;
   1986                 if (--__cn2->end_ != __p)
   1987                     memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*));
   1988             }
   1989         }
   1990         __db->unlock();
   1991 #endif
   1992     }
   1993 }
   1994 
   1995 template <class _Tp, class _Alloc>
   1996 void
   1997 list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __f, const_iterator __l)
   1998 {
   1999 #if _LIBCPP_DEBUG_LEVEL >= 2
   2000     _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
   2001         "list::splice(iterator, list, iterator, iterator) called with first iterator not"
   2002         " referring to this list");
   2003     _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__f) == &__c,
   2004         "list::splice(iterator, list, iterator, iterator) called with second iterator not"
   2005         " referring to list argument");
   2006     if (this == &__c)
   2007     {
   2008         for (const_iterator __i = __f; __i != __l; ++__i)
   2009             _LIBCPP_ASSERT(__i != __p,
   2010                            "list::splice(iterator, list, iterator, iterator)"
   2011                            " called with the first iterator within the range"
   2012                            " of the second and third iterators");
   2013     }
   2014 #endif
   2015     if (__f != __l)
   2016     {
   2017         if (this != &__c)
   2018         {
   2019             size_type __s = _VSTD::distance(__f, __l);
   2020             __c.__sz() -= __s;
   2021             base::__sz() += __s;
   2022         }
   2023         __node_pointer __first = __f.__ptr_;
   2024         --__l;
   2025         __node_pointer __last = __l.__ptr_;
   2026         base::__unlink_nodes(__first, __last);
   2027         __link_nodes(__p.__ptr_, __first, __last);
   2028 #if _LIBCPP_DEBUG_LEVEL >= 2
   2029         __libcpp_db* __db = __get_db();
   2030         __c_node* __cn1 = __db->__find_c_and_lock(this);
   2031         __c_node* __cn2 = __db->__find_c(&__c);
   2032         for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;)
   2033         {
   2034             --__p;
   2035             iterator* __j = static_cast<iterator*>((*__p)->__i_);
   2036             for (__node_pointer __k = __f.__ptr_;
   2037                                           __k != __l.__ptr_; __k = __k->__next_)
   2038             {
   2039                 if (__j->__ptr_ == __k)
   2040                 {
   2041                     __cn1->__add(*__p);
   2042                     (*__p)->__c_ = __cn1;
   2043                     if (--__cn2->end_ != __p)
   2044                         memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*));
   2045                 }
   2046             }
   2047         }
   2048         __db->unlock();
   2049 #endif
   2050     }
   2051 }
   2052 
   2053 template <class _Tp, class _Alloc>
   2054 void
   2055 list<_Tp, _Alloc>::remove(const value_type& __x)
   2056 {
   2057     list<_Tp, _Alloc> __deleted_nodes; // collect the nodes we're removing
   2058     for (const_iterator __i = begin(), __e = end(); __i != __e;)
   2059     {
   2060         if (*__i == __x)
   2061         {
   2062             const_iterator __j = _VSTD::next(__i);
   2063             for (; __j != __e && *__j == __x; ++__j)
   2064                 ;
   2065             __deleted_nodes.splice(__deleted_nodes.end(), *this, __i, __j);
   2066             __i = __j;
   2067             if (__i != __e)
   2068                 ++__i;
   2069         }
   2070         else
   2071             ++__i;
   2072     }
   2073 }
   2074 
   2075 template <class _Tp, class _Alloc>
   2076 template <class _Pred>
   2077 void
   2078 list<_Tp, _Alloc>::remove_if(_Pred __pred)
   2079 {
   2080     for (iterator __i = begin(), __e = end(); __i != __e;)
   2081     {
   2082         if (__pred(*__i))
   2083         {
   2084             iterator __j = _VSTD::next(__i);
   2085             for (; __j != __e && __pred(*__j); ++__j)
   2086                 ;
   2087             __i = erase(__i, __j);
   2088             if (__i != __e)
   2089                 ++__i;
   2090         }
   2091         else
   2092             ++__i;
   2093     }
   2094 }
   2095 
   2096 template <class _Tp, class _Alloc>
   2097 inline _LIBCPP_INLINE_VISIBILITY
   2098 void
   2099 list<_Tp, _Alloc>::unique()
   2100 {
   2101     unique(__equal_to<value_type>());
   2102 }
   2103 
   2104 template <class _Tp, class _Alloc>
   2105 template <class _BinaryPred>
   2106 void
   2107 list<_Tp, _Alloc>::unique(_BinaryPred __binary_pred)
   2108 {
   2109     for (iterator __i = begin(), __e = end(); __i != __e;)
   2110     {
   2111         iterator __j = _VSTD::next(__i);
   2112         for (; __j != __e && __binary_pred(*__i, *__j); ++__j)
   2113             ;
   2114         if (++__i != __j)
   2115             __i = erase(__i, __j);
   2116     }
   2117 }
   2118 
   2119 template <class _Tp, class _Alloc>
   2120 inline _LIBCPP_INLINE_VISIBILITY
   2121 void
   2122 list<_Tp, _Alloc>::merge(list& __c)
   2123 {
   2124     merge(__c, __less<value_type>());
   2125 }
   2126 
   2127 template <class _Tp, class _Alloc>
   2128 template <class _Comp>
   2129 void
   2130 list<_Tp, _Alloc>::merge(list& __c, _Comp __comp)
   2131 {
   2132     if (this != &__c)
   2133     {
   2134         iterator __f1 = begin();
   2135         iterator __e1 = end();
   2136         iterator __f2 = __c.begin();
   2137         iterator __e2 = __c.end();
   2138         while (__f1 != __e1 && __f2 != __e2)
   2139         {
   2140             if (__comp(*__f2, *__f1))
   2141             {
   2142                 size_type __ds = 1;
   2143                 iterator __m2 = _VSTD::next(__f2);
   2144                 for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2, ++__ds)
   2145                     ;
   2146                 base::__sz() += __ds;
   2147                 __c.__sz() -= __ds;
   2148                 __node_pointer __f = __f2.__ptr_;
   2149                 __node_pointer __l = __m2.__ptr_->__prev_;
   2150                 __f2 = __m2;
   2151                 base::__unlink_nodes(__f, __l);
   2152                 __m2 = _VSTD::next(__f1);
   2153                 __link_nodes(__f1.__ptr_, __f, __l);
   2154                 __f1 = __m2;
   2155             }
   2156             else
   2157                 ++__f1;
   2158         }
   2159         splice(__e1, __c);
   2160 #if _LIBCPP_DEBUG_LEVEL >= 2
   2161         __libcpp_db* __db = __get_db();
   2162         __c_node* __cn1 = __db->__find_c_and_lock(this);
   2163         __c_node* __cn2 = __db->__find_c(&__c);
   2164         for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;)
   2165         {
   2166             --__p;
   2167             iterator* __i = static_cast<iterator*>((*__p)->__i_);
   2168             if (__i->__ptr_ != static_cast<__node_pointer>(
   2169                        pointer_traits<__node_base_pointer>::pointer_to(__c.__end_)))
   2170             {
   2171                 __cn1->__add(*__p);
   2172                 (*__p)->__c_ = __cn1;
   2173                 if (--__cn2->end_ != __p)
   2174                     memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*));
   2175             }
   2176         }
   2177         __db->unlock();
   2178 #endif
   2179     }
   2180 }
   2181 
   2182 template <class _Tp, class _Alloc>
   2183 inline _LIBCPP_INLINE_VISIBILITY
   2184 void
   2185 list<_Tp, _Alloc>::sort()
   2186 {
   2187     sort(__less<value_type>());
   2188 }
   2189 
   2190 template <class _Tp, class _Alloc>
   2191 template <class _Comp>
   2192 inline _LIBCPP_INLINE_VISIBILITY
   2193 void
   2194 list<_Tp, _Alloc>::sort(_Comp __comp)
   2195 {
   2196     __sort(begin(), end(), base::__sz(), __comp);
   2197 }
   2198 
   2199 template <class _Tp, class _Alloc>
   2200 template <class _Comp>
   2201 typename list<_Tp, _Alloc>::iterator
   2202 list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp)
   2203 {
   2204     switch (__n)
   2205     {
   2206     case 0:
   2207     case 1:
   2208         return __f1;
   2209     case 2:
   2210         if (__comp(*--__e2, *__f1))
   2211         {
   2212             __node_pointer __f = __e2.__ptr_;
   2213             base::__unlink_nodes(__f, __f);
   2214             __link_nodes(__f1.__ptr_, __f, __f);
   2215             return __e2;
   2216         }
   2217         return __f1;
   2218     }
   2219     size_type __n2 = __n / 2;
   2220     iterator __e1 = _VSTD::next(__f1, __n2);
   2221     iterator  __r = __f1 = __sort(__f1, __e1, __n2, __comp);
   2222     iterator __f2 = __e1 = __sort(__e1, __e2, __n - __n2, __comp);
   2223     if (__comp(*__f2, *__f1))
   2224     {
   2225         iterator __m2 = _VSTD::next(__f2);
   2226         for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
   2227             ;
   2228         __node_pointer __f = __f2.__ptr_;
   2229         __node_pointer __l = __m2.__ptr_->__prev_;
   2230         __r = __f2;
   2231         __e1 = __f2 = __m2;
   2232         base::__unlink_nodes(__f, __l);
   2233         __m2 = _VSTD::next(__f1);
   2234         __link_nodes(__f1.__ptr_, __f, __l);
   2235         __f1 = __m2;
   2236     }
   2237     else
   2238         ++__f1;
   2239     while (__f1 != __e1 && __f2 != __e2)
   2240     {
   2241         if (__comp(*__f2, *__f1))
   2242         {
   2243             iterator __m2 = _VSTD::next(__f2);
   2244             for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
   2245                 ;
   2246             __node_pointer __f = __f2.__ptr_;
   2247             __node_pointer __l = __m2.__ptr_->__prev_;
   2248             if (__e1 == __f2)
   2249                 __e1 = __m2;
   2250             __f2 = __m2;
   2251             base::__unlink_nodes(__f, __l);
   2252             __m2 = _VSTD::next(__f1);
   2253             __link_nodes(__f1.__ptr_, __f, __l);
   2254             __f1 = __m2;
   2255         }
   2256         else
   2257             ++__f1;
   2258     }
   2259     return __r;
   2260 }
   2261 
   2262 template <class _Tp, class _Alloc>
   2263 void
   2264 list<_Tp, _Alloc>::reverse() _NOEXCEPT
   2265 {
   2266     if (base::__sz() > 1)
   2267     {
   2268         iterator __e = end();
   2269         for (iterator __i = begin(); __i.__ptr_ != __e.__ptr_;)
   2270         {
   2271             _VSTD::swap(__i.__ptr_->__prev_, __i.__ptr_->__next_);
   2272             __i.__ptr_ = __i.__ptr_->__prev_;
   2273         }
   2274         _VSTD::swap(__e.__ptr_->__prev_, __e.__ptr_->__next_);
   2275     }
   2276 }
   2277 
   2278 template <class _Tp, class _Alloc>
   2279 bool
   2280 list<_Tp, _Alloc>::__invariants() const
   2281 {
   2282     return size() == _VSTD::distance(begin(), end());
   2283 }
   2284 
   2285 #if _LIBCPP_DEBUG_LEVEL >= 2
   2286 
   2287 template <class _Tp, class _Alloc>
   2288 bool
   2289 list<_Tp, _Alloc>::__dereferenceable(const const_iterator* __i) const
   2290 {
   2291     return __i->__ptr_ != static_cast<__node_pointer>(
   2292                        pointer_traits<__node_base_pointer>::pointer_to(const_cast<__node_base&>(this->__end_)));
   2293 }
   2294 
   2295 template <class _Tp, class _Alloc>
   2296 bool
   2297 list<_Tp, _Alloc>::__decrementable(const const_iterator* __i) const
   2298 {
   2299     return !empty() &&  __i->__ptr_ != base::__end_.__next_;
   2300 }
   2301 
   2302 template <class _Tp, class _Alloc>
   2303 bool
   2304 list<_Tp, _Alloc>::__addable(const const_iterator* __i, ptrdiff_t __n) const
   2305 {
   2306     return false;
   2307 }
   2308 
   2309 template <class _Tp, class _Alloc>
   2310 bool
   2311 list<_Tp, _Alloc>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
   2312 {
   2313     return false;
   2314 }
   2315 
   2316 #endif  // _LIBCPP_DEBUG_LEVEL >= 2
   2317 
   2318 template <class _Tp, class _Alloc>
   2319 inline _LIBCPP_INLINE_VISIBILITY
   2320 bool
   2321 operator==(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
   2322 {
   2323     return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
   2324 }
   2325 
   2326 template <class _Tp, class _Alloc>
   2327 inline _LIBCPP_INLINE_VISIBILITY
   2328 bool
   2329 operator< (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
   2330 {
   2331     return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
   2332 }
   2333 
   2334 template <class _Tp, class _Alloc>
   2335 inline _LIBCPP_INLINE_VISIBILITY
   2336 bool
   2337 operator!=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
   2338 {
   2339     return !(__x == __y);
   2340 }
   2341 
   2342 template <class _Tp, class _Alloc>
   2343 inline _LIBCPP_INLINE_VISIBILITY
   2344 bool
   2345 operator> (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
   2346 {
   2347     return __y < __x;
   2348 }
   2349 
   2350 template <class _Tp, class _Alloc>
   2351 inline _LIBCPP_INLINE_VISIBILITY
   2352 bool
   2353 operator>=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
   2354 {
   2355     return !(__x < __y);
   2356 }
   2357 
   2358 template <class _Tp, class _Alloc>
   2359 inline _LIBCPP_INLINE_VISIBILITY
   2360 bool
   2361 operator<=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
   2362 {
   2363     return !(__y < __x);
   2364 }
   2365 
   2366 template <class _Tp, class _Alloc>
   2367 inline _LIBCPP_INLINE_VISIBILITY
   2368 void
   2369 swap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y)
   2370     _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
   2371 {
   2372     __x.swap(__y);
   2373 }
   2374 
   2375 _LIBCPP_END_NAMESPACE_STD
   2376 
   2377 #endif  // _LIBCPP_LIST
   2378