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