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