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