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