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