xref: /openbsd-src/gnu/llvm/libcxx/include/list (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
146035553Spatrick// -*- C++ -*-
2*4bdff4beSrobert//===----------------------------------------------------------------------===//
346035553Spatrick//
446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
546035553Spatrick// See https://llvm.org/LICENSE.txt for license information.
646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
746035553Spatrick//
846035553Spatrick//===----------------------------------------------------------------------===//
946035553Spatrick
1046035553Spatrick#ifndef _LIBCPP_LIST
1146035553Spatrick#define _LIBCPP_LIST
1246035553Spatrick
1346035553Spatrick/*
1446035553Spatrick    list synopsis
1546035553Spatrick
1646035553Spatricknamespace std
1746035553Spatrick{
1846035553Spatrick
1946035553Spatricktemplate <class T, class Alloc = allocator<T> >
2046035553Spatrickclass list
2146035553Spatrick{
2246035553Spatrickpublic:
2346035553Spatrick
2446035553Spatrick    // types:
2546035553Spatrick    typedef T value_type;
2646035553Spatrick    typedef Alloc allocator_type;
2746035553Spatrick    typedef typename allocator_type::reference reference;
2846035553Spatrick    typedef typename allocator_type::const_reference const_reference;
2946035553Spatrick    typedef typename allocator_type::pointer pointer;
3046035553Spatrick    typedef typename allocator_type::const_pointer const_pointer;
3146035553Spatrick    typedef implementation-defined iterator;
3246035553Spatrick    typedef implementation-defined const_iterator;
3346035553Spatrick    typedef implementation-defined size_type;
3446035553Spatrick    typedef implementation-defined difference_type;
3546035553Spatrick    typedef reverse_iterator<iterator> reverse_iterator;
3646035553Spatrick    typedef reverse_iterator<const_iterator> const_reverse_iterator;
3746035553Spatrick
3846035553Spatrick    list()
3946035553Spatrick        noexcept(is_nothrow_default_constructible<allocator_type>::value);
4046035553Spatrick    explicit list(const allocator_type& a);
4146035553Spatrick    explicit list(size_type n);
4246035553Spatrick    explicit list(size_type n, const allocator_type& a); // C++14
4346035553Spatrick    list(size_type n, const value_type& value);
4446035553Spatrick    list(size_type n, const value_type& value, const allocator_type& a);
4546035553Spatrick    template <class Iter>
4646035553Spatrick        list(Iter first, Iter last);
4746035553Spatrick    template <class Iter>
4846035553Spatrick        list(Iter first, Iter last, const allocator_type& a);
4946035553Spatrick    list(const list& x);
5046035553Spatrick    list(const list&, const allocator_type& a);
5146035553Spatrick    list(list&& x)
5246035553Spatrick        noexcept(is_nothrow_move_constructible<allocator_type>::value);
5346035553Spatrick    list(list&&, const allocator_type& a);
5446035553Spatrick    list(initializer_list<value_type>);
5546035553Spatrick    list(initializer_list<value_type>, const allocator_type& a);
5646035553Spatrick
5746035553Spatrick    ~list();
5846035553Spatrick
5946035553Spatrick    list& operator=(const list& x);
6046035553Spatrick    list& operator=(list&& x)
6146035553Spatrick        noexcept(
6246035553Spatrick             allocator_type::propagate_on_container_move_assignment::value &&
6346035553Spatrick             is_nothrow_move_assignable<allocator_type>::value);
6446035553Spatrick    list& operator=(initializer_list<value_type>);
6546035553Spatrick    template <class Iter>
6646035553Spatrick        void assign(Iter first, Iter last);
6746035553Spatrick    void assign(size_type n, const value_type& t);
6846035553Spatrick    void assign(initializer_list<value_type>);
6946035553Spatrick
7046035553Spatrick    allocator_type get_allocator() const noexcept;
7146035553Spatrick
7246035553Spatrick    iterator begin() noexcept;
7346035553Spatrick    const_iterator begin() const noexcept;
7446035553Spatrick    iterator end() noexcept;
7546035553Spatrick    const_iterator end() const noexcept;
7646035553Spatrick    reverse_iterator rbegin() noexcept;
7746035553Spatrick    const_reverse_iterator rbegin() const noexcept;
7846035553Spatrick    reverse_iterator rend() noexcept;
7946035553Spatrick    const_reverse_iterator rend() const noexcept;
8046035553Spatrick    const_iterator cbegin() const noexcept;
8146035553Spatrick    const_iterator cend() const noexcept;
8246035553Spatrick    const_reverse_iterator crbegin() const noexcept;
8346035553Spatrick    const_reverse_iterator crend() const noexcept;
8446035553Spatrick
8546035553Spatrick    reference front();
8646035553Spatrick    const_reference front() const;
8746035553Spatrick    reference back();
8846035553Spatrick    const_reference back() const;
8946035553Spatrick
9046035553Spatrick    bool empty() const noexcept;
9146035553Spatrick    size_type size() const noexcept;
9246035553Spatrick    size_type max_size() const noexcept;
9346035553Spatrick
9446035553Spatrick    template <class... Args>
9546035553Spatrick        reference emplace_front(Args&&... args); // reference in C++17
9646035553Spatrick    void pop_front();
9746035553Spatrick    template <class... Args>
9846035553Spatrick        reference emplace_back(Args&&... args);  // reference in C++17
9946035553Spatrick    void pop_back();
10046035553Spatrick    void push_front(const value_type& x);
10146035553Spatrick    void push_front(value_type&& x);
10246035553Spatrick    void push_back(const value_type& x);
10346035553Spatrick    void push_back(value_type&& x);
10446035553Spatrick    template <class... Args>
10546035553Spatrick        iterator emplace(const_iterator position, Args&&... args);
10646035553Spatrick    iterator insert(const_iterator position, const value_type& x);
10746035553Spatrick    iterator insert(const_iterator position, value_type&& x);
10846035553Spatrick    iterator insert(const_iterator position, size_type n, const value_type& x);
10946035553Spatrick    template <class Iter>
11046035553Spatrick        iterator insert(const_iterator position, Iter first, Iter last);
11146035553Spatrick    iterator insert(const_iterator position, initializer_list<value_type> il);
11246035553Spatrick
11346035553Spatrick    iterator erase(const_iterator position);
11446035553Spatrick    iterator erase(const_iterator position, const_iterator last);
11546035553Spatrick
11646035553Spatrick    void resize(size_type sz);
11746035553Spatrick    void resize(size_type sz, const value_type& c);
11846035553Spatrick
11946035553Spatrick    void swap(list&)
12046035553Spatrick        noexcept(allocator_traits<allocator_type>::is_always_equal::value);  // C++17
12146035553Spatrick    void clear() noexcept;
12246035553Spatrick
12346035553Spatrick    void splice(const_iterator position, list& x);
12446035553Spatrick    void splice(const_iterator position, list&& x);
12546035553Spatrick    void splice(const_iterator position, list& x, const_iterator i);
12646035553Spatrick    void splice(const_iterator position, list&& x, const_iterator i);
12746035553Spatrick    void splice(const_iterator position, list& x, const_iterator first,
12846035553Spatrick                                                  const_iterator last);
12946035553Spatrick    void splice(const_iterator position, list&& x, const_iterator first,
13046035553Spatrick                                                  const_iterator last);
13146035553Spatrick
13246035553Spatrick    size_type remove(const value_type& value);       // void before C++20
13346035553Spatrick    template <class Pred>
13446035553Spatrick      size_type remove_if(Pred pred);                // void before C++20
13546035553Spatrick    size_type unique();                              // void before C++20
13646035553Spatrick    template <class BinaryPredicate>
13746035553Spatrick      size_type unique(BinaryPredicate binary_pred); // void before C++20
13846035553Spatrick    void merge(list& x);
13946035553Spatrick    void merge(list&& x);
14046035553Spatrick    template <class Compare>
14146035553Spatrick        void merge(list& x, Compare comp);
14246035553Spatrick    template <class Compare>
14346035553Spatrick        void merge(list&& x, Compare comp);
14446035553Spatrick    void sort();
14546035553Spatrick    template <class Compare>
14646035553Spatrick        void sort(Compare comp);
14746035553Spatrick    void reverse() noexcept;
14846035553Spatrick};
14946035553Spatrick
15046035553Spatrick
15146035553Spatricktemplate <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>>
15246035553Spatrick    list(InputIterator, InputIterator, Allocator = Allocator())
15346035553Spatrick    -> list<typename iterator_traits<InputIterator>::value_type, Allocator>;  // C++17
15446035553Spatrick
15546035553Spatricktemplate <class T, class Alloc>
15646035553Spatrick    bool operator==(const list<T,Alloc>& x, const list<T,Alloc>& y);
15746035553Spatricktemplate <class T, class Alloc>
15846035553Spatrick    bool operator< (const list<T,Alloc>& x, const list<T,Alloc>& y);
15946035553Spatricktemplate <class T, class Alloc>
16046035553Spatrick    bool operator!=(const list<T,Alloc>& x, const list<T,Alloc>& y);
16146035553Spatricktemplate <class T, class Alloc>
16246035553Spatrick    bool operator> (const list<T,Alloc>& x, const list<T,Alloc>& y);
16346035553Spatricktemplate <class T, class Alloc>
16446035553Spatrick    bool operator>=(const list<T,Alloc>& x, const list<T,Alloc>& y);
16546035553Spatricktemplate <class T, class Alloc>
16646035553Spatrick    bool operator<=(const list<T,Alloc>& x, const list<T,Alloc>& y);
16746035553Spatrick
16846035553Spatricktemplate <class T, class Alloc>
16946035553Spatrick    void swap(list<T,Alloc>& x, list<T,Alloc>& y)
17046035553Spatrick         noexcept(noexcept(x.swap(y)));
17146035553Spatrick
17246035553Spatricktemplate <class T, class Allocator, class U>
173037e7968Spatrick    typename list<T, Allocator>::size_type
174037e7968Spatrick    erase(list<T, Allocator>& c, const U& value);       // C++20
17546035553Spatricktemplate <class T, class Allocator, class Predicate>
176037e7968Spatrick    typename list<T, Allocator>::size_type
177037e7968Spatrick    erase_if(list<T, Allocator>& c, Predicate pred);    // C++20
17846035553Spatrick
17946035553Spatrick}  // std
18046035553Spatrick
18146035553Spatrick*/
18246035553Spatrick
183*4bdff4beSrobert#include <__algorithm/comp.h>
184*4bdff4beSrobert#include <__algorithm/equal.h>
185*4bdff4beSrobert#include <__algorithm/lexicographical_compare.h>
186*4bdff4beSrobert#include <__algorithm/min.h>
187*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler
18846035553Spatrick#include <__config>
18976d0caaeSpatrick#include <__debug>
190*4bdff4beSrobert#include <__format/enable_insertable.h>
191*4bdff4beSrobert#include <__iterator/distance.h>
192*4bdff4beSrobert#include <__iterator/iterator_traits.h>
193*4bdff4beSrobert#include <__iterator/move_iterator.h>
194*4bdff4beSrobert#include <__iterator/next.h>
195*4bdff4beSrobert#include <__iterator/prev.h>
196*4bdff4beSrobert#include <__iterator/reverse_iterator.h>
197*4bdff4beSrobert#include <__memory/addressof.h>
198*4bdff4beSrobert#include <__memory/allocator.h>
199*4bdff4beSrobert#include <__memory/allocator_destructor.h>
200*4bdff4beSrobert#include <__memory/allocator_traits.h>
201*4bdff4beSrobert#include <__memory/compressed_pair.h>
202*4bdff4beSrobert#include <__memory/pointer_traits.h>
203*4bdff4beSrobert#include <__memory/swap_allocator.h>
204*4bdff4beSrobert#include <__memory/unique_ptr.h>
205*4bdff4beSrobert#include <__memory_resource/polymorphic_allocator.h>
206*4bdff4beSrobert#include <__type_traits/is_allocator.h>
20776d0caaeSpatrick#include <__utility/forward.h>
208*4bdff4beSrobert#include <__utility/move.h>
209*4bdff4beSrobert#include <__utility/swap.h>
210*4bdff4beSrobert#include <cstring>
21176d0caaeSpatrick#include <limits>
21246035553Spatrick#include <type_traits>
21346035553Spatrick#include <version>
21446035553Spatrick
215*4bdff4beSrobert// standard-mandated includes
216*4bdff4beSrobert
217*4bdff4beSrobert// [iterator.range]
218*4bdff4beSrobert#include <__iterator/access.h>
219*4bdff4beSrobert#include <__iterator/data.h>
220*4bdff4beSrobert#include <__iterator/empty.h>
221*4bdff4beSrobert#include <__iterator/reverse_access.h>
222*4bdff4beSrobert#include <__iterator/size.h>
223*4bdff4beSrobert
224*4bdff4beSrobert// [list.syn]
225*4bdff4beSrobert#include <compare>
226*4bdff4beSrobert#include <initializer_list>
227*4bdff4beSrobert
22846035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
22946035553Spatrick#  pragma GCC system_header
23046035553Spatrick#endif
23146035553Spatrick
23246035553Spatrick_LIBCPP_PUSH_MACROS
23346035553Spatrick#include <__undef_macros>
23446035553Spatrick
23546035553Spatrick
23646035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD
23746035553Spatrick
23846035553Spatricktemplate <class _Tp, class _VoidPtr> struct __list_node;
23946035553Spatricktemplate <class _Tp, class _VoidPtr> struct __list_node_base;
24046035553Spatrick
24146035553Spatricktemplate <class _Tp, class _VoidPtr>
24246035553Spatrickstruct __list_node_pointer_traits {
243*4bdff4beSrobert  typedef __rebind_pointer_t<_VoidPtr, __list_node<_Tp, _VoidPtr> >
24446035553Spatrick        __node_pointer;
245*4bdff4beSrobert  typedef __rebind_pointer_t<_VoidPtr, __list_node_base<_Tp, _VoidPtr> >
24646035553Spatrick        __base_pointer;
24746035553Spatrick
24846035553Spatrick#if defined(_LIBCPP_ABI_LIST_REMOVE_NODE_POINTER_UB)
24946035553Spatrick  typedef __base_pointer __link_pointer;
25046035553Spatrick#else
251*4bdff4beSrobert  typedef __conditional_t<is_pointer<_VoidPtr>::value, __base_pointer, __node_pointer> __link_pointer;
25246035553Spatrick#endif
25346035553Spatrick
254*4bdff4beSrobert  typedef __conditional_t<is_same<__link_pointer, __node_pointer>::value, __base_pointer, __node_pointer>
255*4bdff4beSrobert      __non_link_pointer;
25646035553Spatrick
25746035553Spatrick  static _LIBCPP_INLINE_VISIBILITY
25846035553Spatrick  __link_pointer __unsafe_link_pointer_cast(__link_pointer __p) {
25946035553Spatrick      return __p;
26046035553Spatrick  }
26146035553Spatrick
26246035553Spatrick  static _LIBCPP_INLINE_VISIBILITY
26346035553Spatrick  __link_pointer __unsafe_link_pointer_cast(__non_link_pointer __p) {
26446035553Spatrick      return static_cast<__link_pointer>(static_cast<_VoidPtr>(__p));
26546035553Spatrick  }
26646035553Spatrick
26746035553Spatrick};
26846035553Spatrick
26946035553Spatricktemplate <class _Tp, class _VoidPtr>
27046035553Spatrickstruct __list_node_base
27146035553Spatrick{
27246035553Spatrick    typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits;
27346035553Spatrick    typedef typename _NodeTraits::__node_pointer __node_pointer;
27446035553Spatrick    typedef typename _NodeTraits::__base_pointer __base_pointer;
27546035553Spatrick    typedef typename _NodeTraits::__link_pointer __link_pointer;
27646035553Spatrick
27746035553Spatrick    __link_pointer __prev_;
27846035553Spatrick    __link_pointer __next_;
27946035553Spatrick
28046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
28146035553Spatrick    __list_node_base() : __prev_(_NodeTraits::__unsafe_link_pointer_cast(__self())),
28246035553Spatrick                         __next_(_NodeTraits::__unsafe_link_pointer_cast(__self())) {}
28346035553Spatrick
28446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
28546035553Spatrick    __base_pointer __self() {
28646035553Spatrick        return pointer_traits<__base_pointer>::pointer_to(*this);
28746035553Spatrick    }
28846035553Spatrick
28946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
29046035553Spatrick    __node_pointer __as_node() {
29146035553Spatrick        return static_cast<__node_pointer>(__self());
29246035553Spatrick    }
29346035553Spatrick};
29446035553Spatrick
29546035553Spatricktemplate <class _Tp, class _VoidPtr>
29676d0caaeSpatrickstruct _LIBCPP_STANDALONE_DEBUG __list_node
29746035553Spatrick    : public __list_node_base<_Tp, _VoidPtr>
29846035553Spatrick{
29946035553Spatrick    _Tp __value_;
30046035553Spatrick
30146035553Spatrick    typedef __list_node_base<_Tp, _VoidPtr> __base;
30246035553Spatrick    typedef typename __base::__link_pointer __link_pointer;
30346035553Spatrick
30446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
30546035553Spatrick    __link_pointer __as_link() {
30646035553Spatrick        return static_cast<__link_pointer>(__base::__self());
30746035553Spatrick    }
30846035553Spatrick};
30946035553Spatrick
31046035553Spatricktemplate <class _Tp, class _Alloc = allocator<_Tp> > class _LIBCPP_TEMPLATE_VIS list;
31146035553Spatricktemplate <class _Tp, class _Alloc> class __list_imp;
31246035553Spatricktemplate <class _Tp, class _VoidPtr> class _LIBCPP_TEMPLATE_VIS __list_const_iterator;
31346035553Spatrick
31446035553Spatricktemplate <class _Tp, class _VoidPtr>
31546035553Spatrickclass _LIBCPP_TEMPLATE_VIS __list_iterator
31646035553Spatrick{
31746035553Spatrick    typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits;
31846035553Spatrick    typedef typename _NodeTraits::__link_pointer __link_pointer;
31946035553Spatrick
32046035553Spatrick    __link_pointer __ptr_;
32146035553Spatrick
32246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
32346035553Spatrick    explicit __list_iterator(__link_pointer __p, const void* __c) _NOEXCEPT
32446035553Spatrick        : __ptr_(__p)
32546035553Spatrick    {
326*4bdff4beSrobert        (void)__c;
327*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
32846035553Spatrick        __get_db()->__insert_ic(this, __c);
32946035553Spatrick#endif
330*4bdff4beSrobert    }
33146035553Spatrick
33246035553Spatrick    template<class, class> friend class list;
33346035553Spatrick    template<class, class> friend class __list_imp;
33446035553Spatrick    template<class, class> friend class __list_const_iterator;
33546035553Spatrickpublic:
33646035553Spatrick    typedef bidirectional_iterator_tag       iterator_category;
33746035553Spatrick    typedef _Tp                              value_type;
33846035553Spatrick    typedef value_type&                      reference;
339*4bdff4beSrobert    typedef __rebind_pointer_t<_VoidPtr, value_type> pointer;
34046035553Spatrick    typedef typename pointer_traits<pointer>::difference_type difference_type;
34146035553Spatrick
34246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
34346035553Spatrick    __list_iterator() _NOEXCEPT : __ptr_(nullptr)
34446035553Spatrick    {
345*4bdff4beSrobert        _VSTD::__debug_db_insert_i(this);
34646035553Spatrick    }
34746035553Spatrick
348*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
34946035553Spatrick
35046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
35146035553Spatrick    __list_iterator(const __list_iterator& __p)
35246035553Spatrick        : __ptr_(__p.__ptr_)
35346035553Spatrick    {
354*4bdff4beSrobert        __get_db()->__iterator_copy(this, _VSTD::addressof(__p));
35546035553Spatrick    }
35646035553Spatrick
35746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
35846035553Spatrick    ~__list_iterator()
35946035553Spatrick    {
36046035553Spatrick        __get_db()->__erase_i(this);
36146035553Spatrick    }
36246035553Spatrick
36346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
36446035553Spatrick    __list_iterator& operator=(const __list_iterator& __p)
36546035553Spatrick    {
366*4bdff4beSrobert        if (this != _VSTD::addressof(__p))
36746035553Spatrick        {
368*4bdff4beSrobert            __get_db()->__iterator_copy(this, _VSTD::addressof(__p));
36946035553Spatrick            __ptr_ = __p.__ptr_;
37046035553Spatrick        }
37146035553Spatrick        return *this;
37246035553Spatrick    }
37346035553Spatrick
374*4bdff4beSrobert#endif // _LIBCPP_ENABLE_DEBUG_MODE
37546035553Spatrick
37646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
37746035553Spatrick    reference operator*() const
37846035553Spatrick    {
379*4bdff4beSrobert        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
38046035553Spatrick                             "Attempted to dereference a non-dereferenceable list::iterator");
38146035553Spatrick        return __ptr_->__as_node()->__value_;
38246035553Spatrick    }
38346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
38446035553Spatrick    pointer operator->() const
38546035553Spatrick    {
386*4bdff4beSrobert        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
38746035553Spatrick                             "Attempted to dereference a non-dereferenceable list::iterator");
38846035553Spatrick        return pointer_traits<pointer>::pointer_to(__ptr_->__as_node()->__value_);
38946035553Spatrick    }
39046035553Spatrick
39146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
39246035553Spatrick    __list_iterator& operator++()
39346035553Spatrick    {
394*4bdff4beSrobert        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
39576d0caaeSpatrick                             "Attempted to increment a non-incrementable list::iterator");
39646035553Spatrick        __ptr_ = __ptr_->__next_;
39746035553Spatrick        return *this;
39846035553Spatrick    }
39946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
40046035553Spatrick    __list_iterator operator++(int) {__list_iterator __t(*this); ++(*this); return __t;}
40146035553Spatrick
40246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
40346035553Spatrick    __list_iterator& operator--()
40446035553Spatrick    {
405*4bdff4beSrobert        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__decrementable(this),
40676d0caaeSpatrick                             "Attempted to decrement a non-decrementable list::iterator");
40746035553Spatrick        __ptr_ = __ptr_->__prev_;
40846035553Spatrick        return *this;
40946035553Spatrick    }
41046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
41146035553Spatrick    __list_iterator operator--(int) {__list_iterator __t(*this); --(*this); return __t;}
41246035553Spatrick
41346035553Spatrick    friend _LIBCPP_INLINE_VISIBILITY
41446035553Spatrick    bool operator==(const __list_iterator& __x, const __list_iterator& __y)
41546035553Spatrick    {
41646035553Spatrick        return __x.__ptr_ == __y.__ptr_;
41746035553Spatrick    }
41846035553Spatrick    friend _LIBCPP_INLINE_VISIBILITY
41946035553Spatrick     bool operator!=(const __list_iterator& __x, const __list_iterator& __y)
42046035553Spatrick        {return !(__x == __y);}
42146035553Spatrick};
42246035553Spatrick
42346035553Spatricktemplate <class _Tp, class _VoidPtr>
42446035553Spatrickclass _LIBCPP_TEMPLATE_VIS __list_const_iterator
42546035553Spatrick{
42646035553Spatrick    typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits;
42746035553Spatrick    typedef typename _NodeTraits::__link_pointer __link_pointer;
42846035553Spatrick
42946035553Spatrick    __link_pointer __ptr_;
43046035553Spatrick
43146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
43246035553Spatrick    explicit __list_const_iterator(__link_pointer __p, const void* __c) _NOEXCEPT
43346035553Spatrick        : __ptr_(__p)
43446035553Spatrick    {
435*4bdff4beSrobert        (void)__c;
436*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
43746035553Spatrick        __get_db()->__insert_ic(this, __c);
43846035553Spatrick#endif
439*4bdff4beSrobert    }
44046035553Spatrick
44146035553Spatrick    template<class, class> friend class list;
44246035553Spatrick    template<class, class> friend class __list_imp;
44346035553Spatrickpublic:
44446035553Spatrick    typedef bidirectional_iterator_tag       iterator_category;
44546035553Spatrick    typedef _Tp                              value_type;
44646035553Spatrick    typedef const value_type&                reference;
447*4bdff4beSrobert    typedef __rebind_pointer_t<_VoidPtr, const value_type> pointer;
44846035553Spatrick    typedef typename pointer_traits<pointer>::difference_type difference_type;
44946035553Spatrick
45046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
45146035553Spatrick    __list_const_iterator() _NOEXCEPT : __ptr_(nullptr)
45246035553Spatrick    {
453*4bdff4beSrobert        _VSTD::__debug_db_insert_i(this);
45446035553Spatrick    }
45546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
45646035553Spatrick    __list_const_iterator(const __list_iterator<_Tp, _VoidPtr>& __p) _NOEXCEPT
45746035553Spatrick        : __ptr_(__p.__ptr_)
45846035553Spatrick    {
459*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
460*4bdff4beSrobert        __get_db()->__iterator_copy(this, _VSTD::addressof(__p));
46146035553Spatrick#endif
46246035553Spatrick    }
46346035553Spatrick
464*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
46546035553Spatrick
46646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
46746035553Spatrick    __list_const_iterator(const __list_const_iterator& __p)
46846035553Spatrick        : __ptr_(__p.__ptr_)
46946035553Spatrick    {
470*4bdff4beSrobert        __get_db()->__iterator_copy(this, _VSTD::addressof(__p));
47146035553Spatrick    }
47246035553Spatrick
47346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
47446035553Spatrick    ~__list_const_iterator()
47546035553Spatrick    {
47646035553Spatrick        __get_db()->__erase_i(this);
47746035553Spatrick    }
47846035553Spatrick
47946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
48046035553Spatrick    __list_const_iterator& operator=(const __list_const_iterator& __p)
48146035553Spatrick    {
482*4bdff4beSrobert        if (this != _VSTD::addressof(__p))
48346035553Spatrick        {
484*4bdff4beSrobert            __get_db()->__iterator_copy(this, _VSTD::addressof(__p));
48546035553Spatrick            __ptr_ = __p.__ptr_;
48646035553Spatrick        }
48746035553Spatrick        return *this;
48846035553Spatrick    }
48946035553Spatrick
490*4bdff4beSrobert#endif // _LIBCPP_ENABLE_DEBUG_MODE
49146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
49246035553Spatrick    reference operator*() const
49346035553Spatrick    {
494*4bdff4beSrobert        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
49546035553Spatrick                             "Attempted to dereference a non-dereferenceable list::const_iterator");
49646035553Spatrick        return __ptr_->__as_node()->__value_;
49746035553Spatrick    }
49846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
49946035553Spatrick    pointer operator->() const
50046035553Spatrick    {
501*4bdff4beSrobert        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
50246035553Spatrick                             "Attempted to dereference a non-dereferenceable list::const_iterator");
50346035553Spatrick        return pointer_traits<pointer>::pointer_to(__ptr_->__as_node()->__value_);
50446035553Spatrick    }
50546035553Spatrick
50646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
50746035553Spatrick    __list_const_iterator& operator++()
50846035553Spatrick    {
509*4bdff4beSrobert        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
51076d0caaeSpatrick                             "Attempted to increment a non-incrementable list::const_iterator");
51146035553Spatrick        __ptr_ = __ptr_->__next_;
51246035553Spatrick        return *this;
51346035553Spatrick    }
51446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
51546035553Spatrick    __list_const_iterator operator++(int) {__list_const_iterator __t(*this); ++(*this); return __t;}
51646035553Spatrick
51746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
51846035553Spatrick    __list_const_iterator& operator--()
51946035553Spatrick    {
520*4bdff4beSrobert        _LIBCPP_DEBUG_ASSERT(__get_const_db()->__decrementable(this),
52176d0caaeSpatrick                             "Attempted to decrement a non-decrementable list::const_iterator");
52246035553Spatrick        __ptr_ = __ptr_->__prev_;
52346035553Spatrick        return *this;
52446035553Spatrick    }
52546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
52646035553Spatrick    __list_const_iterator operator--(int) {__list_const_iterator __t(*this); --(*this); return __t;}
52746035553Spatrick
52846035553Spatrick    friend _LIBCPP_INLINE_VISIBILITY
52946035553Spatrick    bool operator==(const __list_const_iterator& __x, const __list_const_iterator& __y)
53046035553Spatrick    {
53146035553Spatrick        return __x.__ptr_ == __y.__ptr_;
53246035553Spatrick    }
53346035553Spatrick    friend _LIBCPP_INLINE_VISIBILITY
53446035553Spatrick    bool operator!=(const __list_const_iterator& __x, const __list_const_iterator& __y)
53546035553Spatrick        {return !(__x == __y);}
53646035553Spatrick};
53746035553Spatrick
53846035553Spatricktemplate <class _Tp, class _Alloc>
53946035553Spatrickclass __list_imp
54046035553Spatrick{
54146035553Spatrick    __list_imp(const __list_imp&);
54246035553Spatrick    __list_imp& operator=(const __list_imp&);
54346035553Spatrickpublic:
54446035553Spatrick    typedef _Alloc                                                  allocator_type;
54546035553Spatrick    typedef allocator_traits<allocator_type>                        __alloc_traits;
54646035553Spatrick    typedef typename __alloc_traits::size_type                      size_type;
54746035553Spatrickprotected:
54846035553Spatrick    typedef _Tp                                                     value_type;
54946035553Spatrick    typedef typename __alloc_traits::void_pointer                   __void_pointer;
55046035553Spatrick    typedef __list_iterator<value_type, __void_pointer>             iterator;
55146035553Spatrick    typedef __list_const_iterator<value_type, __void_pointer>       const_iterator;
55246035553Spatrick    typedef __list_node_base<value_type, __void_pointer>            __node_base;
55346035553Spatrick    typedef __list_node<value_type, __void_pointer>                 __node;
554*4bdff4beSrobert    typedef __rebind_alloc<__alloc_traits, __node>                  __node_allocator;
55546035553Spatrick    typedef allocator_traits<__node_allocator>                       __node_alloc_traits;
55646035553Spatrick    typedef typename __node_alloc_traits::pointer                    __node_pointer;
55746035553Spatrick    typedef typename __node_alloc_traits::pointer                    __node_const_pointer;
55846035553Spatrick    typedef __list_node_pointer_traits<value_type, __void_pointer> __node_pointer_traits;
55946035553Spatrick    typedef typename __node_pointer_traits::__link_pointer __link_pointer;
56046035553Spatrick    typedef __link_pointer __link_const_pointer;
56146035553Spatrick    typedef typename __alloc_traits::pointer                         pointer;
56246035553Spatrick    typedef typename __alloc_traits::const_pointer                   const_pointer;
56346035553Spatrick    typedef typename __alloc_traits::difference_type                 difference_type;
56446035553Spatrick
565*4bdff4beSrobert    typedef __rebind_alloc<__alloc_traits, __node_base>               __node_base_allocator;
56646035553Spatrick    typedef typename allocator_traits<__node_base_allocator>::pointer __node_base_pointer;
56746035553Spatrick    static_assert((!is_same<allocator_type, __node_allocator>::value),
56846035553Spatrick                  "internal allocator type must differ from user-specified "
56946035553Spatrick                  "type; otherwise overload resolution breaks");
57046035553Spatrick
57146035553Spatrick    __node_base __end_;
57246035553Spatrick    __compressed_pair<size_type, __node_allocator> __size_alloc_;
57346035553Spatrick
57446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
57546035553Spatrick    __link_pointer __end_as_link() const _NOEXCEPT {
57646035553Spatrick        return __node_pointer_traits::__unsafe_link_pointer_cast(
57746035553Spatrick                const_cast<__node_base&>(__end_).__self());
57846035553Spatrick    }
57946035553Spatrick
58046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
58146035553Spatrick          size_type& __sz() _NOEXCEPT {return __size_alloc_.first();}
58246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
58346035553Spatrick    const size_type& __sz() const _NOEXCEPT
58446035553Spatrick        {return __size_alloc_.first();}
58546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
58646035553Spatrick          __node_allocator& __node_alloc() _NOEXCEPT
58746035553Spatrick          {return __size_alloc_.second();}
58846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
58946035553Spatrick    const __node_allocator& __node_alloc() const _NOEXCEPT
59046035553Spatrick        {return __size_alloc_.second();}
59146035553Spatrick
59246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
59346035553Spatrick    size_type __node_alloc_max_size() const _NOEXCEPT {
59446035553Spatrick        return __node_alloc_traits::max_size(__node_alloc());
59546035553Spatrick    }
59646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
59746035553Spatrick    static void __unlink_nodes(__link_pointer __f, __link_pointer __l) _NOEXCEPT;
59846035553Spatrick
59946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
60046035553Spatrick    __list_imp()
60146035553Spatrick        _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value);
60246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
60346035553Spatrick    __list_imp(const allocator_type& __a);
60446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
60546035553Spatrick    __list_imp(const __node_allocator& __a);
60646035553Spatrick#ifndef _LIBCPP_CXX03_LANG
60746035553Spatrick    __list_imp(__node_allocator&& __a) _NOEXCEPT;
60846035553Spatrick#endif
60946035553Spatrick    ~__list_imp();
61046035553Spatrick    void clear() _NOEXCEPT;
61146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
61246035553Spatrick    bool empty() const _NOEXCEPT {return __sz() == 0;}
61346035553Spatrick
61446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
61546035553Spatrick    iterator begin() _NOEXCEPT
61646035553Spatrick    {
61746035553Spatrick        return iterator(__end_.__next_, this);
61846035553Spatrick    }
61946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
62046035553Spatrick    const_iterator begin() const  _NOEXCEPT
62146035553Spatrick    {
62246035553Spatrick        return const_iterator(__end_.__next_, this);
62346035553Spatrick    }
62446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
62546035553Spatrick    iterator end() _NOEXCEPT
62646035553Spatrick    {
62746035553Spatrick        return iterator(__end_as_link(), this);
62846035553Spatrick    }
62946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
63046035553Spatrick    const_iterator end() const _NOEXCEPT
63146035553Spatrick    {
63246035553Spatrick        return const_iterator(__end_as_link(), this);
63346035553Spatrick    }
63446035553Spatrick
63546035553Spatrick    void swap(__list_imp& __c)
63646035553Spatrick#if _LIBCPP_STD_VER >= 14
63746035553Spatrick        _NOEXCEPT;
63846035553Spatrick#else
63946035553Spatrick        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
64046035553Spatrick                    __is_nothrow_swappable<allocator_type>::value);
64146035553Spatrick#endif
64246035553Spatrick
64346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
64446035553Spatrick    void __copy_assign_alloc(const __list_imp& __c)
64546035553Spatrick        {__copy_assign_alloc(__c, integral_constant<bool,
64646035553Spatrick                      __node_alloc_traits::propagate_on_container_copy_assignment::value>());}
64746035553Spatrick
64846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
64946035553Spatrick    void __move_assign_alloc(__list_imp& __c)
65046035553Spatrick        _NOEXCEPT_(
65146035553Spatrick            !__node_alloc_traits::propagate_on_container_move_assignment::value ||
65246035553Spatrick            is_nothrow_move_assignable<__node_allocator>::value)
65346035553Spatrick        {__move_assign_alloc(__c, integral_constant<bool,
65446035553Spatrick                      __node_alloc_traits::propagate_on_container_move_assignment::value>());}
65546035553Spatrick
65646035553Spatrickprivate:
65746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
65846035553Spatrick    void __copy_assign_alloc(const __list_imp& __c, true_type)
65946035553Spatrick        {
66046035553Spatrick            if (__node_alloc() != __c.__node_alloc())
66146035553Spatrick                clear();
66246035553Spatrick            __node_alloc() = __c.__node_alloc();
66346035553Spatrick        }
66446035553Spatrick
66546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
66646035553Spatrick    void __copy_assign_alloc(const __list_imp&, false_type)
66746035553Spatrick        {}
66846035553Spatrick
66946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
67046035553Spatrick    void __move_assign_alloc(__list_imp& __c, true_type)
67146035553Spatrick        _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value)
67246035553Spatrick        {
67346035553Spatrick            __node_alloc() = _VSTD::move(__c.__node_alloc());
67446035553Spatrick        }
67546035553Spatrick
67646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
67746035553Spatrick    void __move_assign_alloc(__list_imp&, false_type)
67846035553Spatrick        _NOEXCEPT
67946035553Spatrick        {}
68046035553Spatrick};
68146035553Spatrick
68246035553Spatrick// Unlink nodes [__f, __l]
68346035553Spatricktemplate <class _Tp, class _Alloc>
68446035553Spatrickinline
68546035553Spatrickvoid
68646035553Spatrick__list_imp<_Tp, _Alloc>::__unlink_nodes(__link_pointer __f, __link_pointer __l)
68746035553Spatrick    _NOEXCEPT
68846035553Spatrick{
68946035553Spatrick    __f->__prev_->__next_ = __l->__next_;
69046035553Spatrick    __l->__next_->__prev_ = __f->__prev_;
69146035553Spatrick}
69246035553Spatrick
69346035553Spatricktemplate <class _Tp, class _Alloc>
69446035553Spatrickinline
69546035553Spatrick__list_imp<_Tp, _Alloc>::__list_imp()
69646035553Spatrick        _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value)
69746035553Spatrick    : __size_alloc_(0, __default_init_tag())
69846035553Spatrick{
69946035553Spatrick}
70046035553Spatrick
70146035553Spatricktemplate <class _Tp, class _Alloc>
70246035553Spatrickinline
70346035553Spatrick__list_imp<_Tp, _Alloc>::__list_imp(const allocator_type& __a)
70446035553Spatrick    : __size_alloc_(0, __node_allocator(__a))
70546035553Spatrick{
70646035553Spatrick}
70746035553Spatrick
70846035553Spatricktemplate <class _Tp, class _Alloc>
70946035553Spatrickinline __list_imp<_Tp, _Alloc>::__list_imp(const __node_allocator& __a)
71046035553Spatrick    : __size_alloc_(0, __a) {}
71146035553Spatrick
71246035553Spatrick#ifndef _LIBCPP_CXX03_LANG
71346035553Spatricktemplate <class _Tp, class _Alloc>
71446035553Spatrickinline __list_imp<_Tp, _Alloc>::__list_imp(__node_allocator&& __a) _NOEXCEPT
71576d0caaeSpatrick    : __size_alloc_(0, _VSTD::move(__a)) {}
71646035553Spatrick#endif
71746035553Spatrick
71846035553Spatricktemplate <class _Tp, class _Alloc>
71946035553Spatrick__list_imp<_Tp, _Alloc>::~__list_imp() {
72046035553Spatrick  clear();
721*4bdff4beSrobert  std::__debug_db_erase_c(this);
72246035553Spatrick}
72346035553Spatrick
72446035553Spatricktemplate <class _Tp, class _Alloc>
72546035553Spatrickvoid
72646035553Spatrick__list_imp<_Tp, _Alloc>::clear() _NOEXCEPT
72746035553Spatrick{
72846035553Spatrick    if (!empty())
72946035553Spatrick    {
73046035553Spatrick        __node_allocator& __na = __node_alloc();
73146035553Spatrick        __link_pointer __f = __end_.__next_;
73246035553Spatrick        __link_pointer __l = __end_as_link();
73346035553Spatrick        __unlink_nodes(__f, __l->__prev_);
73446035553Spatrick        __sz() = 0;
73546035553Spatrick        while (__f != __l)
73646035553Spatrick        {
73746035553Spatrick            __node_pointer __np = __f->__as_node();
73846035553Spatrick            __f = __f->__next_;
73946035553Spatrick            __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
74046035553Spatrick            __node_alloc_traits::deallocate(__na, __np, 1);
74146035553Spatrick        }
742*4bdff4beSrobert        std::__debug_db_invalidate_all(this);
74346035553Spatrick    }
74446035553Spatrick}
74546035553Spatrick
74646035553Spatricktemplate <class _Tp, class _Alloc>
74746035553Spatrickvoid
74846035553Spatrick__list_imp<_Tp, _Alloc>::swap(__list_imp& __c)
74946035553Spatrick#if _LIBCPP_STD_VER >= 14
75046035553Spatrick        _NOEXCEPT
75146035553Spatrick#else
75246035553Spatrick        _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value ||
75346035553Spatrick                    __is_nothrow_swappable<allocator_type>::value)
75446035553Spatrick#endif
75546035553Spatrick{
75646035553Spatrick    _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value ||
75746035553Spatrick                   this->__node_alloc() == __c.__node_alloc(),
75846035553Spatrick                   "list::swap: Either propagate_on_container_swap must be true"
75946035553Spatrick                   " or the allocators must compare equal");
76046035553Spatrick    using _VSTD::swap;
76176d0caaeSpatrick    _VSTD::__swap_allocator(__node_alloc(), __c.__node_alloc());
76246035553Spatrick    swap(__sz(), __c.__sz());
76346035553Spatrick    swap(__end_, __c.__end_);
76446035553Spatrick    if (__sz() == 0)
76546035553Spatrick        __end_.__next_ = __end_.__prev_ = __end_as_link();
76646035553Spatrick    else
76746035553Spatrick        __end_.__prev_->__next_ = __end_.__next_->__prev_ = __end_as_link();
76846035553Spatrick    if (__c.__sz() == 0)
76946035553Spatrick        __c.__end_.__next_ = __c.__end_.__prev_ = __c.__end_as_link();
77046035553Spatrick    else
77146035553Spatrick        __c.__end_.__prev_->__next_ = __c.__end_.__next_->__prev_ = __c.__end_as_link();
77246035553Spatrick
773*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
77446035553Spatrick    __libcpp_db* __db = __get_db();
77546035553Spatrick    __c_node* __cn1 = __db->__find_c_and_lock(this);
776*4bdff4beSrobert    __c_node* __cn2 = __db->__find_c(_VSTD::addressof(__c));
77776d0caaeSpatrick    _VSTD::swap(__cn1->beg_, __cn2->beg_);
77876d0caaeSpatrick    _VSTD::swap(__cn1->end_, __cn2->end_);
77976d0caaeSpatrick    _VSTD::swap(__cn1->cap_, __cn2->cap_);
78046035553Spatrick    for (__i_node** __p = __cn1->end_; __p != __cn1->beg_;)
78146035553Spatrick    {
78246035553Spatrick        --__p;
78346035553Spatrick        const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
78446035553Spatrick        if (__i->__ptr_ == __c.__end_as_link())
78546035553Spatrick        {
78646035553Spatrick            __cn2->__add(*__p);
78746035553Spatrick            if (--__cn1->end_ != __p)
78876d0caaeSpatrick                _VSTD::memmove(__p, __p+1, (__cn1->end_ - __p)*sizeof(__i_node*));
78946035553Spatrick        }
79046035553Spatrick        else
79146035553Spatrick            (*__p)->__c_ = __cn1;
79246035553Spatrick    }
79346035553Spatrick    for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;)
79446035553Spatrick    {
79546035553Spatrick        --__p;
79646035553Spatrick        const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
79746035553Spatrick        if (__i->__ptr_ == __end_as_link())
79846035553Spatrick        {
79946035553Spatrick            __cn1->__add(*__p);
80046035553Spatrick            if (--__cn2->end_ != __p)
80176d0caaeSpatrick                _VSTD::memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*));
80246035553Spatrick        }
80346035553Spatrick        else
80446035553Spatrick            (*__p)->__c_ = __cn2;
80546035553Spatrick    }
80646035553Spatrick    __db->unlock();
80746035553Spatrick#endif
80846035553Spatrick}
80946035553Spatrick
81046035553Spatricktemplate <class _Tp, class _Alloc /*= allocator<_Tp>*/>
81146035553Spatrickclass _LIBCPP_TEMPLATE_VIS list
81246035553Spatrick    : private __list_imp<_Tp, _Alloc>
81346035553Spatrick{
81446035553Spatrick    typedef __list_imp<_Tp, _Alloc> base;
81546035553Spatrick    typedef typename base::__node              __node;
81646035553Spatrick    typedef typename base::__node_allocator    __node_allocator;
81746035553Spatrick    typedef typename base::__node_pointer      __node_pointer;
81846035553Spatrick    typedef typename base::__node_alloc_traits __node_alloc_traits;
81946035553Spatrick    typedef typename base::__node_base         __node_base;
82046035553Spatrick    typedef typename base::__node_base_pointer __node_base_pointer;
82146035553Spatrick    typedef typename base::__link_pointer __link_pointer;
82246035553Spatrick
82346035553Spatrickpublic:
82446035553Spatrick    typedef _Tp                                            value_type;
82546035553Spatrick    typedef _Alloc                                         allocator_type;
82646035553Spatrick    static_assert((is_same<value_type, typename allocator_type::value_type>::value),
82746035553Spatrick                  "Invalid allocator::value_type");
82846035553Spatrick    typedef value_type&                                    reference;
82946035553Spatrick    typedef const value_type&                              const_reference;
83046035553Spatrick    typedef typename base::pointer                         pointer;
83146035553Spatrick    typedef typename base::const_pointer                   const_pointer;
83246035553Spatrick    typedef typename base::size_type                       size_type;
83346035553Spatrick    typedef typename base::difference_type                 difference_type;
83446035553Spatrick    typedef typename base::iterator                        iterator;
83546035553Spatrick    typedef typename base::const_iterator                  const_iterator;
83646035553Spatrick    typedef _VSTD::reverse_iterator<iterator>              reverse_iterator;
83746035553Spatrick    typedef _VSTD::reverse_iterator<const_iterator>        const_reverse_iterator;
83846035553Spatrick#if _LIBCPP_STD_VER > 17
83946035553Spatrick    typedef size_type                                      __remove_return_type;
84046035553Spatrick#else
84146035553Spatrick    typedef void                                           __remove_return_type;
84246035553Spatrick#endif
84346035553Spatrick
844*4bdff4beSrobert    static_assert(is_same<allocator_type, __rebind_alloc<allocator_traits<allocator_type>, value_type> >::value,
845*4bdff4beSrobert                  "[allocator.requirements] states that rebinding an allocator to the same type should result in the "
846*4bdff4beSrobert                  "original allocator");
847*4bdff4beSrobert
84846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
84946035553Spatrick    list()
85046035553Spatrick        _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value)
85146035553Spatrick    {
852*4bdff4beSrobert        _VSTD::__debug_db_insert_c(this);
85346035553Spatrick    }
85446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
85546035553Spatrick    explicit list(const allocator_type& __a) : base(__a)
85646035553Spatrick    {
857*4bdff4beSrobert        _VSTD::__debug_db_insert_c(this);
85846035553Spatrick    }
85946035553Spatrick    explicit list(size_type __n);
86046035553Spatrick#if _LIBCPP_STD_VER > 11
86146035553Spatrick    explicit list(size_type __n, const allocator_type& __a);
86246035553Spatrick#endif
86346035553Spatrick    list(size_type __n, const value_type& __x);
864*4bdff4beSrobert    template <class = __enable_if_t<__is_allocator<_Alloc>::value> >
865*4bdff4beSrobert    list(size_type __n, const value_type& __x, const allocator_type& __a) : base(__a)
866*4bdff4beSrobert    {
867*4bdff4beSrobert        _VSTD::__debug_db_insert_c(this);
868*4bdff4beSrobert        for (; __n > 0; --__n)
869*4bdff4beSrobert            push_back(__x);
870*4bdff4beSrobert    }
871*4bdff4beSrobert
87246035553Spatrick    template <class _InpIter>
87346035553Spatrick        list(_InpIter __f, _InpIter __l,
874*4bdff4beSrobert             __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>* = 0);
87546035553Spatrick    template <class _InpIter>
87646035553Spatrick        list(_InpIter __f, _InpIter __l, const allocator_type& __a,
877*4bdff4beSrobert             __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>* = 0);
87846035553Spatrick
87946035553Spatrick    list(const list& __c);
880*4bdff4beSrobert    list(const list& __c, const __type_identity_t<allocator_type>& __a);
88146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
88246035553Spatrick    list& operator=(const list& __c);
88346035553Spatrick#ifndef _LIBCPP_CXX03_LANG
88446035553Spatrick    list(initializer_list<value_type> __il);
88546035553Spatrick    list(initializer_list<value_type> __il, const allocator_type& __a);
88646035553Spatrick
88746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
88846035553Spatrick    list(list&& __c)
88946035553Spatrick        _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value);
89046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
891*4bdff4beSrobert    list(list&& __c, const __type_identity_t<allocator_type>& __a);
89246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
89346035553Spatrick    list& operator=(list&& __c)
89446035553Spatrick        _NOEXCEPT_(
89546035553Spatrick            __node_alloc_traits::propagate_on_container_move_assignment::value &&
89646035553Spatrick            is_nothrow_move_assignable<__node_allocator>::value);
89746035553Spatrick
89846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
89946035553Spatrick    list& operator=(initializer_list<value_type> __il)
90046035553Spatrick        {assign(__il.begin(), __il.end()); return *this;}
90146035553Spatrick
90246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
90346035553Spatrick    void assign(initializer_list<value_type> __il)
90446035553Spatrick        {assign(__il.begin(), __il.end());}
90546035553Spatrick#endif // _LIBCPP_CXX03_LANG
90646035553Spatrick
90746035553Spatrick    template <class _InpIter>
90846035553Spatrick        void assign(_InpIter __f, _InpIter __l,
909*4bdff4beSrobert                    __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>* = 0);
91046035553Spatrick    void assign(size_type __n, const value_type& __x);
91146035553Spatrick
91246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
91346035553Spatrick    allocator_type get_allocator() const _NOEXCEPT;
91446035553Spatrick
91546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
91646035553Spatrick    size_type size() const _NOEXCEPT     {return base::__sz();}
91746035553Spatrick    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
91846035553Spatrick    bool empty() const _NOEXCEPT         {return base::empty();}
91946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
92046035553Spatrick    size_type max_size() const _NOEXCEPT
92146035553Spatrick        {
92276d0caaeSpatrick            return _VSTD::min<size_type>(
92346035553Spatrick                base::__node_alloc_max_size(),
92446035553Spatrick                numeric_limits<difference_type >::max());
92546035553Spatrick        }
92646035553Spatrick
92746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
92846035553Spatrick          iterator begin() _NOEXCEPT        {return base::begin();}
92946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
93046035553Spatrick    const_iterator begin()  const _NOEXCEPT {return base::begin();}
93146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
93246035553Spatrick          iterator end() _NOEXCEPT          {return base::end();}
93346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
93446035553Spatrick    const_iterator end()    const _NOEXCEPT {return base::end();}
93546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
93646035553Spatrick    const_iterator cbegin() const _NOEXCEPT {return base::begin();}
93746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
93846035553Spatrick    const_iterator cend()   const _NOEXCEPT {return base::end();}
93946035553Spatrick
94046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
94146035553Spatrick          reverse_iterator rbegin() _NOEXCEPT
94246035553Spatrick            {return       reverse_iterator(end());}
94346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
94446035553Spatrick    const_reverse_iterator rbegin()  const _NOEXCEPT
94546035553Spatrick        {return const_reverse_iterator(end());}
94646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
94746035553Spatrick          reverse_iterator rend() _NOEXCEPT
94846035553Spatrick            {return       reverse_iterator(begin());}
94946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
95046035553Spatrick    const_reverse_iterator rend()    const _NOEXCEPT
95146035553Spatrick        {return const_reverse_iterator(begin());}
95246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
95346035553Spatrick    const_reverse_iterator crbegin() const _NOEXCEPT
95446035553Spatrick        {return const_reverse_iterator(end());}
95546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
95646035553Spatrick    const_reverse_iterator crend()   const _NOEXCEPT
95746035553Spatrick        {return const_reverse_iterator(begin());}
95846035553Spatrick
95946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
96046035553Spatrick    reference front()
96146035553Spatrick    {
96246035553Spatrick        _LIBCPP_ASSERT(!empty(), "list::front called on empty list");
96346035553Spatrick        return base::__end_.__next_->__as_node()->__value_;
96446035553Spatrick    }
96546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
96646035553Spatrick    const_reference front() const
96746035553Spatrick    {
96846035553Spatrick        _LIBCPP_ASSERT(!empty(), "list::front called on empty list");
96946035553Spatrick        return base::__end_.__next_->__as_node()->__value_;
97046035553Spatrick    }
97146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
97246035553Spatrick    reference back()
97346035553Spatrick    {
97446035553Spatrick        _LIBCPP_ASSERT(!empty(), "list::back called on empty list");
97546035553Spatrick        return base::__end_.__prev_->__as_node()->__value_;
97646035553Spatrick    }
97746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
97846035553Spatrick    const_reference back() const
97946035553Spatrick    {
98046035553Spatrick        _LIBCPP_ASSERT(!empty(), "list::back called on empty list");
98146035553Spatrick        return base::__end_.__prev_->__as_node()->__value_;
98246035553Spatrick    }
98346035553Spatrick
98446035553Spatrick#ifndef _LIBCPP_CXX03_LANG
98546035553Spatrick    void push_front(value_type&& __x);
98646035553Spatrick    void push_back(value_type&& __x);
98746035553Spatrick
98846035553Spatrick    template <class... _Args>
98946035553Spatrick#if _LIBCPP_STD_VER > 14
99046035553Spatrick       reference emplace_front(_Args&&... __args);
99146035553Spatrick#else
99246035553Spatrick       void      emplace_front(_Args&&... __args);
99346035553Spatrick#endif
99446035553Spatrick    template <class... _Args>
99546035553Spatrick#if _LIBCPP_STD_VER > 14
99646035553Spatrick        reference emplace_back(_Args&&... __args);
99746035553Spatrick#else
99846035553Spatrick       void       emplace_back(_Args&&... __args);
99946035553Spatrick#endif
100046035553Spatrick    template <class... _Args>
100146035553Spatrick        iterator emplace(const_iterator __p, _Args&&... __args);
100246035553Spatrick
100346035553Spatrick    iterator insert(const_iterator __p, value_type&& __x);
100446035553Spatrick
100546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
100646035553Spatrick    iterator insert(const_iterator __p, initializer_list<value_type> __il)
100746035553Spatrick        {return insert(__p, __il.begin(), __il.end());}
100846035553Spatrick#endif // _LIBCPP_CXX03_LANG
100946035553Spatrick
101046035553Spatrick    void push_front(const value_type& __x);
101146035553Spatrick    void push_back(const value_type& __x);
101246035553Spatrick
101346035553Spatrick#ifndef _LIBCPP_CXX03_LANG
101446035553Spatrick    template <class _Arg>
101546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
101646035553Spatrick    void __emplace_back(_Arg&& __arg) { emplace_back(_VSTD::forward<_Arg>(__arg)); }
101746035553Spatrick#else
101846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
101946035553Spatrick    void __emplace_back(value_type const& __arg) { push_back(__arg); }
102046035553Spatrick#endif
102146035553Spatrick
102246035553Spatrick    iterator insert(const_iterator __p, const value_type& __x);
102346035553Spatrick    iterator insert(const_iterator __p, size_type __n, const value_type& __x);
102446035553Spatrick    template <class _InpIter>
102546035553Spatrick        iterator insert(const_iterator __p, _InpIter __f, _InpIter __l,
1026*4bdff4beSrobert                        __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>* = 0);
102746035553Spatrick
102846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
102946035553Spatrick    void swap(list& __c)
103046035553Spatrick#if _LIBCPP_STD_VER >= 14
103146035553Spatrick        _NOEXCEPT
103246035553Spatrick#else
103346035553Spatrick        _NOEXCEPT_(!__node_alloc_traits::propagate_on_container_swap::value ||
103446035553Spatrick                   __is_nothrow_swappable<__node_allocator>::value)
103546035553Spatrick#endif
103646035553Spatrick        {base::swap(__c);}
103746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
103846035553Spatrick    void clear() _NOEXCEPT {base::clear();}
103946035553Spatrick
104046035553Spatrick    void pop_front();
104146035553Spatrick    void pop_back();
104246035553Spatrick
104346035553Spatrick    iterator erase(const_iterator __p);
104446035553Spatrick    iterator erase(const_iterator __f, const_iterator __l);
104546035553Spatrick
104646035553Spatrick    void resize(size_type __n);
104746035553Spatrick    void resize(size_type __n, const value_type& __x);
104846035553Spatrick
104946035553Spatrick    void splice(const_iterator __p, list& __c);
105046035553Spatrick#ifndef _LIBCPP_CXX03_LANG
105146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
105246035553Spatrick    void splice(const_iterator __p, list&& __c) {splice(__p, __c);}
105346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
105446035553Spatrick    void splice(const_iterator __p, list&& __c, const_iterator __i)
105546035553Spatrick        {splice(__p, __c, __i);}
105646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
105746035553Spatrick    void splice(const_iterator __p, list&& __c, const_iterator __f, const_iterator __l)
105846035553Spatrick        {splice(__p, __c, __f, __l);}
105946035553Spatrick#endif
106046035553Spatrick    void splice(const_iterator __p, list& __c, const_iterator __i);
106146035553Spatrick    void splice(const_iterator __p, list& __c, const_iterator __f, const_iterator __l);
106246035553Spatrick
106346035553Spatrick    __remove_return_type remove(const value_type& __x);
106446035553Spatrick    template <class _Pred> __remove_return_type remove_if(_Pred __pred);
106546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
1066*4bdff4beSrobert    __remove_return_type unique() { return unique(__equal_to()); }
106746035553Spatrick    template <class _BinaryPred>
106846035553Spatrick        __remove_return_type unique(_BinaryPred __binary_pred);
106946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
107046035553Spatrick    void merge(list& __c);
107146035553Spatrick#ifndef _LIBCPP_CXX03_LANG
107246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
107346035553Spatrick    void merge(list&& __c) {merge(__c);}
107446035553Spatrick
107546035553Spatrick    template <class _Comp>
107646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
107746035553Spatrick        void merge(list&& __c, _Comp __comp) {merge(__c, __comp);}
107846035553Spatrick#endif
107946035553Spatrick    template <class _Comp>
108046035553Spatrick        void merge(list& __c, _Comp __comp);
108146035553Spatrick
108246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
108346035553Spatrick    void sort();
108446035553Spatrick    template <class _Comp>
108546035553Spatrick        _LIBCPP_INLINE_VISIBILITY
108646035553Spatrick        void sort(_Comp __comp);
108746035553Spatrick
108846035553Spatrick    void reverse() _NOEXCEPT;
108946035553Spatrick
109046035553Spatrick    bool __invariants() const;
109146035553Spatrick
109246035553Spatrick    typedef __allocator_destructor<__node_allocator> __node_destructor;
109346035553Spatrick    typedef unique_ptr<__node, __node_destructor> __hold_pointer;
109446035553Spatrick
109546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
109646035553Spatrick    __hold_pointer __allocate_node(__node_allocator& __na) {
109746035553Spatrick      __node_pointer __p = __node_alloc_traits::allocate(__na, 1);
109846035553Spatrick      __p->__prev_ = nullptr;
109946035553Spatrick      return __hold_pointer(__p, __node_destructor(__na, 1));
110046035553Spatrick    }
110146035553Spatrick
1102*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
110346035553Spatrick
110446035553Spatrick    bool __dereferenceable(const const_iterator* __i) const;
110546035553Spatrick    bool __decrementable(const const_iterator* __i) const;
110646035553Spatrick    bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
110746035553Spatrick    bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
110846035553Spatrick
1109*4bdff4beSrobert#endif // _LIBCPP_ENABLE_DEBUG_MODE
111046035553Spatrick
111146035553Spatrickprivate:
111246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
111346035553Spatrick    static void __link_nodes  (__link_pointer __p, __link_pointer __f, __link_pointer __l);
111446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
111546035553Spatrick    void __link_nodes_at_front(__link_pointer __f, __link_pointer __l);
111646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
111746035553Spatrick    void __link_nodes_at_back (__link_pointer __f, __link_pointer __l);
111846035553Spatrick    iterator __iterator(size_type __n);
111946035553Spatrick    template <class _Comp>
112046035553Spatrick        static iterator __sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp);
112146035553Spatrick
112246035553Spatrick    void __move_assign(list& __c, true_type)
112346035553Spatrick        _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value);
112446035553Spatrick    void __move_assign(list& __c, false_type);
112546035553Spatrick};
112646035553Spatrick
1127*4bdff4beSrobert#if _LIBCPP_STD_VER >= 17
112846035553Spatricktemplate<class _InputIterator,
112976d0caaeSpatrick         class _Alloc = allocator<__iter_value_type<_InputIterator>>,
1130*4bdff4beSrobert         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
1131*4bdff4beSrobert         class = enable_if_t<__is_allocator<_Alloc>::value>
113246035553Spatrick         >
113346035553Spatricklist(_InputIterator, _InputIterator)
113476d0caaeSpatrick  -> list<__iter_value_type<_InputIterator>, _Alloc>;
113546035553Spatrick
113646035553Spatricktemplate<class _InputIterator,
113746035553Spatrick         class _Alloc,
1138*4bdff4beSrobert         class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>,
1139*4bdff4beSrobert         class = enable_if_t<__is_allocator<_Alloc>::value>
114046035553Spatrick         >
114146035553Spatricklist(_InputIterator, _InputIterator, _Alloc)
114276d0caaeSpatrick  -> list<__iter_value_type<_InputIterator>, _Alloc>;
114346035553Spatrick#endif
114446035553Spatrick
114546035553Spatrick// Link in nodes [__f, __l] just prior to __p
114646035553Spatricktemplate <class _Tp, class _Alloc>
114746035553Spatrickinline
114846035553Spatrickvoid
114946035553Spatricklist<_Tp, _Alloc>::__link_nodes(__link_pointer __p, __link_pointer __f, __link_pointer __l)
115046035553Spatrick{
115146035553Spatrick    __p->__prev_->__next_ = __f;
115246035553Spatrick    __f->__prev_ = __p->__prev_;
115346035553Spatrick    __p->__prev_ = __l;
115446035553Spatrick    __l->__next_ = __p;
115546035553Spatrick}
115646035553Spatrick
115746035553Spatrick// Link in nodes [__f, __l] at the front of the list
115846035553Spatricktemplate <class _Tp, class _Alloc>
115946035553Spatrickinline
116046035553Spatrickvoid
116146035553Spatricklist<_Tp, _Alloc>::__link_nodes_at_front(__link_pointer __f, __link_pointer __l)
116246035553Spatrick{
116346035553Spatrick    __f->__prev_ = base::__end_as_link();
116446035553Spatrick    __l->__next_ = base::__end_.__next_;
116546035553Spatrick    __l->__next_->__prev_ = __l;
116646035553Spatrick    base::__end_.__next_ = __f;
116746035553Spatrick}
116846035553Spatrick
116946035553Spatrick// Link in nodes [__f, __l] at the back of the list
117046035553Spatricktemplate <class _Tp, class _Alloc>
117146035553Spatrickinline
117246035553Spatrickvoid
117346035553Spatricklist<_Tp, _Alloc>::__link_nodes_at_back(__link_pointer __f, __link_pointer __l)
117446035553Spatrick{
117546035553Spatrick    __l->__next_ = base::__end_as_link();
117646035553Spatrick    __f->__prev_ = base::__end_.__prev_;
117746035553Spatrick    __f->__prev_->__next_ = __f;
117846035553Spatrick    base::__end_.__prev_ = __l;
117946035553Spatrick}
118046035553Spatrick
118146035553Spatrick
118246035553Spatricktemplate <class _Tp, class _Alloc>
118346035553Spatrickinline
118446035553Spatricktypename list<_Tp, _Alloc>::iterator
118546035553Spatricklist<_Tp, _Alloc>::__iterator(size_type __n)
118646035553Spatrick{
118746035553Spatrick    return __n <= base::__sz() / 2 ? _VSTD::next(begin(), __n)
118846035553Spatrick                                   : _VSTD::prev(end(), base::__sz() - __n);
118946035553Spatrick}
119046035553Spatrick
119146035553Spatricktemplate <class _Tp, class _Alloc>
119246035553Spatricklist<_Tp, _Alloc>::list(size_type __n)
119346035553Spatrick{
1194*4bdff4beSrobert    _VSTD::__debug_db_insert_c(this);
119546035553Spatrick    for (; __n > 0; --__n)
119646035553Spatrick#ifndef _LIBCPP_CXX03_LANG
119746035553Spatrick        emplace_back();
119846035553Spatrick#else
119946035553Spatrick        push_back(value_type());
120046035553Spatrick#endif
120146035553Spatrick}
120246035553Spatrick
120346035553Spatrick#if _LIBCPP_STD_VER > 11
120446035553Spatricktemplate <class _Tp, class _Alloc>
120546035553Spatricklist<_Tp, _Alloc>::list(size_type __n, const allocator_type& __a) : base(__a)
120646035553Spatrick{
1207*4bdff4beSrobert    _VSTD::__debug_db_insert_c(this);
120846035553Spatrick    for (; __n > 0; --__n)
120946035553Spatrick        emplace_back();
121046035553Spatrick}
121146035553Spatrick#endif
121246035553Spatrick
121346035553Spatricktemplate <class _Tp, class _Alloc>
121446035553Spatricklist<_Tp, _Alloc>::list(size_type __n, const value_type& __x)
121546035553Spatrick{
1216*4bdff4beSrobert    _VSTD::__debug_db_insert_c(this);
121746035553Spatrick    for (; __n > 0; --__n)
121846035553Spatrick        push_back(__x);
121946035553Spatrick}
122046035553Spatrick
122146035553Spatricktemplate <class _Tp, class _Alloc>
122246035553Spatricktemplate <class _InpIter>
122346035553Spatricklist<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l,
1224*4bdff4beSrobert                        __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>*)
122546035553Spatrick{
1226*4bdff4beSrobert    _VSTD::__debug_db_insert_c(this);
122746035553Spatrick    for (; __f != __l; ++__f)
122846035553Spatrick        __emplace_back(*__f);
122946035553Spatrick}
123046035553Spatrick
123146035553Spatricktemplate <class _Tp, class _Alloc>
123246035553Spatricktemplate <class _InpIter>
123346035553Spatricklist<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l, const allocator_type& __a,
1234*4bdff4beSrobert                        __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>*)
123546035553Spatrick    : base(__a)
123646035553Spatrick{
1237*4bdff4beSrobert    _VSTD::__debug_db_insert_c(this);
123846035553Spatrick    for (; __f != __l; ++__f)
123946035553Spatrick        __emplace_back(*__f);
124046035553Spatrick}
124146035553Spatrick
124246035553Spatricktemplate <class _Tp, class _Alloc>
124346035553Spatricklist<_Tp, _Alloc>::list(const list& __c)
124446035553Spatrick    : base(__node_alloc_traits::select_on_container_copy_construction(
124546035553Spatrick          __c.__node_alloc())) {
1246*4bdff4beSrobert    _VSTD::__debug_db_insert_c(this);
124746035553Spatrick    for (const_iterator __i = __c.begin(), __e = __c.end(); __i != __e; ++__i)
124846035553Spatrick        push_back(*__i);
124946035553Spatrick}
125046035553Spatrick
125146035553Spatricktemplate <class _Tp, class _Alloc>
1252*4bdff4beSrobertlist<_Tp, _Alloc>::list(const list& __c, const __type_identity_t<allocator_type>& __a)
125346035553Spatrick    : base(__a)
125446035553Spatrick{
1255*4bdff4beSrobert    _VSTD::__debug_db_insert_c(this);
125646035553Spatrick    for (const_iterator __i = __c.begin(), __e = __c.end(); __i != __e; ++__i)
125746035553Spatrick        push_back(*__i);
125846035553Spatrick}
125946035553Spatrick
126046035553Spatrick#ifndef _LIBCPP_CXX03_LANG
126146035553Spatrick
126246035553Spatricktemplate <class _Tp, class _Alloc>
126346035553Spatricklist<_Tp, _Alloc>::list(initializer_list<value_type> __il, const allocator_type& __a)
126446035553Spatrick    : base(__a)
126546035553Spatrick{
1266*4bdff4beSrobert    _VSTD::__debug_db_insert_c(this);
126746035553Spatrick    for (typename initializer_list<value_type>::const_iterator __i = __il.begin(),
126846035553Spatrick            __e = __il.end(); __i != __e; ++__i)
126946035553Spatrick        push_back(*__i);
127046035553Spatrick}
127146035553Spatrick
127246035553Spatricktemplate <class _Tp, class _Alloc>
127346035553Spatricklist<_Tp, _Alloc>::list(initializer_list<value_type> __il)
127446035553Spatrick{
1275*4bdff4beSrobert    _VSTD::__debug_db_insert_c(this);
127646035553Spatrick    for (typename initializer_list<value_type>::const_iterator __i = __il.begin(),
127746035553Spatrick            __e = __il.end(); __i != __e; ++__i)
127846035553Spatrick        push_back(*__i);
127946035553Spatrick}
128046035553Spatrick
128146035553Spatricktemplate <class _Tp, class _Alloc>
128246035553Spatrickinline list<_Tp, _Alloc>::list(list&& __c)
128346035553Spatrick        _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value)
128446035553Spatrick        : base(_VSTD::move(__c.__node_alloc())) {
1285*4bdff4beSrobert    _VSTD::__debug_db_insert_c(this);
128646035553Spatrick    splice(end(), __c);
128746035553Spatrick}
128846035553Spatrick
128946035553Spatricktemplate <class _Tp, class _Alloc>
129046035553Spatrickinline
1291*4bdff4beSrobertlist<_Tp, _Alloc>::list(list&& __c, const __type_identity_t<allocator_type>& __a)
129246035553Spatrick    : base(__a)
129346035553Spatrick{
1294*4bdff4beSrobert    _VSTD::__debug_db_insert_c(this);
129546035553Spatrick    if (__a == __c.get_allocator())
129646035553Spatrick        splice(end(), __c);
129746035553Spatrick    else
129846035553Spatrick    {
129946035553Spatrick        typedef move_iterator<iterator> _Ip;
130046035553Spatrick        assign(_Ip(__c.begin()), _Ip(__c.end()));
130146035553Spatrick    }
130246035553Spatrick}
130346035553Spatrick
130446035553Spatricktemplate <class _Tp, class _Alloc>
130546035553Spatrickinline
130646035553Spatricklist<_Tp, _Alloc>&
130746035553Spatricklist<_Tp, _Alloc>::operator=(list&& __c)
130846035553Spatrick        _NOEXCEPT_(
130946035553Spatrick            __node_alloc_traits::propagate_on_container_move_assignment::value &&
131046035553Spatrick            is_nothrow_move_assignable<__node_allocator>::value)
131146035553Spatrick{
131246035553Spatrick    __move_assign(__c, integral_constant<bool,
131346035553Spatrick          __node_alloc_traits::propagate_on_container_move_assignment::value>());
131446035553Spatrick    return *this;
131546035553Spatrick}
131646035553Spatrick
131746035553Spatricktemplate <class _Tp, class _Alloc>
131846035553Spatrickvoid
131946035553Spatricklist<_Tp, _Alloc>::__move_assign(list& __c, false_type)
132046035553Spatrick{
132146035553Spatrick    if (base::__node_alloc() != __c.__node_alloc())
132246035553Spatrick    {
132346035553Spatrick        typedef move_iterator<iterator> _Ip;
132446035553Spatrick        assign(_Ip(__c.begin()), _Ip(__c.end()));
132546035553Spatrick    }
132646035553Spatrick    else
132746035553Spatrick        __move_assign(__c, true_type());
132846035553Spatrick}
132946035553Spatrick
133046035553Spatricktemplate <class _Tp, class _Alloc>
133146035553Spatrickvoid
133246035553Spatricklist<_Tp, _Alloc>::__move_assign(list& __c, true_type)
133346035553Spatrick        _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value)
133446035553Spatrick{
133546035553Spatrick    clear();
133646035553Spatrick    base::__move_assign_alloc(__c);
133746035553Spatrick    splice(end(), __c);
133846035553Spatrick}
133946035553Spatrick
134046035553Spatrick#endif // _LIBCPP_CXX03_LANG
134146035553Spatrick
134246035553Spatricktemplate <class _Tp, class _Alloc>
134346035553Spatrickinline
134446035553Spatricklist<_Tp, _Alloc>&
134546035553Spatricklist<_Tp, _Alloc>::operator=(const list& __c)
134646035553Spatrick{
1347*4bdff4beSrobert    if (this != _VSTD::addressof(__c))
134846035553Spatrick    {
134946035553Spatrick        base::__copy_assign_alloc(__c);
135046035553Spatrick        assign(__c.begin(), __c.end());
135146035553Spatrick    }
135246035553Spatrick    return *this;
135346035553Spatrick}
135446035553Spatrick
135546035553Spatricktemplate <class _Tp, class _Alloc>
135646035553Spatricktemplate <class _InpIter>
135746035553Spatrickvoid
135846035553Spatricklist<_Tp, _Alloc>::assign(_InpIter __f, _InpIter __l,
1359*4bdff4beSrobert                          __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>*)
136046035553Spatrick{
136146035553Spatrick    iterator __i = begin();
136246035553Spatrick    iterator __e = end();
1363*4bdff4beSrobert    for (; __f != __l && __i != __e; ++__f, (void) ++__i)
136446035553Spatrick        *__i = *__f;
136546035553Spatrick    if (__i == __e)
136646035553Spatrick        insert(__e, __f, __l);
136746035553Spatrick    else
136846035553Spatrick        erase(__i, __e);
1369*4bdff4beSrobert    std::__debug_db_invalidate_all(this);
137046035553Spatrick}
137146035553Spatrick
137246035553Spatricktemplate <class _Tp, class _Alloc>
137346035553Spatrickvoid
137446035553Spatricklist<_Tp, _Alloc>::assign(size_type __n, const value_type& __x)
137546035553Spatrick{
137646035553Spatrick    iterator __i = begin();
137746035553Spatrick    iterator __e = end();
1378*4bdff4beSrobert    for (; __n > 0 && __i != __e; --__n, (void) ++__i)
137946035553Spatrick        *__i = __x;
138046035553Spatrick    if (__i == __e)
138146035553Spatrick        insert(__e, __n, __x);
138246035553Spatrick    else
138346035553Spatrick        erase(__i, __e);
1384*4bdff4beSrobert    std::__debug_db_invalidate_all(this);
138546035553Spatrick}
138646035553Spatrick
138746035553Spatricktemplate <class _Tp, class _Alloc>
138846035553Spatrickinline
138946035553Spatrick_Alloc
139046035553Spatricklist<_Tp, _Alloc>::get_allocator() const _NOEXCEPT
139146035553Spatrick{
139246035553Spatrick    return allocator_type(base::__node_alloc());
139346035553Spatrick}
139446035553Spatrick
139546035553Spatricktemplate <class _Tp, class _Alloc>
139646035553Spatricktypename list<_Tp, _Alloc>::iterator
139746035553Spatricklist<_Tp, _Alloc>::insert(const_iterator __p, const value_type& __x)
139846035553Spatrick{
1399*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this,
1400*4bdff4beSrobert                         "list::insert(iterator, x) called with an iterator not referring to this list");
140146035553Spatrick    __node_allocator& __na = base::__node_alloc();
140246035553Spatrick    __hold_pointer __hold = __allocate_node(__na);
140346035553Spatrick    __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
140446035553Spatrick    __link_nodes(__p.__ptr_, __hold->__as_link(), __hold->__as_link());
140546035553Spatrick    ++base::__sz();
140646035553Spatrick    return iterator(__hold.release()->__as_link(), this);
140746035553Spatrick}
140846035553Spatrick
140946035553Spatricktemplate <class _Tp, class _Alloc>
141046035553Spatricktypename list<_Tp, _Alloc>::iterator
141146035553Spatricklist<_Tp, _Alloc>::insert(const_iterator __p, size_type __n, const value_type& __x)
141246035553Spatrick{
1413*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this,
1414*4bdff4beSrobert                         "list::insert(iterator, n, x) called with an iterator not referring to this list");
141546035553Spatrick    iterator __r(__p.__ptr_, this);
141646035553Spatrick    if (__n > 0)
141746035553Spatrick    {
141846035553Spatrick        size_type __ds = 0;
141946035553Spatrick        __node_allocator& __na = base::__node_alloc();
142046035553Spatrick        __hold_pointer __hold = __allocate_node(__na);
142146035553Spatrick        __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
142246035553Spatrick        ++__ds;
142346035553Spatrick        __r = iterator(__hold->__as_link(), this);
142446035553Spatrick        __hold.release();
142546035553Spatrick        iterator __e = __r;
142646035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
142746035553Spatrick        try
142846035553Spatrick        {
142946035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
1430*4bdff4beSrobert            for (--__n; __n != 0; --__n, (void) ++__e, ++__ds)
143146035553Spatrick            {
143246035553Spatrick                __hold.reset(__node_alloc_traits::allocate(__na, 1));
143346035553Spatrick                __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
143446035553Spatrick                __e.__ptr_->__next_ = __hold->__as_link();
143546035553Spatrick                __hold->__prev_ = __e.__ptr_;
143646035553Spatrick                __hold.release();
143746035553Spatrick            }
143846035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
143946035553Spatrick        }
144046035553Spatrick        catch (...)
144146035553Spatrick        {
144246035553Spatrick            while (true)
144346035553Spatrick            {
144446035553Spatrick                __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
144546035553Spatrick                __link_pointer __prev = __e.__ptr_->__prev_;
144646035553Spatrick                __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
144746035553Spatrick                if (__prev == 0)
144846035553Spatrick                    break;
144946035553Spatrick                __e = iterator(__prev, this);
145046035553Spatrick            }
145146035553Spatrick            throw;
145246035553Spatrick        }
145346035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
145446035553Spatrick        __link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_);
145546035553Spatrick        base::__sz() += __ds;
145646035553Spatrick    }
145746035553Spatrick    return __r;
145846035553Spatrick}
145946035553Spatrick
146046035553Spatricktemplate <class _Tp, class _Alloc>
146146035553Spatricktemplate <class _InpIter>
146246035553Spatricktypename list<_Tp, _Alloc>::iterator
146346035553Spatricklist<_Tp, _Alloc>::insert(const_iterator __p, _InpIter __f, _InpIter __l,
1464*4bdff4beSrobert                          __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>*)
146546035553Spatrick{
1466*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this,
1467*4bdff4beSrobert                         "list::insert(iterator, range) called with an iterator not referring to this list");
146846035553Spatrick    iterator __r(__p.__ptr_, this);
146946035553Spatrick    if (__f != __l)
147046035553Spatrick    {
147146035553Spatrick        size_type __ds = 0;
147246035553Spatrick        __node_allocator& __na = base::__node_alloc();
147346035553Spatrick        __hold_pointer __hold = __allocate_node(__na);
147446035553Spatrick        __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f);
147546035553Spatrick        ++__ds;
147646035553Spatrick        __r = iterator(__hold.get()->__as_link(), this);
147746035553Spatrick        __hold.release();
147846035553Spatrick        iterator __e = __r;
147946035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
148046035553Spatrick        try
148146035553Spatrick        {
148246035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
1483*4bdff4beSrobert            for (++__f; __f != __l; ++__f, (void) ++__e, ++__ds)
148446035553Spatrick            {
148546035553Spatrick                __hold.reset(__node_alloc_traits::allocate(__na, 1));
148646035553Spatrick                __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f);
148746035553Spatrick                __e.__ptr_->__next_ = __hold.get()->__as_link();
148846035553Spatrick                __hold->__prev_ = __e.__ptr_;
148946035553Spatrick                __hold.release();
149046035553Spatrick            }
149146035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
149246035553Spatrick        }
149346035553Spatrick        catch (...)
149446035553Spatrick        {
149546035553Spatrick            while (true)
149646035553Spatrick            {
149746035553Spatrick                __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
149846035553Spatrick                __link_pointer __prev = __e.__ptr_->__prev_;
149946035553Spatrick                __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
150046035553Spatrick                if (__prev == 0)
150146035553Spatrick                    break;
150246035553Spatrick                __e = iterator(__prev, this);
150346035553Spatrick            }
150446035553Spatrick            throw;
150546035553Spatrick        }
150646035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
150746035553Spatrick        __link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_);
150846035553Spatrick        base::__sz() += __ds;
150946035553Spatrick    }
151046035553Spatrick    return __r;
151146035553Spatrick}
151246035553Spatrick
151346035553Spatricktemplate <class _Tp, class _Alloc>
151446035553Spatrickvoid
151546035553Spatricklist<_Tp, _Alloc>::push_front(const value_type& __x)
151646035553Spatrick{
151746035553Spatrick    __node_allocator& __na = base::__node_alloc();
151846035553Spatrick    __hold_pointer __hold = __allocate_node(__na);
151946035553Spatrick    __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
152046035553Spatrick    __link_pointer __nl = __hold->__as_link();
152146035553Spatrick    __link_nodes_at_front(__nl, __nl);
152246035553Spatrick    ++base::__sz();
152346035553Spatrick    __hold.release();
152446035553Spatrick}
152546035553Spatrick
152646035553Spatricktemplate <class _Tp, class _Alloc>
152746035553Spatrickvoid
152846035553Spatricklist<_Tp, _Alloc>::push_back(const value_type& __x)
152946035553Spatrick{
153046035553Spatrick    __node_allocator& __na = base::__node_alloc();
153146035553Spatrick    __hold_pointer __hold = __allocate_node(__na);
153246035553Spatrick    __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
153346035553Spatrick    __link_nodes_at_back(__hold.get()->__as_link(), __hold.get()->__as_link());
153446035553Spatrick    ++base::__sz();
153546035553Spatrick    __hold.release();
153646035553Spatrick}
153746035553Spatrick
153846035553Spatrick#ifndef _LIBCPP_CXX03_LANG
153946035553Spatrick
154046035553Spatricktemplate <class _Tp, class _Alloc>
154146035553Spatrickvoid
154246035553Spatricklist<_Tp, _Alloc>::push_front(value_type&& __x)
154346035553Spatrick{
154446035553Spatrick    __node_allocator& __na = base::__node_alloc();
154546035553Spatrick    __hold_pointer __hold = __allocate_node(__na);
154646035553Spatrick    __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
154746035553Spatrick    __link_nodes_at_front(__hold.get()->__as_link(), __hold.get()->__as_link());
154846035553Spatrick    ++base::__sz();
154946035553Spatrick    __hold.release();
155046035553Spatrick}
155146035553Spatrick
155246035553Spatricktemplate <class _Tp, class _Alloc>
155346035553Spatrickvoid
155446035553Spatricklist<_Tp, _Alloc>::push_back(value_type&& __x)
155546035553Spatrick{
155646035553Spatrick    __node_allocator& __na = base::__node_alloc();
155746035553Spatrick    __hold_pointer __hold = __allocate_node(__na);
155846035553Spatrick    __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
155946035553Spatrick    __link_nodes_at_back(__hold.get()->__as_link(), __hold.get()->__as_link());
156046035553Spatrick    ++base::__sz();
156146035553Spatrick    __hold.release();
156246035553Spatrick}
156346035553Spatrick
156446035553Spatricktemplate <class _Tp, class _Alloc>
156546035553Spatricktemplate <class... _Args>
156646035553Spatrick#if _LIBCPP_STD_VER > 14
156746035553Spatricktypename list<_Tp, _Alloc>::reference
156846035553Spatrick#else
156946035553Spatrickvoid
157046035553Spatrick#endif
157146035553Spatricklist<_Tp, _Alloc>::emplace_front(_Args&&... __args)
157246035553Spatrick{
157346035553Spatrick    __node_allocator& __na = base::__node_alloc();
157446035553Spatrick    __hold_pointer __hold = __allocate_node(__na);
157546035553Spatrick    __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
157646035553Spatrick    __link_nodes_at_front(__hold.get()->__as_link(), __hold.get()->__as_link());
157746035553Spatrick    ++base::__sz();
157846035553Spatrick#if _LIBCPP_STD_VER > 14
157946035553Spatrick    return __hold.release()->__value_;
158046035553Spatrick#else
158146035553Spatrick    __hold.release();
158246035553Spatrick#endif
158346035553Spatrick}
158446035553Spatrick
158546035553Spatricktemplate <class _Tp, class _Alloc>
158646035553Spatricktemplate <class... _Args>
158746035553Spatrick#if _LIBCPP_STD_VER > 14
158846035553Spatricktypename list<_Tp, _Alloc>::reference
158946035553Spatrick#else
159046035553Spatrickvoid
159146035553Spatrick#endif
159246035553Spatricklist<_Tp, _Alloc>::emplace_back(_Args&&... __args)
159346035553Spatrick{
159446035553Spatrick    __node_allocator& __na = base::__node_alloc();
159546035553Spatrick    __hold_pointer __hold = __allocate_node(__na);
159646035553Spatrick    __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
159746035553Spatrick    __link_pointer __nl = __hold->__as_link();
159846035553Spatrick    __link_nodes_at_back(__nl, __nl);
159946035553Spatrick    ++base::__sz();
160046035553Spatrick#if _LIBCPP_STD_VER > 14
160146035553Spatrick    return __hold.release()->__value_;
160246035553Spatrick#else
160346035553Spatrick    __hold.release();
160446035553Spatrick#endif
160546035553Spatrick}
160646035553Spatrick
160746035553Spatricktemplate <class _Tp, class _Alloc>
160846035553Spatricktemplate <class... _Args>
160946035553Spatricktypename list<_Tp, _Alloc>::iterator
161046035553Spatricklist<_Tp, _Alloc>::emplace(const_iterator __p, _Args&&... __args)
161146035553Spatrick{
1612*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this,
1613*4bdff4beSrobert                         "list::emplace(iterator, args...) called with an iterator not referring to this list");
161446035553Spatrick    __node_allocator& __na = base::__node_alloc();
161546035553Spatrick    __hold_pointer __hold = __allocate_node(__na);
161646035553Spatrick    __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
161746035553Spatrick    __link_pointer __nl = __hold.get()->__as_link();
161846035553Spatrick    __link_nodes(__p.__ptr_, __nl, __nl);
161946035553Spatrick    ++base::__sz();
162046035553Spatrick    __hold.release();
162146035553Spatrick    return iterator(__nl, this);
162246035553Spatrick}
162346035553Spatrick
162446035553Spatricktemplate <class _Tp, class _Alloc>
162546035553Spatricktypename list<_Tp, _Alloc>::iterator
162646035553Spatricklist<_Tp, _Alloc>::insert(const_iterator __p, value_type&& __x)
162746035553Spatrick{
1628*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this,
1629*4bdff4beSrobert                         "list::insert(iterator, x) called with an iterator not referring to this list");
163046035553Spatrick    __node_allocator& __na = base::__node_alloc();
163146035553Spatrick    __hold_pointer __hold = __allocate_node(__na);
163246035553Spatrick    __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
163346035553Spatrick    __link_pointer __nl = __hold->__as_link();
163446035553Spatrick    __link_nodes(__p.__ptr_, __nl, __nl);
163546035553Spatrick    ++base::__sz();
163646035553Spatrick    __hold.release();
163746035553Spatrick    return iterator(__nl, this);
163846035553Spatrick}
163946035553Spatrick
164046035553Spatrick#endif // _LIBCPP_CXX03_LANG
164146035553Spatrick
164246035553Spatricktemplate <class _Tp, class _Alloc>
164346035553Spatrickvoid
164446035553Spatricklist<_Tp, _Alloc>::pop_front()
164546035553Spatrick{
164646035553Spatrick    _LIBCPP_ASSERT(!empty(), "list::pop_front() called with empty list");
164746035553Spatrick    __node_allocator& __na = base::__node_alloc();
164846035553Spatrick    __link_pointer __n = base::__end_.__next_;
164946035553Spatrick    base::__unlink_nodes(__n, __n);
165046035553Spatrick    --base::__sz();
1651*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
165246035553Spatrick    __c_node* __c = __get_db()->__find_c_and_lock(this);
165346035553Spatrick    for (__i_node** __p = __c->end_; __p != __c->beg_; )
165446035553Spatrick    {
165546035553Spatrick        --__p;
165646035553Spatrick        iterator* __i = static_cast<iterator*>((*__p)->__i_);
165746035553Spatrick        if (__i->__ptr_ == __n)
165846035553Spatrick        {
165946035553Spatrick            (*__p)->__c_ = nullptr;
166046035553Spatrick            if (--__c->end_ != __p)
166176d0caaeSpatrick                _VSTD::memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
166246035553Spatrick        }
166346035553Spatrick    }
166446035553Spatrick    __get_db()->unlock();
166546035553Spatrick#endif
166646035553Spatrick    __node_pointer __np = __n->__as_node();
166746035553Spatrick    __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
166846035553Spatrick    __node_alloc_traits::deallocate(__na, __np, 1);
166946035553Spatrick}
167046035553Spatrick
167146035553Spatricktemplate <class _Tp, class _Alloc>
167246035553Spatrickvoid
167346035553Spatricklist<_Tp, _Alloc>::pop_back()
167446035553Spatrick{
167576d0caaeSpatrick    _LIBCPP_ASSERT(!empty(), "list::pop_back() called on an empty list");
167646035553Spatrick    __node_allocator& __na = base::__node_alloc();
167746035553Spatrick    __link_pointer __n = base::__end_.__prev_;
167846035553Spatrick    base::__unlink_nodes(__n, __n);
167946035553Spatrick    --base::__sz();
1680*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
168146035553Spatrick    __c_node* __c = __get_db()->__find_c_and_lock(this);
168246035553Spatrick    for (__i_node** __p = __c->end_; __p != __c->beg_; )
168346035553Spatrick    {
168446035553Spatrick        --__p;
168546035553Spatrick        iterator* __i = static_cast<iterator*>((*__p)->__i_);
168646035553Spatrick        if (__i->__ptr_ == __n)
168746035553Spatrick        {
168846035553Spatrick            (*__p)->__c_ = nullptr;
168946035553Spatrick            if (--__c->end_ != __p)
169076d0caaeSpatrick                _VSTD::memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
169146035553Spatrick        }
169246035553Spatrick    }
169346035553Spatrick    __get_db()->unlock();
169446035553Spatrick#endif
169546035553Spatrick    __node_pointer __np = __n->__as_node();
169646035553Spatrick    __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
169746035553Spatrick    __node_alloc_traits::deallocate(__na, __np, 1);
169846035553Spatrick}
169946035553Spatrick
170046035553Spatricktemplate <class _Tp, class _Alloc>
170146035553Spatricktypename list<_Tp, _Alloc>::iterator
170246035553Spatricklist<_Tp, _Alloc>::erase(const_iterator __p)
170346035553Spatrick{
1704*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this,
1705*4bdff4beSrobert                         "list::erase(iterator) called with an iterator not referring to this list");
170646035553Spatrick    _LIBCPP_ASSERT(__p != end(),
170746035553Spatrick        "list::erase(iterator) called with a non-dereferenceable iterator");
170846035553Spatrick    __node_allocator& __na = base::__node_alloc();
170946035553Spatrick    __link_pointer __n = __p.__ptr_;
171046035553Spatrick    __link_pointer __r = __n->__next_;
171146035553Spatrick    base::__unlink_nodes(__n, __n);
171246035553Spatrick    --base::__sz();
1713*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
171446035553Spatrick    __c_node* __c = __get_db()->__find_c_and_lock(this);
171546035553Spatrick    for (__i_node** __ip = __c->end_; __ip != __c->beg_; )
171646035553Spatrick    {
171746035553Spatrick        --__ip;
171846035553Spatrick        iterator* __i = static_cast<iterator*>((*__ip)->__i_);
171946035553Spatrick        if (__i->__ptr_ == __n)
172046035553Spatrick        {
172146035553Spatrick            (*__ip)->__c_ = nullptr;
172246035553Spatrick            if (--__c->end_ != __ip)
172376d0caaeSpatrick                _VSTD::memmove(__ip, __ip+1, (__c->end_ - __ip)*sizeof(__i_node*));
172446035553Spatrick        }
172546035553Spatrick    }
172646035553Spatrick    __get_db()->unlock();
172746035553Spatrick#endif
172846035553Spatrick    __node_pointer __np = __n->__as_node();
172946035553Spatrick    __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
173046035553Spatrick    __node_alloc_traits::deallocate(__na, __np, 1);
173146035553Spatrick    return iterator(__r, this);
173246035553Spatrick}
173346035553Spatrick
173446035553Spatricktemplate <class _Tp, class _Alloc>
173546035553Spatricktypename list<_Tp, _Alloc>::iterator
173646035553Spatricklist<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l)
173746035553Spatrick{
1738*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__f)) == this,
1739*4bdff4beSrobert                         "list::erase(iterator, iterator) called with an iterator not referring to this list");
1740*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__l)) == this,
1741*4bdff4beSrobert                         "list::erase(iterator, iterator) called with an iterator not referring to this list");
174246035553Spatrick    if (__f != __l)
174346035553Spatrick    {
174446035553Spatrick        __node_allocator& __na = base::__node_alloc();
174546035553Spatrick        base::__unlink_nodes(__f.__ptr_, __l.__ptr_->__prev_);
174646035553Spatrick        while (__f != __l)
174746035553Spatrick        {
174846035553Spatrick            __link_pointer __n = __f.__ptr_;
174946035553Spatrick            ++__f;
175046035553Spatrick            --base::__sz();
1751*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
175246035553Spatrick            __c_node* __c = __get_db()->__find_c_and_lock(this);
175346035553Spatrick            for (__i_node** __p = __c->end_; __p != __c->beg_; )
175446035553Spatrick            {
175546035553Spatrick                --__p;
175646035553Spatrick                iterator* __i = static_cast<iterator*>((*__p)->__i_);
175746035553Spatrick                if (__i->__ptr_ == __n)
175846035553Spatrick                {
175946035553Spatrick                    (*__p)->__c_ = nullptr;
176046035553Spatrick                    if (--__c->end_ != __p)
176176d0caaeSpatrick                        _VSTD::memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
176246035553Spatrick                }
176346035553Spatrick            }
176446035553Spatrick            __get_db()->unlock();
176546035553Spatrick#endif
176646035553Spatrick            __node_pointer __np = __n->__as_node();
176746035553Spatrick            __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
176846035553Spatrick            __node_alloc_traits::deallocate(__na, __np, 1);
176946035553Spatrick        }
177046035553Spatrick    }
177146035553Spatrick    return iterator(__l.__ptr_, this);
177246035553Spatrick}
177346035553Spatrick
177446035553Spatricktemplate <class _Tp, class _Alloc>
177546035553Spatrickvoid
177646035553Spatricklist<_Tp, _Alloc>::resize(size_type __n)
177746035553Spatrick{
177846035553Spatrick    if (__n < base::__sz())
177946035553Spatrick        erase(__iterator(__n), end());
178046035553Spatrick    else if (__n > base::__sz())
178146035553Spatrick    {
178246035553Spatrick        __n -= base::__sz();
178346035553Spatrick        size_type __ds = 0;
178446035553Spatrick        __node_allocator& __na = base::__node_alloc();
178546035553Spatrick        __hold_pointer __hold = __allocate_node(__na);
178646035553Spatrick        __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_));
178746035553Spatrick        ++__ds;
178846035553Spatrick        iterator __r = iterator(__hold.release()->__as_link(), this);
178946035553Spatrick        iterator __e = __r;
179046035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
179146035553Spatrick        try
179246035553Spatrick        {
179346035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
1794*4bdff4beSrobert            for (--__n; __n != 0; --__n, (void) ++__e, ++__ds)
179546035553Spatrick            {
179646035553Spatrick                __hold.reset(__node_alloc_traits::allocate(__na, 1));
179746035553Spatrick                __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_));
179846035553Spatrick                __e.__ptr_->__next_ = __hold.get()->__as_link();
179946035553Spatrick                __hold->__prev_ = __e.__ptr_;
180046035553Spatrick                __hold.release();
180146035553Spatrick            }
180246035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
180346035553Spatrick        }
180446035553Spatrick        catch (...)
180546035553Spatrick        {
180646035553Spatrick            while (true)
180746035553Spatrick            {
180846035553Spatrick                __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
180946035553Spatrick                __link_pointer __prev = __e.__ptr_->__prev_;
181046035553Spatrick                __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
181146035553Spatrick                if (__prev == 0)
181246035553Spatrick                    break;
181346035553Spatrick                __e = iterator(__prev, this);
181446035553Spatrick            }
181546035553Spatrick            throw;
181646035553Spatrick        }
181746035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
181846035553Spatrick        __link_nodes_at_back(__r.__ptr_, __e.__ptr_);
181946035553Spatrick        base::__sz() += __ds;
182046035553Spatrick    }
182146035553Spatrick}
182246035553Spatrick
182346035553Spatricktemplate <class _Tp, class _Alloc>
182446035553Spatrickvoid
182546035553Spatricklist<_Tp, _Alloc>::resize(size_type __n, const value_type& __x)
182646035553Spatrick{
182746035553Spatrick    if (__n < base::__sz())
182846035553Spatrick        erase(__iterator(__n), end());
182946035553Spatrick    else if (__n > base::__sz())
183046035553Spatrick    {
183146035553Spatrick        __n -= base::__sz();
183246035553Spatrick        size_type __ds = 0;
183346035553Spatrick        __node_allocator& __na = base::__node_alloc();
183446035553Spatrick        __hold_pointer __hold = __allocate_node(__na);
183546035553Spatrick        __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
183646035553Spatrick        ++__ds;
183746035553Spatrick        __link_pointer __nl = __hold.release()->__as_link();
183846035553Spatrick        iterator __r = iterator(__nl, this);
183946035553Spatrick        iterator __e = __r;
184046035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
184146035553Spatrick        try
184246035553Spatrick        {
184346035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
1844*4bdff4beSrobert            for (--__n; __n != 0; --__n, (void) ++__e, ++__ds)
184546035553Spatrick            {
184646035553Spatrick                __hold.reset(__node_alloc_traits::allocate(__na, 1));
184746035553Spatrick                __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
184846035553Spatrick                __e.__ptr_->__next_ = __hold.get()->__as_link();
184946035553Spatrick                __hold->__prev_ = __e.__ptr_;
185046035553Spatrick                __hold.release();
185146035553Spatrick            }
185246035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
185346035553Spatrick        }
185446035553Spatrick        catch (...)
185546035553Spatrick        {
185646035553Spatrick            while (true)
185746035553Spatrick            {
185846035553Spatrick                __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
185946035553Spatrick                __link_pointer __prev = __e.__ptr_->__prev_;
186046035553Spatrick                __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
186146035553Spatrick                if (__prev == 0)
186246035553Spatrick                    break;
186346035553Spatrick                __e = iterator(__prev, this);
186446035553Spatrick            }
186546035553Spatrick            throw;
186646035553Spatrick        }
186746035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
186846035553Spatrick        __link_nodes(base::__end_as_link(), __r.__ptr_, __e.__ptr_);
186946035553Spatrick        base::__sz() += __ds;
187046035553Spatrick    }
187146035553Spatrick}
187246035553Spatrick
187346035553Spatricktemplate <class _Tp, class _Alloc>
187446035553Spatrickvoid
187546035553Spatricklist<_Tp, _Alloc>::splice(const_iterator __p, list& __c)
187646035553Spatrick{
1877*4bdff4beSrobert    _LIBCPP_ASSERT(this != _VSTD::addressof(__c),
187846035553Spatrick                   "list::splice(iterator, list) called with this == &list");
1879*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this,
1880*4bdff4beSrobert                         "list::splice(iterator, list) called with an iterator not referring to this list");
188146035553Spatrick    if (!__c.empty())
188246035553Spatrick    {
188346035553Spatrick        __link_pointer __f = __c.__end_.__next_;
188446035553Spatrick        __link_pointer __l = __c.__end_.__prev_;
188546035553Spatrick        base::__unlink_nodes(__f, __l);
188646035553Spatrick        __link_nodes(__p.__ptr_, __f, __l);
188746035553Spatrick        base::__sz() += __c.__sz();
188846035553Spatrick        __c.__sz() = 0;
1889*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
1890*4bdff4beSrobert        if (_VSTD::addressof(__c) != this) {
189146035553Spatrick            __libcpp_db* __db = __get_db();
189246035553Spatrick            __c_node* __cn1 = __db->__find_c_and_lock(this);
1893*4bdff4beSrobert            __c_node* __cn2 = __db->__find_c(_VSTD::addressof(__c));
189446035553Spatrick            for (__i_node** __ip = __cn2->end_; __ip != __cn2->beg_;)
189546035553Spatrick            {
189646035553Spatrick                --__ip;
189746035553Spatrick                iterator* __i = static_cast<iterator*>((*__ip)->__i_);
189846035553Spatrick                if (__i->__ptr_ != __c.__end_as_link())
189946035553Spatrick                {
190046035553Spatrick                    __cn1->__add(*__ip);
190146035553Spatrick                    (*__ip)->__c_ = __cn1;
190246035553Spatrick                    if (--__cn2->end_ != __ip)
190376d0caaeSpatrick                        _VSTD::memmove(__ip, __ip+1, (__cn2->end_ - __ip)*sizeof(__i_node*));
190446035553Spatrick                }
190546035553Spatrick            }
190646035553Spatrick            __db->unlock();
190746035553Spatrick        }
190846035553Spatrick#endif
190946035553Spatrick    }
191046035553Spatrick}
191146035553Spatrick
191246035553Spatricktemplate <class _Tp, class _Alloc>
191346035553Spatrickvoid
191446035553Spatricklist<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __i)
191546035553Spatrick{
1916*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this,
1917*4bdff4beSrobert        "list::splice(iterator, list, iterator) called with the first iterator not referring to this list");
1918*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__i)) == _VSTD::addressof(__c),
1919*4bdff4beSrobert        "list::splice(iterator, list, iterator) called with the second iterator not referring to the list argument");
1920*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(_VSTD::addressof(__i)),
1921*4bdff4beSrobert        "list::splice(iterator, list, iterator) called with the second iterator not dereferenceable");
1922*4bdff4beSrobert
192346035553Spatrick    if (__p.__ptr_ != __i.__ptr_ && __p.__ptr_ != __i.__ptr_->__next_)
192446035553Spatrick    {
192546035553Spatrick        __link_pointer __f = __i.__ptr_;
192646035553Spatrick        base::__unlink_nodes(__f, __f);
192746035553Spatrick        __link_nodes(__p.__ptr_, __f, __f);
192846035553Spatrick        --__c.__sz();
192946035553Spatrick        ++base::__sz();
1930*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
1931*4bdff4beSrobert        if (_VSTD::addressof(__c) != this) {
193246035553Spatrick            __libcpp_db* __db = __get_db();
193346035553Spatrick            __c_node* __cn1 = __db->__find_c_and_lock(this);
1934*4bdff4beSrobert            __c_node* __cn2 = __db->__find_c(_VSTD::addressof(__c));
193546035553Spatrick            for (__i_node** __ip = __cn2->end_; __ip != __cn2->beg_;)
193646035553Spatrick            {
193746035553Spatrick                --__ip;
193846035553Spatrick                iterator* __j = static_cast<iterator*>((*__ip)->__i_);
193946035553Spatrick                if (__j->__ptr_ == __f)
194046035553Spatrick                {
194146035553Spatrick                    __cn1->__add(*__ip);
194246035553Spatrick                    (*__ip)->__c_ = __cn1;
194346035553Spatrick                    if (--__cn2->end_ != __ip)
194476d0caaeSpatrick                        _VSTD::memmove(__ip, __ip+1, (__cn2->end_ - __ip)*sizeof(__i_node*));
194546035553Spatrick                }
194646035553Spatrick            }
194746035553Spatrick            __db->unlock();
194846035553Spatrick        }
194946035553Spatrick#endif
195046035553Spatrick    }
195146035553Spatrick}
195246035553Spatrick
1953*4bdff4beSroberttemplate <class _Iterator>
1954*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI
1955*4bdff4beSrobertbool __iterator_in_range(_Iterator __first, _Iterator __last, _Iterator __it) {
1956*4bdff4beSrobert    for (_Iterator __p = __first; __p != __last; ++__p) {
1957*4bdff4beSrobert        if (__p == __it) {
1958*4bdff4beSrobert            return true;
1959*4bdff4beSrobert        }
1960*4bdff4beSrobert    }
1961*4bdff4beSrobert    return false;
1962*4bdff4beSrobert}
1963*4bdff4beSrobert
196446035553Spatricktemplate <class _Tp, class _Alloc>
196546035553Spatrickvoid
196646035553Spatricklist<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __f, const_iterator __l)
196746035553Spatrick{
1968*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this,
1969*4bdff4beSrobert        "list::splice(iterator, list, iterator, iterator) called with first iterator not referring to this list");
1970*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__f)) == _VSTD::addressof(__c),
1971*4bdff4beSrobert        "list::splice(iterator, list, iterator, iterator) called with second iterator not referring to the list argument");
1972*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__l)) == _VSTD::addressof(__c),
1973*4bdff4beSrobert        "list::splice(iterator, list, iterator, iterator) called with third iterator not referring to the list argument");
1974*4bdff4beSrobert    _LIBCPP_DEBUG_ASSERT(this != std::addressof(__c) || !std::__iterator_in_range(__f, __l, __p),
197546035553Spatrick        "list::splice(iterator, list, iterator, iterator)"
1976*4bdff4beSrobert        " called with the first iterator within the range of the second and third iterators");
1977*4bdff4beSrobert
197846035553Spatrick    if (__f != __l)
197946035553Spatrick    {
198046035553Spatrick        __link_pointer __first = __f.__ptr_;
198146035553Spatrick        --__l;
198246035553Spatrick        __link_pointer __last = __l.__ptr_;
1983*4bdff4beSrobert        if (this != _VSTD::addressof(__c))
198446035553Spatrick        {
198546035553Spatrick            size_type __s = _VSTD::distance(__f, __l) + 1;
198646035553Spatrick            __c.__sz() -= __s;
198746035553Spatrick            base::__sz() += __s;
198846035553Spatrick        }
198946035553Spatrick        base::__unlink_nodes(__first, __last);
199046035553Spatrick        __link_nodes(__p.__ptr_, __first, __last);
1991*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
1992*4bdff4beSrobert        if (_VSTD::addressof(__c) != this) {
199346035553Spatrick            __libcpp_db* __db = __get_db();
199446035553Spatrick            __c_node* __cn1 = __db->__find_c_and_lock(this);
1995*4bdff4beSrobert            __c_node* __cn2 = __db->__find_c(_VSTD::addressof(__c));
199646035553Spatrick            for (__i_node** __ip = __cn2->end_; __ip != __cn2->beg_;)
199746035553Spatrick            {
199846035553Spatrick                --__ip;
199946035553Spatrick                iterator* __j = static_cast<iterator*>((*__ip)->__i_);
200046035553Spatrick                for (__link_pointer __k = __f.__ptr_;
200146035553Spatrick                                              __k != __l.__ptr_; __k = __k->__next_)
200246035553Spatrick                {
200346035553Spatrick                    if (__j->__ptr_ == __k)
200446035553Spatrick                    {
200546035553Spatrick                        __cn1->__add(*__ip);
200646035553Spatrick                        (*__ip)->__c_ = __cn1;
200746035553Spatrick                        if (--__cn2->end_ != __ip)
200876d0caaeSpatrick                            _VSTD::memmove(__ip, __ip+1, (__cn2->end_ - __ip)*sizeof(__i_node*));
200946035553Spatrick                    }
201046035553Spatrick                }
201146035553Spatrick            }
201246035553Spatrick            __db->unlock();
201346035553Spatrick        }
201446035553Spatrick#endif
201546035553Spatrick    }
201646035553Spatrick}
201746035553Spatrick
201846035553Spatricktemplate <class _Tp, class _Alloc>
201946035553Spatricktypename list<_Tp, _Alloc>::__remove_return_type
202046035553Spatricklist<_Tp, _Alloc>::remove(const value_type& __x)
202146035553Spatrick{
202246035553Spatrick    list<_Tp, _Alloc> __deleted_nodes(get_allocator()); // collect the nodes we're removing
202346035553Spatrick    for (const_iterator __i = begin(), __e = end(); __i != __e;)
202446035553Spatrick    {
202546035553Spatrick        if (*__i == __x)
202646035553Spatrick        {
202746035553Spatrick            const_iterator __j = _VSTD::next(__i);
202846035553Spatrick            for (; __j != __e && *__j == __x; ++__j)
202946035553Spatrick                ;
203046035553Spatrick            __deleted_nodes.splice(__deleted_nodes.end(), *this, __i, __j);
203146035553Spatrick            __i = __j;
203246035553Spatrick            if (__i != __e)
203346035553Spatrick                ++__i;
203446035553Spatrick        }
203546035553Spatrick        else
203646035553Spatrick            ++__i;
203746035553Spatrick    }
203846035553Spatrick
203946035553Spatrick    return (__remove_return_type) __deleted_nodes.size();
204046035553Spatrick}
204146035553Spatrick
204246035553Spatricktemplate <class _Tp, class _Alloc>
204346035553Spatricktemplate <class _Pred>
204446035553Spatricktypename list<_Tp, _Alloc>::__remove_return_type
204546035553Spatricklist<_Tp, _Alloc>::remove_if(_Pred __pred)
204646035553Spatrick{
204746035553Spatrick    list<_Tp, _Alloc> __deleted_nodes(get_allocator()); // collect the nodes we're removing
204846035553Spatrick    for (iterator __i = begin(), __e = end(); __i != __e;)
204946035553Spatrick    {
205046035553Spatrick        if (__pred(*__i))
205146035553Spatrick        {
205246035553Spatrick            iterator __j = _VSTD::next(__i);
205346035553Spatrick            for (; __j != __e && __pred(*__j); ++__j)
205446035553Spatrick                ;
205546035553Spatrick            __deleted_nodes.splice(__deleted_nodes.end(), *this, __i, __j);
205646035553Spatrick            __i = __j;
205746035553Spatrick            if (__i != __e)
205846035553Spatrick                ++__i;
205946035553Spatrick        }
206046035553Spatrick        else
206146035553Spatrick            ++__i;
206246035553Spatrick    }
206346035553Spatrick
206446035553Spatrick    return (__remove_return_type) __deleted_nodes.size();
206546035553Spatrick}
206646035553Spatrick
206746035553Spatricktemplate <class _Tp, class _Alloc>
206846035553Spatricktemplate <class _BinaryPred>
206946035553Spatricktypename list<_Tp, _Alloc>::__remove_return_type
207046035553Spatricklist<_Tp, _Alloc>::unique(_BinaryPred __binary_pred)
207146035553Spatrick{
207246035553Spatrick    list<_Tp, _Alloc> __deleted_nodes(get_allocator()); // collect the nodes we're removing
207346035553Spatrick    for (iterator __i = begin(), __e = end(); __i != __e;)
207446035553Spatrick    {
207546035553Spatrick        iterator __j = _VSTD::next(__i);
207646035553Spatrick        for (; __j != __e && __binary_pred(*__i, *__j); ++__j)
207746035553Spatrick            ;
207846035553Spatrick        if (++__i != __j) {
207946035553Spatrick            __deleted_nodes.splice(__deleted_nodes.end(), *this, __i, __j);
208046035553Spatrick            __i = __j;
208146035553Spatrick            }
208246035553Spatrick    }
208346035553Spatrick
208446035553Spatrick    return (__remove_return_type) __deleted_nodes.size();
208546035553Spatrick}
208646035553Spatrick
208746035553Spatricktemplate <class _Tp, class _Alloc>
208846035553Spatrickinline
208946035553Spatrickvoid
209046035553Spatricklist<_Tp, _Alloc>::merge(list& __c)
209146035553Spatrick{
209246035553Spatrick    merge(__c, __less<value_type>());
209346035553Spatrick}
209446035553Spatrick
209546035553Spatricktemplate <class _Tp, class _Alloc>
209646035553Spatricktemplate <class _Comp>
209746035553Spatrickvoid
209846035553Spatricklist<_Tp, _Alloc>::merge(list& __c, _Comp __comp)
209946035553Spatrick{
210046035553Spatrick    if (this != _VSTD::addressof(__c))
210146035553Spatrick    {
210246035553Spatrick        iterator __f1 = begin();
210346035553Spatrick        iterator __e1 = end();
210446035553Spatrick        iterator __f2 = __c.begin();
210546035553Spatrick        iterator __e2 = __c.end();
210646035553Spatrick        while (__f1 != __e1 && __f2 != __e2)
210746035553Spatrick        {
210846035553Spatrick            if (__comp(*__f2, *__f1))
210946035553Spatrick            {
211046035553Spatrick                size_type __ds = 1;
211146035553Spatrick                iterator __m2 = _VSTD::next(__f2);
2112*4bdff4beSrobert                for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2, (void) ++__ds)
211346035553Spatrick                    ;
211446035553Spatrick                base::__sz() += __ds;
211546035553Spatrick                __c.__sz() -= __ds;
211646035553Spatrick                __link_pointer __f = __f2.__ptr_;
211746035553Spatrick                __link_pointer __l = __m2.__ptr_->__prev_;
211846035553Spatrick                __f2 = __m2;
211946035553Spatrick                base::__unlink_nodes(__f, __l);
212046035553Spatrick                __m2 = _VSTD::next(__f1);
212146035553Spatrick                __link_nodes(__f1.__ptr_, __f, __l);
212246035553Spatrick                __f1 = __m2;
212346035553Spatrick            }
212446035553Spatrick            else
212546035553Spatrick                ++__f1;
212646035553Spatrick        }
212746035553Spatrick        splice(__e1, __c);
2128*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
212946035553Spatrick        __libcpp_db* __db = __get_db();
213046035553Spatrick        __c_node* __cn1 = __db->__find_c_and_lock(this);
2131*4bdff4beSrobert        __c_node* __cn2 = __db->__find_c(_VSTD::addressof(__c));
213246035553Spatrick        for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;)
213346035553Spatrick        {
213446035553Spatrick            --__p;
213546035553Spatrick            iterator* __i = static_cast<iterator*>((*__p)->__i_);
213646035553Spatrick            if (__i->__ptr_ != __c.__end_as_link())
213746035553Spatrick            {
213846035553Spatrick                __cn1->__add(*__p);
213946035553Spatrick                (*__p)->__c_ = __cn1;
214046035553Spatrick                if (--__cn2->end_ != __p)
214176d0caaeSpatrick                    _VSTD::memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*));
214246035553Spatrick            }
214346035553Spatrick        }
214446035553Spatrick        __db->unlock();
214546035553Spatrick#endif
214646035553Spatrick    }
214746035553Spatrick}
214846035553Spatrick
214946035553Spatricktemplate <class _Tp, class _Alloc>
215046035553Spatrickinline
215146035553Spatrickvoid
215246035553Spatricklist<_Tp, _Alloc>::sort()
215346035553Spatrick{
215446035553Spatrick    sort(__less<value_type>());
215546035553Spatrick}
215646035553Spatrick
215746035553Spatricktemplate <class _Tp, class _Alloc>
215846035553Spatricktemplate <class _Comp>
215946035553Spatrickinline
216046035553Spatrickvoid
216146035553Spatricklist<_Tp, _Alloc>::sort(_Comp __comp)
216246035553Spatrick{
216346035553Spatrick    __sort(begin(), end(), base::__sz(), __comp);
216446035553Spatrick}
216546035553Spatrick
216646035553Spatricktemplate <class _Tp, class _Alloc>
216746035553Spatricktemplate <class _Comp>
216846035553Spatricktypename list<_Tp, _Alloc>::iterator
216946035553Spatricklist<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp)
217046035553Spatrick{
217146035553Spatrick    switch (__n)
217246035553Spatrick    {
217346035553Spatrick    case 0:
217446035553Spatrick    case 1:
217546035553Spatrick        return __f1;
217646035553Spatrick    case 2:
217746035553Spatrick        if (__comp(*--__e2, *__f1))
217846035553Spatrick        {
217946035553Spatrick            __link_pointer __f = __e2.__ptr_;
218046035553Spatrick            base::__unlink_nodes(__f, __f);
218146035553Spatrick            __link_nodes(__f1.__ptr_, __f, __f);
218246035553Spatrick            return __e2;
218346035553Spatrick        }
218446035553Spatrick        return __f1;
218546035553Spatrick    }
218646035553Spatrick    size_type __n2 = __n / 2;
218746035553Spatrick    iterator __e1 = _VSTD::next(__f1, __n2);
218846035553Spatrick    iterator  __r = __f1 = __sort(__f1, __e1, __n2, __comp);
218946035553Spatrick    iterator __f2 = __e1 = __sort(__e1, __e2, __n - __n2, __comp);
219046035553Spatrick    if (__comp(*__f2, *__f1))
219146035553Spatrick    {
219246035553Spatrick        iterator __m2 = _VSTD::next(__f2);
219346035553Spatrick        for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
219446035553Spatrick            ;
219546035553Spatrick        __link_pointer __f = __f2.__ptr_;
219646035553Spatrick        __link_pointer __l = __m2.__ptr_->__prev_;
219746035553Spatrick        __r = __f2;
219846035553Spatrick        __e1 = __f2 = __m2;
219946035553Spatrick        base::__unlink_nodes(__f, __l);
220046035553Spatrick        __m2 = _VSTD::next(__f1);
220146035553Spatrick        __link_nodes(__f1.__ptr_, __f, __l);
220246035553Spatrick        __f1 = __m2;
220346035553Spatrick    }
220446035553Spatrick    else
220546035553Spatrick        ++__f1;
220646035553Spatrick    while (__f1 != __e1 && __f2 != __e2)
220746035553Spatrick    {
220846035553Spatrick        if (__comp(*__f2, *__f1))
220946035553Spatrick        {
221046035553Spatrick            iterator __m2 = _VSTD::next(__f2);
221146035553Spatrick            for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
221246035553Spatrick                ;
221346035553Spatrick            __link_pointer __f = __f2.__ptr_;
221446035553Spatrick            __link_pointer __l = __m2.__ptr_->__prev_;
221546035553Spatrick            if (__e1 == __f2)
221646035553Spatrick                __e1 = __m2;
221746035553Spatrick            __f2 = __m2;
221846035553Spatrick            base::__unlink_nodes(__f, __l);
221946035553Spatrick            __m2 = _VSTD::next(__f1);
222046035553Spatrick            __link_nodes(__f1.__ptr_, __f, __l);
222146035553Spatrick            __f1 = __m2;
222246035553Spatrick        }
222346035553Spatrick        else
222446035553Spatrick            ++__f1;
222546035553Spatrick    }
222646035553Spatrick    return __r;
222746035553Spatrick}
222846035553Spatrick
222946035553Spatricktemplate <class _Tp, class _Alloc>
223046035553Spatrickvoid
223146035553Spatricklist<_Tp, _Alloc>::reverse() _NOEXCEPT
223246035553Spatrick{
223346035553Spatrick    if (base::__sz() > 1)
223446035553Spatrick    {
223546035553Spatrick        iterator __e = end();
223646035553Spatrick        for (iterator __i = begin(); __i.__ptr_ != __e.__ptr_;)
223746035553Spatrick        {
223846035553Spatrick            _VSTD::swap(__i.__ptr_->__prev_, __i.__ptr_->__next_);
223946035553Spatrick            __i.__ptr_ = __i.__ptr_->__prev_;
224046035553Spatrick        }
224146035553Spatrick        _VSTD::swap(__e.__ptr_->__prev_, __e.__ptr_->__next_);
224246035553Spatrick    }
224346035553Spatrick}
224446035553Spatrick
224546035553Spatricktemplate <class _Tp, class _Alloc>
224646035553Spatrickbool
224746035553Spatricklist<_Tp, _Alloc>::__invariants() const
224846035553Spatrick{
224946035553Spatrick    return size() == _VSTD::distance(begin(), end());
225046035553Spatrick}
225146035553Spatrick
2252*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE
225346035553Spatrick
225446035553Spatricktemplate <class _Tp, class _Alloc>
225546035553Spatrickbool
225646035553Spatricklist<_Tp, _Alloc>::__dereferenceable(const const_iterator* __i) const
225746035553Spatrick{
225846035553Spatrick    return __i->__ptr_ != this->__end_as_link();
225946035553Spatrick}
226046035553Spatrick
226146035553Spatricktemplate <class _Tp, class _Alloc>
226246035553Spatrickbool
226346035553Spatricklist<_Tp, _Alloc>::__decrementable(const const_iterator* __i) const
226446035553Spatrick{
226546035553Spatrick    return !empty() &&  __i->__ptr_ != base::__end_.__next_;
226646035553Spatrick}
226746035553Spatrick
226846035553Spatricktemplate <class _Tp, class _Alloc>
226946035553Spatrickbool
227046035553Spatricklist<_Tp, _Alloc>::__addable(const const_iterator*, ptrdiff_t) const
227146035553Spatrick{
227246035553Spatrick    return false;
227346035553Spatrick}
227446035553Spatrick
227546035553Spatricktemplate <class _Tp, class _Alloc>
227646035553Spatrickbool
227746035553Spatricklist<_Tp, _Alloc>::__subscriptable(const const_iterator*, ptrdiff_t) const
227846035553Spatrick{
227946035553Spatrick    return false;
228046035553Spatrick}
228146035553Spatrick
2282*4bdff4beSrobert#endif // _LIBCPP_ENABLE_DEBUG_MODE
228346035553Spatrick
228446035553Spatricktemplate <class _Tp, class _Alloc>
228546035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
228646035553Spatrickbool
228746035553Spatrickoperator==(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
228846035553Spatrick{
228946035553Spatrick    return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
229046035553Spatrick}
229146035553Spatrick
229246035553Spatricktemplate <class _Tp, class _Alloc>
229346035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
229446035553Spatrickbool
229546035553Spatrickoperator< (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
229646035553Spatrick{
229746035553Spatrick    return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
229846035553Spatrick}
229946035553Spatrick
230046035553Spatricktemplate <class _Tp, class _Alloc>
230146035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
230246035553Spatrickbool
230346035553Spatrickoperator!=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
230446035553Spatrick{
230546035553Spatrick    return !(__x == __y);
230646035553Spatrick}
230746035553Spatrick
230846035553Spatricktemplate <class _Tp, class _Alloc>
230946035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
231046035553Spatrickbool
231146035553Spatrickoperator> (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
231246035553Spatrick{
231346035553Spatrick    return __y < __x;
231446035553Spatrick}
231546035553Spatrick
231646035553Spatricktemplate <class _Tp, class _Alloc>
231746035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
231846035553Spatrickbool
231946035553Spatrickoperator>=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
232046035553Spatrick{
232146035553Spatrick    return !(__x < __y);
232246035553Spatrick}
232346035553Spatrick
232446035553Spatricktemplate <class _Tp, class _Alloc>
232546035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
232646035553Spatrickbool
232746035553Spatrickoperator<=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
232846035553Spatrick{
232946035553Spatrick    return !(__y < __x);
233046035553Spatrick}
233146035553Spatrick
233246035553Spatricktemplate <class _Tp, class _Alloc>
233346035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
233446035553Spatrickvoid
233546035553Spatrickswap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y)
233646035553Spatrick    _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
233746035553Spatrick{
233846035553Spatrick    __x.swap(__y);
233946035553Spatrick}
234046035553Spatrick
234146035553Spatrick#if _LIBCPP_STD_VER > 17
234246035553Spatricktemplate <class _Tp, class _Allocator, class _Predicate>
2343037e7968Spatrickinline _LIBCPP_INLINE_VISIBILITY typename list<_Tp, _Allocator>::size_type
2344037e7968Spatrickerase_if(list<_Tp, _Allocator>& __c, _Predicate __pred) {
2345037e7968Spatrick  return __c.remove_if(__pred);
2346037e7968Spatrick}
234746035553Spatrick
234846035553Spatricktemplate <class _Tp, class _Allocator, class _Up>
2349037e7968Spatrickinline _LIBCPP_INLINE_VISIBILITY typename list<_Tp, _Allocator>::size_type
2350037e7968Spatrickerase(list<_Tp, _Allocator>& __c, const _Up& __v) {
2351037e7968Spatrick  return _VSTD::erase_if(__c, [&](auto& __elem) { return __elem == __v; });
2352037e7968Spatrick}
2353*4bdff4beSrobert
2354*4bdff4beSroberttemplate <>
2355*4bdff4beSrobertinline constexpr bool __format::__enable_insertable<std::list<char>> = true;
2356*4bdff4beSrobert#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
2357*4bdff4beSroberttemplate <>
2358*4bdff4beSrobertinline constexpr bool __format::__enable_insertable<std::list<wchar_t>> = true;
235946035553Spatrick#endif
236046035553Spatrick
2361*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 17
2362*4bdff4beSrobert
236346035553Spatrick_LIBCPP_END_NAMESPACE_STD
236446035553Spatrick
2365*4bdff4beSrobert#if _LIBCPP_STD_VER > 14
2366*4bdff4beSrobert_LIBCPP_BEGIN_NAMESPACE_STD
2367*4bdff4beSrobertnamespace pmr {
2368*4bdff4beSroberttemplate <class _ValueT>
2369*4bdff4beSrobertusing list = std::list<_ValueT, polymorphic_allocator<_ValueT>>;
2370*4bdff4beSrobert} // namespace pmr
2371*4bdff4beSrobert_LIBCPP_END_NAMESPACE_STD
2372*4bdff4beSrobert#endif
2373*4bdff4beSrobert
237446035553Spatrick_LIBCPP_POP_MACROS
237546035553Spatrick
2376*4bdff4beSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
2377*4bdff4beSrobert#  include <algorithm>
2378*4bdff4beSrobert#  include <atomic>
2379*4bdff4beSrobert#  include <concepts>
2380*4bdff4beSrobert#  include <functional>
2381*4bdff4beSrobert#  include <iosfwd>
2382*4bdff4beSrobert#  include <iterator>
2383*4bdff4beSrobert#  include <typeinfo>
2384*4bdff4beSrobert#endif
2385*4bdff4beSrobert
238646035553Spatrick#endif // _LIBCPP_LIST
2387