]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - contrib/libc++/include/list
Merged libcxxrt and libc++. Now available for testing on 9-stable with
[FreeBSD/stable/9.git] / contrib / libc++ / include / list
1 // -*- C++ -*-
2 //===---------------------------- list ------------------------------------===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 #ifndef _LIBCPP_LIST
12 #define _LIBCPP_LIST
13
14 /*
15     list synopsis
16
17 namespace std
18 {
19
20 template <class T, class Alloc = allocator<T> >
21 class list
22 {
23 public:
24
25     // types:
26     typedef T value_type;
27     typedef Alloc allocator_type;
28     typedef typename allocator_type::reference reference;
29     typedef typename allocator_type::const_reference const_reference;
30     typedef typename allocator_type::pointer pointer;
31     typedef typename allocator_type::const_pointer const_pointer;
32     typedef implementation-defined iterator;
33     typedef implementation-defined const_iterator;
34     typedef implementation-defined size_type;
35     typedef implementation-defined difference_type;
36     typedef reverse_iterator<iterator> reverse_iterator;
37     typedef reverse_iterator<const_iterator> const_reverse_iterator;
38
39     list()
40         noexcept(is_nothrow_default_constructible<allocator_type>::value);
41     explicit list(const allocator_type& a);
42     explicit list(size_type n);
43     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
150 template <class T, class Alloc>
151     bool operator==(const list<T,Alloc>& x, const list<T,Alloc>& y);
152 template <class T, class Alloc>
153     bool operator< (const list<T,Alloc>& x, const list<T,Alloc>& y);
154 template <class T, class Alloc>
155     bool operator!=(const list<T,Alloc>& x, const list<T,Alloc>& y);
156 template <class T, class Alloc>
157     bool operator> (const list<T,Alloc>& x, const list<T,Alloc>& y);
158 template <class T, class Alloc>
159     bool operator>=(const list<T,Alloc>& x, const list<T,Alloc>& y);
160 template <class T, class Alloc>
161     bool operator<=(const list<T,Alloc>& x, const list<T,Alloc>& y);
162
163 template <class T, class Alloc>
164     void swap(list<T,Alloc>& x, list<T,Alloc>& y)
165          noexcept(noexcept(x.swap(y)));
166
167 }  // std
168
169 */
170
171 #include <__config>
172
173 #include <memory>
174 #include <limits>
175 #include <initializer_list>
176 #include <iterator>
177 #include <algorithm>
178
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
187 template <class _Tp, class _VoidPtr> struct __list_node;
188
189 template <class _Tp, class _VoidPtr>
190 struct __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
209 template <class _Tp, class _VoidPtr>
210 struct __list_node
211     : public __list_node_base<_Tp, _VoidPtr>
212 {
213     _Tp __value_;
214 };
215
216 template <class _Tp, class _Alloc> class list;
217 template <class _Tp, class _Alloc> class __list_imp;
218 template <class _Tp, class _VoidPtr> class __list_const_iterator;
219
220 template <class _Tp, class _VoidPtr>
221 class _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;
249 public:
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
350 template <class _Tp, class _VoidPtr>
351 class _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;
376 public:
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
484 template <class _Tp, class _Alloc>
485 class __list_imp
486 {
487     __list_imp(const __list_imp&);
488     __list_imp& operator=(const __list_imp&);
489 protected:
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
592 private:
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]
637 template <class _Tp, class _Alloc>
638 inline _LIBCPP_INLINE_VISIBILITY
639 void
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
647 template <class _Tp, class _Alloc>
648 inline _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
655 template <class _Tp, class _Alloc>
656 inline _LIBCPP_INLINE_VISIBILITY
657 __list_imp<_Tp, _Alloc>::__list_imp(const allocator_type& __a)
658     : __size_alloc_(0, __node_allocator(__a))
659 {
660 }
661
662 template <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
671 template <class _Tp, class _Alloc>
672 void
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
707 template <class _Tp, class _Alloc>
708 void
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
769 template <class _Tp, class _Alloc = allocator<_Tp> >
770 class _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
779 public:
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
1016 private:
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
1028 template <class _Tp, class _Alloc>
1029 inline _LIBCPP_INLINE_VISIBILITY
1030 void
1031 list<_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
1039 template <class _Tp, class _Alloc>
1040 inline _LIBCPP_INLINE_VISIBILITY
1041 typename list<_Tp, _Alloc>::iterator
1042 list<_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
1048 template <class _Tp, class _Alloc>
1049 list<_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
1062 template <class _Tp, class _Alloc>
1063 list<_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
1072 template <class _Tp, class _Alloc>
1073 list<_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
1083 template <class _Tp, class _Alloc>
1084 template <class _InpIter>
1085 list<_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
1095 template <class _Tp, class _Alloc>
1096 template <class _InpIter>
1097 list<_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
1108 template <class _Tp, class _Alloc>
1109 list<_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
1121 template <class _Tp, class _Alloc>
1122 list<_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
1134 template <class _Tp, class _Alloc>
1135 list<_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
1146 template <class _Tp, class _Alloc>
1147 list<_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
1159 template <class _Tp, class _Alloc>
1160 inline _LIBCPP_INLINE_VISIBILITY
1161 list<_Tp, _Alloc>&
1162 list<_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
1174 template <class _Tp, class _Alloc>
1175 inline _LIBCPP_INLINE_VISIBILITY
1176 list<_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
1186 template <class _Tp, class _Alloc>
1187 inline _LIBCPP_INLINE_VISIBILITY
1188 list<_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
1203 template <class _Tp, class _Alloc>
1204 inline _LIBCPP_INLINE_VISIBILITY
1205 list<_Tp, _Alloc>&
1206 list<_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
1216 template <class _Tp, class _Alloc>
1217 void
1218 list<_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
1229 template <class _Tp, class _Alloc>
1230 void
1231 list<_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
1241 template <class _Tp, class _Alloc>
1242 template <class _InpIter>
1243 void
1244 list<_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
1257 template <class _Tp, class _Alloc>
1258 void
1259 list<_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
1271 template <class _Tp, class _Alloc>
1272 inline _LIBCPP_INLINE_VISIBILITY
1273 _Alloc
1274 list<_Tp, _Alloc>::get_allocator() const _NOEXCEPT
1275 {
1276     return allocator_type(base::__node_alloc());
1277 }
1278
1279 template <class _Tp, class _Alloc>
1280 typename list<_Tp, _Alloc>::iterator
1281 list<_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
1298 template <class _Tp, class _Alloc>
1299 typename list<_Tp, _Alloc>::iterator
1300 list<_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
1364 template <class _Tp, class _Alloc>
1365 template <class _InpIter>
1366 typename list<_Tp, _Alloc>::iterator
1367 list<_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
1432 template <class _Tp, class _Alloc>
1433 void
1434 list<_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
1445 template <class _Tp, class _Alloc>
1446 void
1447 list<_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
1460 template <class _Tp, class _Alloc>
1461 void
1462 list<_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
1473 template <class _Tp, class _Alloc>
1474 void
1475 list<_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
1488 template <class _Tp, class _Alloc>
1489 template <class... _Args>
1490 void
1491 list<_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
1502 template <class _Tp, class _Alloc>
1503 template <class... _Args>
1504 void
1505 list<_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
1516 template <class _Tp, class _Alloc>
1517 template <class... _Args>
1518 typename list<_Tp, _Alloc>::iterator
1519 list<_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
1537 template <class _Tp, class _Alloc>
1538 typename list<_Tp, _Alloc>::iterator
1539 list<_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
1562 template <class _Tp, class _Alloc>
1563 void
1564 list<_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
1590 template <class _Tp, class _Alloc>
1591 void
1592 list<_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
1618 template <class _Tp, class _Alloc>
1619 typename list<_Tp, _Alloc>::iterator
1620 list<_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
1656 template <class _Tp, class _Alloc>
1657 typename list<_Tp, _Alloc>::iterator
1658 list<_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
1700 template <class _Tp, class _Alloc>
1701 void
1702 list<_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
1759 template <class _Tp, class _Alloc>
1760 void
1761 list<_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
1818 template <class _Tp, class _Alloc>
1819 void
1820 list<_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
1858 template <class _Tp, class _Alloc>
1859 void
1860 list<_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
1901 template <class _Tp, class _Alloc>
1902 void
1903 list<_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
1959 template <class _Tp, class _Alloc>
1960 void
1961 list<_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
1977 template <class _Tp, class _Alloc>
1978 template <class _Pred>
1979 void
1980 list<_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
1996 template <class _Tp, class _Alloc>
1997 inline _LIBCPP_INLINE_VISIBILITY
1998 void
1999 list<_Tp, _Alloc>::unique()
2000 {
2001     unique(__equal_to<value_type>());
2002 }
2003
2004 template <class _Tp, class _Alloc>
2005 template <class _BinaryPred>
2006 void
2007 list<_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
2019 template <class _Tp, class _Alloc>
2020 inline _LIBCPP_INLINE_VISIBILITY
2021 void
2022 list<_Tp, _Alloc>::merge(list& __c)
2023 {
2024     merge(__c, __less<value_type>());
2025 }
2026
2027 template <class _Tp, class _Alloc>
2028 template <class _Comp>
2029 void
2030 list<_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
2081 template <class _Tp, class _Alloc>
2082 inline _LIBCPP_INLINE_VISIBILITY
2083 void
2084 list<_Tp, _Alloc>::sort()
2085 {
2086     sort(__less<value_type>());
2087 }
2088
2089 template <class _Tp, class _Alloc>
2090 template <class _Comp>
2091 inline _LIBCPP_INLINE_VISIBILITY
2092 void
2093 list<_Tp, _Alloc>::sort(_Comp __comp)
2094 {
2095     __sort(begin(), end(), base::__sz(), __comp);
2096 }
2097
2098 template <class _Tp, class _Alloc>
2099 template <class _Comp>
2100 typename list<_Tp, _Alloc>::iterator
2101 list<_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
2161 template <class _Tp, class _Alloc>
2162 void
2163 list<_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
2177 template <class _Tp, class _Alloc>
2178 bool
2179 list<_Tp, _Alloc>::__invariants() const
2180 {
2181     return size() == _VSTD::distance(begin(), end());
2182 }
2183
2184 #if _LIBCPP_DEBUG_LEVEL >= 2
2185
2186 template <class _Tp, class _Alloc>
2187 bool
2188 list<_Tp, _Alloc>::__dereferenceable(const const_iterator* __i) const
2189 {
2190     return __i->__ptr_ != &this->__end_;
2191 }
2192
2193 template <class _Tp, class _Alloc>
2194 bool
2195 list<_Tp, _Alloc>::__decrementable(const const_iterator* __i) const
2196 {
2197     return !empty() &&  __i->__ptr_ != base::__end_.__next_;
2198 }
2199
2200 template <class _Tp, class _Alloc>
2201 bool
2202 list<_Tp, _Alloc>::__addable(const const_iterator* __i, ptrdiff_t __n) const
2203 {
2204     return false;
2205 }
2206
2207 template <class _Tp, class _Alloc>
2208 bool
2209 list<_Tp, _Alloc>::__subscriptable(const const_iterator* __i, ptrdiff_t __n) const
2210 {
2211     return false;
2212 }
2213
2214 #endif  // _LIBCPP_DEBUG_LEVEL >= 2
2215
2216 template <class _Tp, class _Alloc>
2217 inline _LIBCPP_INLINE_VISIBILITY
2218 bool
2219 operator==(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
2224 template <class _Tp, class _Alloc>
2225 inline _LIBCPP_INLINE_VISIBILITY
2226 bool
2227 operator< (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
2232 template <class _Tp, class _Alloc>
2233 inline _LIBCPP_INLINE_VISIBILITY
2234 bool
2235 operator!=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2236 {
2237     return !(__x == __y);
2238 }
2239
2240 template <class _Tp, class _Alloc>
2241 inline _LIBCPP_INLINE_VISIBILITY
2242 bool
2243 operator> (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2244 {
2245     return __y < __x;
2246 }
2247
2248 template <class _Tp, class _Alloc>
2249 inline _LIBCPP_INLINE_VISIBILITY
2250 bool
2251 operator>=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2252 {
2253     return !(__x < __y);
2254 }
2255
2256 template <class _Tp, class _Alloc>
2257 inline _LIBCPP_INLINE_VISIBILITY
2258 bool
2259 operator<=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2260 {
2261     return !(__y < __x);
2262 }
2263
2264 template <class _Tp, class _Alloc>
2265 inline _LIBCPP_INLINE_VISIBILITY
2266 void
2267 swap(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