blob: 20a66c36002df66964ed53dd8b95a4798b7a9c43 [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:161// -*- C++ -*-
2//===---------------------------- list ------------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:014// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:165//
Howard Hinnantb64f8b02010-11-16 22:09:026// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:168//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_LIST
12#define _LIBCPP_LIST
13
14/*
15 list synopsis
16
17namespace std
18{
19
20template <class T, class Alloc = allocator<T> >
21class list
22{
23public:
24
25 // types:
26 typedef T value_type;
27 typedef Alloc allocator_type;
28 typedef typename allocator_type::reference reference;
29 typedef typename allocator_type::const_reference const_reference;
30 typedef typename allocator_type::pointer pointer;
31 typedef typename allocator_type::const_pointer const_pointer;
32 typedef implementation-defined iterator;
33 typedef implementation-defined const_iterator;
34 typedef implementation-defined size_type;
35 typedef implementation-defined difference_type;
36 typedef reverse_iterator<iterator> reverse_iterator;
37 typedef reverse_iterator<const_iterator> const_reverse_iterator;
38
Howard Hinnantc5607272011-06-03 17:30:2839 list()
40 noexcept(is_nothrow_default_constructible<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:1641 explicit list(const allocator_type& a);
42 explicit list(size_type n);
Marshall Clowe00f53b2013-09-09 18:19:4543 explicit list(size_type n, const allocator_type& a); // C++14
Howard Hinnantbc8d3f92010-05-11 19:42:1644 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);
Howard Hinnantc5607272011-06-03 17:30:2852 list(list&& x)
53 noexcept(is_nothrow_move_constructible<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:1654 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);
Howard Hinnantc5607272011-06-03 17:30:2861 list& operator=(list&& x)
62 noexcept(
63 allocator_type::propagate_on_container_move_assignment::value &&
64 is_nothrow_move_assignable<allocator_type>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:1665 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
Howard Hinnantc5607272011-06-03 17:30:2871 allocator_type get_allocator() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:1672
Howard Hinnantc5607272011-06-03 17:30:2873 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;
Howard Hinnantbc8d3f92010-05-11 19:42:1685
86 reference front();
87 const_reference front() const;
88 reference back();
89 const_reference back() const;
90
Howard Hinnantc5607272011-06-03 17:30:2891 bool empty() const noexcept;
92 size_type size() const noexcept;
93 size_type max_size() const noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:1694
95 template <class... Args>
Marshall Clow4e42dc92017-01-24 23:09:1296 reference emplace_front(Args&&... args); // reference in C++17
Howard Hinnantbc8d3f92010-05-11 19:42:1697 void pop_front();
98 template <class... Args>
Marshall Clow4e42dc92017-01-24 23:09:1299 reference emplace_back(Args&&... args); // reference in C++17
Howard Hinnantbc8d3f92010-05-11 19:42:16100 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
Howard Hinnantc5607272011-06-03 17:30:28120 void swap(list&)
Marshall Clow7d914d12015-07-13 20:04:56121 noexcept(allocator_traits<allocator_type>::is_always_equal::value); // C++17
Howard Hinnantc5607272011-06-03 17:30:28122 void clear() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16123
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);
Howard Hinnantc5607272011-06-03 17:30:28147 void reverse() noexcept;
Howard Hinnantbc8d3f92010-05-11 19:42:16148};
149
150template <class T, class Alloc>
151 bool operator==(const list<T,Alloc>& x, const list<T,Alloc>& y);
152template <class T, class Alloc>
153 bool operator< (const list<T,Alloc>& x, const list<T,Alloc>& y);
154template <class T, class Alloc>
155 bool operator!=(const list<T,Alloc>& x, const list<T,Alloc>& y);
156template <class T, class Alloc>
157 bool operator> (const list<T,Alloc>& x, const list<T,Alloc>& y);
158template <class T, class Alloc>
159 bool operator>=(const list<T,Alloc>& x, const list<T,Alloc>& y);
160template <class T, class Alloc>
161 bool operator<=(const list<T,Alloc>& x, const list<T,Alloc>& y);
162
163template <class T, class Alloc>
Howard Hinnantc5607272011-06-03 17:30:28164 void swap(list<T,Alloc>& x, list<T,Alloc>& y)
165 noexcept(noexcept(x.swap(y)));
Howard Hinnantbc8d3f92010-05-11 19:42:16166
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>
Eric Fiselier5c74b482015-12-30 20:57:59178#include <type_traits>
Howard Hinnantbc8d3f92010-05-11 19:42:16179
Eric Fiselierb9536102014-08-10 23:53:08180#include <__debug>
Howard Hinnant8b00e6c2013-08-02 00:26:35181
Howard Hinnant08e17472011-10-17 20:05:10182#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantbc8d3f92010-05-11 19:42:16183#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10184#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16185
Eric Fiselier018a3d52017-05-31 22:07:49186_LIBCPP_PUSH_MACROS
187#include <__undef_macros>
188
189
Howard Hinnantbc8d3f92010-05-11 19:42:16190_LIBCPP_BEGIN_NAMESPACE_STD
191
Howard Hinnant2b1b2d42011-06-14 19:58:17192template <class _Tp, class _VoidPtr> struct __list_node;
Eric Fiselier5c74b482015-12-30 20:57:59193template <class _Tp, class _VoidPtr> struct __list_node_base;
194
195template <class _Tp, class _VoidPtr>
196struct __list_node_pointer_traits {
197 typedef typename __rebind_pointer<_VoidPtr, __list_node<_Tp, _VoidPtr> >::type
198 __node_pointer;
199 typedef typename __rebind_pointer<_VoidPtr, __list_node_base<_Tp, _VoidPtr> >::type
200 __base_pointer;
201
202#if defined(_LIBCPP_ABI_LIST_REMOVE_NODE_POINTER_UB)
203 typedef __base_pointer __link_pointer;
204#else
205 typedef typename conditional<
206 is_pointer<_VoidPtr>::value,
207 __base_pointer,
208 __node_pointer
209 >::type __link_pointer;
210#endif
211
Eric Fiselier8e7bd4f2016-01-04 03:27:52212 typedef typename conditional<
213 is_same<__link_pointer, __node_pointer>::value,
214 __base_pointer,
215 __node_pointer
216 >::type __non_link_pointer;
217
218 static _LIBCPP_INLINE_VISIBILITY
219 __link_pointer __unsafe_link_pointer_cast(__link_pointer __p) {
220 return __p;
221 }
222
223 static _LIBCPP_INLINE_VISIBILITY
224 __link_pointer __unsafe_link_pointer_cast(__non_link_pointer __p) {
225 return static_cast<__link_pointer>(static_cast<_VoidPtr>(__p));
226 }
227
Eric Fiselier5c74b482015-12-30 20:57:59228};
Howard Hinnantbc8d3f92010-05-11 19:42:16229
230template <class _Tp, class _VoidPtr>
231struct __list_node_base
232{
Eric Fiselier5c74b482015-12-30 20:57:59233 typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits;
234 typedef typename _NodeTraits::__node_pointer __node_pointer;
235 typedef typename _NodeTraits::__base_pointer __base_pointer;
236 typedef typename _NodeTraits::__link_pointer __link_pointer;
Howard Hinnant29f74322013-06-25 16:08:47237
Eric Fiselier5c74b482015-12-30 20:57:59238 __link_pointer __prev_;
239 __link_pointer __next_;
Howard Hinnantbc8d3f92010-05-11 19:42:16240
Howard Hinnant82894812010-09-22 16:48:34241 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier8e7bd4f2016-01-04 03:27:52242 __list_node_base() : __prev_(_NodeTraits::__unsafe_link_pointer_cast(__self())),
243 __next_(_NodeTraits::__unsafe_link_pointer_cast(__self())) {}
Marshall Clowea8ed832014-08-05 01:34:12244
245 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier8e7bd4f2016-01-04 03:27:52246 __base_pointer __self() {
Eric Fiselier5c74b482015-12-30 20:57:59247 return pointer_traits<__base_pointer>::pointer_to(*this);
248 }
249
250 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier5c74b482015-12-30 20:57:59251 __node_pointer __as_node() {
Eric Fiselier8e7bd4f2016-01-04 03:27:52252 return static_cast<__node_pointer>(__self());
Marshall Clowea8ed832014-08-05 01:34:12253 }
Howard Hinnantbc8d3f92010-05-11 19:42:16254};
255
256template <class _Tp, class _VoidPtr>
257struct __list_node
258 : public __list_node_base<_Tp, _VoidPtr>
259{
260 _Tp __value_;
Eric Fiselier8e7bd4f2016-01-04 03:27:52261
262 typedef __list_node_base<_Tp, _VoidPtr> __base;
263 typedef typename __base::__link_pointer __link_pointer;
264
265 _LIBCPP_INLINE_VISIBILITY
266 __link_pointer __as_link() {
267 return static_cast<__link_pointer>(__base::__self());
268 }
Howard Hinnantbc8d3f92010-05-11 19:42:16269};
270
Eric Fiselierc3589a82017-01-04 23:56:00271template <class _Tp, class _Alloc = allocator<_Tp> > class _LIBCPP_TEMPLATE_VIS list;
Howard Hinnant2b1b2d42011-06-14 19:58:17272template <class _Tp, class _Alloc> class __list_imp;
Eric Fiselierc3589a82017-01-04 23:56:00273template <class _Tp, class _VoidPtr> class _LIBCPP_TEMPLATE_VIS __list_const_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16274
275template <class _Tp, class _VoidPtr>
Eric Fiselierc3589a82017-01-04 23:56:00276class _LIBCPP_TEMPLATE_VIS __list_iterator
Howard Hinnantbc8d3f92010-05-11 19:42:16277{
Eric Fiselier5c74b482015-12-30 20:57:59278 typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits;
279 typedef typename _NodeTraits::__link_pointer __link_pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16280
Eric Fiselier5c74b482015-12-30 20:57:59281 __link_pointer __ptr_;
Howard Hinnantbc8d3f92010-05-11 19:42:16282
Howard Hinnant1c3ec6d2011-09-27 23:55:03283#if _LIBCPP_DEBUG_LEVEL >= 2
284 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier5c74b482015-12-30 20:57:59285 explicit __list_iterator(__link_pointer __p, const void* __c) _NOEXCEPT
Howard Hinnant1c3ec6d2011-09-27 23:55:03286 : __ptr_(__p)
287 {
288 __get_db()->__insert_ic(this, __c);
289 }
290#else
Howard Hinnant82894812010-09-22 16:48:34291 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier5c74b482015-12-30 20:57:59292 explicit __list_iterator(__link_pointer __p) _NOEXCEPT : __ptr_(__p) {}
Howard Hinnant1c3ec6d2011-09-27 23:55:03293#endif
294
295
Howard Hinnantbc8d3f92010-05-11 19:42:16296
297 template<class, class> friend class list;
298 template<class, class> friend class __list_imp;
299 template<class, class> friend class __list_const_iterator;
300public:
301 typedef bidirectional_iterator_tag iterator_category;
302 typedef _Tp value_type;
303 typedef value_type& reference;
Eric Fiselierbb2f28e2015-08-23 02:56:05304 typedef typename __rebind_pointer<_VoidPtr, value_type>::type pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16305 typedef typename pointer_traits<pointer>::difference_type difference_type;
306
Howard Hinnant82894812010-09-22 16:48:34307 _LIBCPP_INLINE_VISIBILITY
Marshall Clow65d2e6a2013-08-05 21:23:28308 __list_iterator() _NOEXCEPT : __ptr_(nullptr)
Howard Hinnant1c3ec6d2011-09-27 23:55:03309 {
310#if _LIBCPP_DEBUG_LEVEL >= 2
311 __get_db()->__insert_i(this);
312#endif
313 }
314
315#if _LIBCPP_DEBUG_LEVEL >= 2
316
Howard Hinnant211f0ee2011-01-28 23:46:28317 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c3ec6d2011-09-27 23:55:03318 __list_iterator(const __list_iterator& __p)
319 : __ptr_(__p.__ptr_)
320 {
321 __get_db()->__iterator_copy(this, &__p);
322 }
323
324 _LIBCPP_INLINE_VISIBILITY
325 ~__list_iterator()
326 {
327 __get_db()->__erase_i(this);
328 }
329
330 _LIBCPP_INLINE_VISIBILITY
331 __list_iterator& operator=(const __list_iterator& __p)
332 {
333 if (this != &__p)
334 {
335 __get_db()->__iterator_copy(this, &__p);
336 __ptr_ = __p.__ptr_;
337 }
338 return *this;
339 }
340
341#endif // _LIBCPP_DEBUG_LEVEL >= 2
342
343 _LIBCPP_INLINE_VISIBILITY
344 reference operator*() const
345 {
346#if _LIBCPP_DEBUG_LEVEL >= 2
347 _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
348 "Attempted to dereference a non-dereferenceable list::iterator");
349#endif
Eric Fiselier5c74b482015-12-30 20:57:59350 return __ptr_->__as_node()->__value_;
Howard Hinnant1c3ec6d2011-09-27 23:55:03351 }
Howard Hinnant82894812010-09-22 16:48:34352 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant29f74322013-06-25 16:08:47353 pointer operator->() const
354 {
355#if _LIBCPP_DEBUG_LEVEL >= 2
356 _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
357 "Attempted to dereference a non-dereferenceable list::iterator");
358#endif
Eric Fiselier5c74b482015-12-30 20:57:59359 return pointer_traits<pointer>::pointer_to(__ptr_->__as_node()->__value_);
Howard Hinnant29f74322013-06-25 16:08:47360 }
Howard Hinnantbc8d3f92010-05-11 19:42:16361
Howard Hinnant82894812010-09-22 16:48:34362 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c3ec6d2011-09-27 23:55:03363 __list_iterator& operator++()
364 {
365#if _LIBCPP_DEBUG_LEVEL >= 2
366 _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
367 "Attempted to increment non-incrementable list::iterator");
368#endif
369 __ptr_ = __ptr_->__next_;
370 return *this;
371 }
Howard Hinnant82894812010-09-22 16:48:34372 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16373 __list_iterator operator++(int) {__list_iterator __t(*this); ++(*this); return __t;}
374
Howard Hinnant82894812010-09-22 16:48:34375 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c3ec6d2011-09-27 23:55:03376 __list_iterator& operator--()
377 {
378#if _LIBCPP_DEBUG_LEVEL >= 2
379 _LIBCPP_ASSERT(__get_const_db()->__decrementable(this),
380 "Attempted to decrement non-decrementable list::iterator");
381#endif
382 __ptr_ = __ptr_->__prev_;
383 return *this;
384 }
Howard Hinnant82894812010-09-22 16:48:34385 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16386 __list_iterator operator--(int) {__list_iterator __t(*this); --(*this); return __t;}
387
Howard Hinnant82894812010-09-22 16:48:34388 friend _LIBCPP_INLINE_VISIBILITY
389 bool operator==(const __list_iterator& __x, const __list_iterator& __y)
Howard Hinnant1c3ec6d2011-09-27 23:55:03390 {
Howard Hinnant1c3ec6d2011-09-27 23:55:03391 return __x.__ptr_ == __y.__ptr_;
392 }
Howard Hinnant82894812010-09-22 16:48:34393 friend _LIBCPP_INLINE_VISIBILITY
394 bool operator!=(const __list_iterator& __x, const __list_iterator& __y)
Howard Hinnantbc8d3f92010-05-11 19:42:16395 {return !(__x == __y);}
396};
397
398template <class _Tp, class _VoidPtr>
Eric Fiselierc3589a82017-01-04 23:56:00399class _LIBCPP_TEMPLATE_VIS __list_const_iterator
Howard Hinnantbc8d3f92010-05-11 19:42:16400{
Eric Fiselier5c74b482015-12-30 20:57:59401 typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits;
402 typedef typename _NodeTraits::__link_pointer __link_pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16403
Eric Fiselier5c74b482015-12-30 20:57:59404 __link_pointer __ptr_;
Howard Hinnantbc8d3f92010-05-11 19:42:16405
Howard Hinnant1c3ec6d2011-09-27 23:55:03406#if _LIBCPP_DEBUG_LEVEL >= 2
407 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier5c74b482015-12-30 20:57:59408 explicit __list_const_iterator(__link_pointer __p, const void* __c) _NOEXCEPT
Howard Hinnant1c3ec6d2011-09-27 23:55:03409 : __ptr_(__p)
410 {
411 __get_db()->__insert_ic(this, __c);
412 }
413#else
Howard Hinnant82894812010-09-22 16:48:34414 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier5c74b482015-12-30 20:57:59415 explicit __list_const_iterator(__link_pointer __p) _NOEXCEPT : __ptr_(__p) {}
Howard Hinnant1c3ec6d2011-09-27 23:55:03416#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16417
418 template<class, class> friend class list;
419 template<class, class> friend class __list_imp;
420public:
421 typedef bidirectional_iterator_tag iterator_category;
422 typedef _Tp value_type;
423 typedef const value_type& reference;
Eric Fiselierbb2f28e2015-08-23 02:56:05424 typedef typename __rebind_pointer<_VoidPtr, const value_type>::type pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16425 typedef typename pointer_traits<pointer>::difference_type difference_type;
426
Howard Hinnant82894812010-09-22 16:48:34427 _LIBCPP_INLINE_VISIBILITY
Marshall Clow65d2e6a2013-08-05 21:23:28428 __list_const_iterator() _NOEXCEPT : __ptr_(nullptr)
Howard Hinnant1c3ec6d2011-09-27 23:55:03429 {
430#if _LIBCPP_DEBUG_LEVEL >= 2
431 __get_db()->__insert_i(this);
432#endif
433 }
Howard Hinnant211f0ee2011-01-28 23:46:28434 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6dcaf3e2013-04-05 17:58:52435 __list_const_iterator(const __list_iterator<_Tp, _VoidPtr>& __p) _NOEXCEPT
Howard Hinnant1c3ec6d2011-09-27 23:55:03436 : __ptr_(__p.__ptr_)
437 {
438#if _LIBCPP_DEBUG_LEVEL >= 2
439 __get_db()->__iterator_copy(this, &__p);
440#endif
441 }
442
443#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnantbc8d3f92010-05-11 19:42:16444
Howard Hinnant82894812010-09-22 16:48:34445 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c3ec6d2011-09-27 23:55:03446 __list_const_iterator(const __list_const_iterator& __p)
447 : __ptr_(__p.__ptr_)
448 {
449 __get_db()->__iterator_copy(this, &__p);
450 }
451
452 _LIBCPP_INLINE_VISIBILITY
453 ~__list_const_iterator()
454 {
455 __get_db()->__erase_i(this);
456 }
457
458 _LIBCPP_INLINE_VISIBILITY
459 __list_const_iterator& operator=(const __list_const_iterator& __p)
460 {
461 if (this != &__p)
462 {
463 __get_db()->__iterator_copy(this, &__p);
464 __ptr_ = __p.__ptr_;
465 }
466 return *this;
467 }
468
469#endif // _LIBCPP_DEBUG_LEVEL >= 2
470 _LIBCPP_INLINE_VISIBILITY
471 reference operator*() const
472 {
473#if _LIBCPP_DEBUG_LEVEL >= 2
474 _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
475 "Attempted to dereference a non-dereferenceable list::const_iterator");
476#endif
Eric Fiselier5c74b482015-12-30 20:57:59477 return __ptr_->__as_node()->__value_;
Howard Hinnant1c3ec6d2011-09-27 23:55:03478 }
Howard Hinnant82894812010-09-22 16:48:34479 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant29f74322013-06-25 16:08:47480 pointer operator->() const
481 {
482#if _LIBCPP_DEBUG_LEVEL >= 2
483 _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
484 "Attempted to dereference a non-dereferenceable list::iterator");
485#endif
Eric Fiselier5c74b482015-12-30 20:57:59486 return pointer_traits<pointer>::pointer_to(__ptr_->__as_node()->__value_);
Howard Hinnant29f74322013-06-25 16:08:47487 }
Howard Hinnantbc8d3f92010-05-11 19:42:16488
Howard Hinnant82894812010-09-22 16:48:34489 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c3ec6d2011-09-27 23:55:03490 __list_const_iterator& operator++()
491 {
492#if _LIBCPP_DEBUG_LEVEL >= 2
493 _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(this),
494 "Attempted to increment non-incrementable list::const_iterator");
495#endif
496 __ptr_ = __ptr_->__next_;
497 return *this;
498 }
Howard Hinnant82894812010-09-22 16:48:34499 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16500 __list_const_iterator operator++(int) {__list_const_iterator __t(*this); ++(*this); return __t;}
501
Howard Hinnant82894812010-09-22 16:48:34502 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c3ec6d2011-09-27 23:55:03503 __list_const_iterator& operator--()
504 {
505#if _LIBCPP_DEBUG_LEVEL >= 2
506 _LIBCPP_ASSERT(__get_const_db()->__decrementable(this),
507 "Attempted to decrement non-decrementable list::const_iterator");
508#endif
509 __ptr_ = __ptr_->__prev_;
510 return *this;
511 }
Howard Hinnant82894812010-09-22 16:48:34512 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16513 __list_const_iterator operator--(int) {__list_const_iterator __t(*this); --(*this); return __t;}
514
Howard Hinnant82894812010-09-22 16:48:34515 friend _LIBCPP_INLINE_VISIBILITY
516 bool operator==(const __list_const_iterator& __x, const __list_const_iterator& __y)
Howard Hinnant1c3ec6d2011-09-27 23:55:03517 {
Howard Hinnant1c3ec6d2011-09-27 23:55:03518 return __x.__ptr_ == __y.__ptr_;
519 }
Howard Hinnant82894812010-09-22 16:48:34520 friend _LIBCPP_INLINE_VISIBILITY
521 bool operator!=(const __list_const_iterator& __x, const __list_const_iterator& __y)
Howard Hinnantbc8d3f92010-05-11 19:42:16522 {return !(__x == __y);}
523};
524
525template <class _Tp, class _Alloc>
526class __list_imp
527{
528 __list_imp(const __list_imp&);
529 __list_imp& operator=(const __list_imp&);
530protected:
531 typedef _Tp value_type;
532 typedef _Alloc allocator_type;
533 typedef allocator_traits<allocator_type> __alloc_traits;
534 typedef typename __alloc_traits::size_type size_type;
535 typedef typename __alloc_traits::void_pointer __void_pointer;
536 typedef __list_iterator<value_type, __void_pointer> iterator;
537 typedef __list_const_iterator<value_type, __void_pointer> const_iterator;
538 typedef __list_node_base<value_type, __void_pointer> __node_base;
539 typedef __list_node<value_type, __void_pointer> __node;
Marshall Clow66302c62015-04-07 05:21:38540 typedef typename __rebind_alloc_helper<__alloc_traits, __node>::type __node_allocator;
Howard Hinnantbc8d3f92010-05-11 19:42:16541 typedef allocator_traits<__node_allocator> __node_alloc_traits;
542 typedef typename __node_alloc_traits::pointer __node_pointer;
Howard Hinnant29f74322013-06-25 16:08:47543 typedef typename __node_alloc_traits::pointer __node_const_pointer;
Eric Fiselier8e7bd4f2016-01-04 03:27:52544 typedef __list_node_pointer_traits<value_type, __void_pointer> __node_pointer_traits;
545 typedef typename __node_pointer_traits::__link_pointer __link_pointer;
Eric Fiselier5c74b482015-12-30 20:57:59546 typedef __link_pointer __link_const_pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16547 typedef typename __alloc_traits::pointer pointer;
548 typedef typename __alloc_traits::const_pointer const_pointer;
549 typedef typename __alloc_traits::difference_type difference_type;
550
Marshall Clow66302c62015-04-07 05:21:38551 typedef typename __rebind_alloc_helper<__alloc_traits, __node_base>::type __node_base_allocator;
Howard Hinnant29f74322013-06-25 16:08:47552 typedef typename allocator_traits<__node_base_allocator>::pointer __node_base_pointer;
553
Howard Hinnantbc8d3f92010-05-11 19:42:16554 __node_base __end_;
555 __compressed_pair<size_type, __node_allocator> __size_alloc_;
556
Howard Hinnant82894812010-09-22 16:48:34557 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier8e7bd4f2016-01-04 03:27:52558 __link_pointer __end_as_link() const _NOEXCEPT {
559 return __node_pointer_traits::__unsafe_link_pointer_cast(
560 const_cast<__node_base&>(__end_).__self());
561 }
562
563 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28564 size_type& __sz() _NOEXCEPT {return __size_alloc_.first();}
Howard Hinnant82894812010-09-22 16:48:34565 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28566 const size_type& __sz() const _NOEXCEPT
567 {return __size_alloc_.first();}
Howard Hinnant82894812010-09-22 16:48:34568 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28569 __node_allocator& __node_alloc() _NOEXCEPT
570 {return __size_alloc_.second();}
Howard Hinnant82894812010-09-22 16:48:34571 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28572 const __node_allocator& __node_alloc() const _NOEXCEPT
573 {return __size_alloc_.second();}
Howard Hinnantbc8d3f92010-05-11 19:42:16574
Evgeniy Stepanov9341a8a2016-04-22 01:04:55575 _LIBCPP_INLINE_VISIBILITY
Eric Fiselieref3060e2016-11-23 01:18:56576 size_type __node_alloc_max_size() const _NOEXCEPT {
577 return __node_alloc_traits::max_size(__node_alloc());
578 }
579 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier5c74b482015-12-30 20:57:59580 static void __unlink_nodes(__link_pointer __f, __link_pointer __l) _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16581
Evgeniy Stepanov9341a8a2016-04-22 01:04:55582 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28583 __list_imp()
584 _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value);
Evgeniy Stepanov9341a8a2016-04-22 01:04:55585 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16586 __list_imp(const allocator_type& __a);
587 ~__list_imp();
Howard Hinnantc5607272011-06-03 17:30:28588 void clear() _NOEXCEPT;
Howard Hinnant82894812010-09-22 16:48:34589 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28590 bool empty() const _NOEXCEPT {return __sz() == 0;}
Howard Hinnantbc8d3f92010-05-11 19:42:16591
Howard Hinnant82894812010-09-22 16:48:34592 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c3ec6d2011-09-27 23:55:03593 iterator begin() _NOEXCEPT
594 {
595#if _LIBCPP_DEBUG_LEVEL >= 2
596 return iterator(__end_.__next_, this);
597#else
598 return iterator(__end_.__next_);
599#endif
600 }
Howard Hinnant82894812010-09-22 16:48:34601 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28602 const_iterator begin() const _NOEXCEPT
Howard Hinnant1c3ec6d2011-09-27 23:55:03603 {
604#if _LIBCPP_DEBUG_LEVEL >= 2
605 return const_iterator(__end_.__next_, this);
606#else
607 return const_iterator(__end_.__next_);
608#endif
609 }
Howard Hinnant82894812010-09-22 16:48:34610 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c3ec6d2011-09-27 23:55:03611 iterator end() _NOEXCEPT
612 {
613#if _LIBCPP_DEBUG_LEVEL >= 2
Eric Fiselier8e7bd4f2016-01-04 03:27:52614 return iterator(__end_as_link(), this);
Howard Hinnant1c3ec6d2011-09-27 23:55:03615#else
Eric Fiselier8e7bd4f2016-01-04 03:27:52616 return iterator(__end_as_link());
Howard Hinnant1c3ec6d2011-09-27 23:55:03617#endif
618 }
Howard Hinnant82894812010-09-22 16:48:34619 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28620 const_iterator end() const _NOEXCEPT
Howard Hinnant1c3ec6d2011-09-27 23:55:03621 {
622#if _LIBCPP_DEBUG_LEVEL >= 2
Eric Fiselier8e7bd4f2016-01-04 03:27:52623 return const_iterator(__end_as_link(), this);
Howard Hinnant1c3ec6d2011-09-27 23:55:03624#else
Eric Fiselier8e7bd4f2016-01-04 03:27:52625 return const_iterator(__end_as_link());
Howard Hinnant1c3ec6d2011-09-27 23:55:03626#endif
627 }
Howard Hinnantbc8d3f92010-05-11 19:42:16628
Howard Hinnantc5607272011-06-03 17:30:28629 void swap(__list_imp& __c)
Marshall Clow7d914d12015-07-13 20:04:56630#if _LIBCPP_STD_VER >= 14
Eric Fiselierfb342382016-12-28 06:06:09631 _NOEXCEPT_DEBUG;
Marshall Clow7d914d12015-07-13 20:04:56632#else
Eric Fiselierfb342382016-12-28 06:06:09633 _NOEXCEPT_DEBUG_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow7d914d12015-07-13 20:04:56634 __is_nothrow_swappable<allocator_type>::value);
635#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16636
Howard Hinnant82894812010-09-22 16:48:34637 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16638 void __copy_assign_alloc(const __list_imp& __c)
639 {__copy_assign_alloc(__c, integral_constant<bool,
640 __node_alloc_traits::propagate_on_container_copy_assignment::value>());}
641
Howard Hinnant82894812010-09-22 16:48:34642 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16643 void __move_assign_alloc(__list_imp& __c)
Howard Hinnantc5607272011-06-03 17:30:28644 _NOEXCEPT_(
645 !__node_alloc_traits::propagate_on_container_move_assignment::value ||
646 is_nothrow_move_assignable<__node_allocator>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16647 {__move_assign_alloc(__c, integral_constant<bool,
648 __node_alloc_traits::propagate_on_container_move_assignment::value>());}
649
650private:
Howard Hinnant82894812010-09-22 16:48:34651 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16652 void __copy_assign_alloc(const __list_imp& __c, true_type)
653 {
654 if (__node_alloc() != __c.__node_alloc())
655 clear();
656 __node_alloc() = __c.__node_alloc();
657 }
658
Howard Hinnant82894812010-09-22 16:48:34659 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier0e5ebbc2016-12-23 23:37:52660 void __copy_assign_alloc(const __list_imp&, false_type)
Howard Hinnantbc8d3f92010-05-11 19:42:16661 {}
662
Howard Hinnant82894812010-09-22 16:48:34663 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant9cbee432011-09-02 20:42:31664 void __move_assign_alloc(__list_imp& __c, true_type)
Howard Hinnantc5607272011-06-03 17:30:28665 _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16666 {
Howard Hinnant0949eed2011-06-30 21:18:19667 __node_alloc() = _VSTD::move(__c.__node_alloc());
Howard Hinnantbc8d3f92010-05-11 19:42:16668 }
669
Howard Hinnant82894812010-09-22 16:48:34670 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier0e5ebbc2016-12-23 23:37:52671 void __move_assign_alloc(__list_imp&, false_type)
Howard Hinnantc5607272011-06-03 17:30:28672 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16673 {}
Eric Fiselierfb342382016-12-28 06:06:09674
675 _LIBCPP_INLINE_VISIBILITY
676 void __invalidate_all_iterators() {
677#if _LIBCPP_DEBUG_LEVEL >= 2
678 __get_db()->__invalidate_all(this);
679#endif
680 }
Howard Hinnantbc8d3f92010-05-11 19:42:16681};
682
683// Unlink nodes [__f, __l]
684template <class _Tp, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:55685inline
Howard Hinnantbc8d3f92010-05-11 19:42:16686void
Eric Fiselier5c74b482015-12-30 20:57:59687__list_imp<_Tp, _Alloc>::__unlink_nodes(__link_pointer __f, __link_pointer __l)
Howard Hinnantc5607272011-06-03 17:30:28688 _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16689{
Howard Hinnant29f74322013-06-25 16:08:47690 __f->__prev_->__next_ = __l->__next_;
691 __l->__next_->__prev_ = __f->__prev_;
Howard Hinnantbc8d3f92010-05-11 19:42:16692}
693
694template <class _Tp, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:55695inline
Howard Hinnantbc8d3f92010-05-11 19:42:16696__list_imp<_Tp, _Alloc>::__list_imp()
Howard Hinnantc5607272011-06-03 17:30:28697 _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:16698 : __size_alloc_(0)
699{
700}
701
702template <class _Tp, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:55703inline
Howard Hinnantbc8d3f92010-05-11 19:42:16704__list_imp<_Tp, _Alloc>::__list_imp(const allocator_type& __a)
705 : __size_alloc_(0, __node_allocator(__a))
706{
707}
708
709template <class _Tp, class _Alloc>
710__list_imp<_Tp, _Alloc>::~__list_imp()
711{
712 clear();
Howard Hinnant1c3ec6d2011-09-27 23:55:03713#if _LIBCPP_DEBUG_LEVEL >= 2
714 __get_db()->__erase_c(this);
715#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16716}
717
718template <class _Tp, class _Alloc>
719void
Howard Hinnantc5607272011-06-03 17:30:28720__list_imp<_Tp, _Alloc>::clear() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:16721{
722 if (!empty())
723 {
724 __node_allocator& __na = __node_alloc();
Eric Fiselier5c74b482015-12-30 20:57:59725 __link_pointer __f = __end_.__next_;
Eric Fiselier8e7bd4f2016-01-04 03:27:52726 __link_pointer __l = __end_as_link();
Howard Hinnant29f74322013-06-25 16:08:47727 __unlink_nodes(__f, __l->__prev_);
Howard Hinnantbc8d3f92010-05-11 19:42:16728 __sz() = 0;
729 while (__f != __l)
730 {
Eric Fiselier5c74b482015-12-30 20:57:59731 __node_pointer __np = __f->__as_node();
Howard Hinnant1c3ec6d2011-09-27 23:55:03732 __f = __f->__next_;
Eric Fiselier5c74b482015-12-30 20:57:59733 __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
734 __node_alloc_traits::deallocate(__na, __np, 1);
Howard Hinnantbc8d3f92010-05-11 19:42:16735 }
Eric Fiselierfb342382016-12-28 06:06:09736 __invalidate_all_iterators();
Howard Hinnantbc8d3f92010-05-11 19:42:16737 }
738}
739
740template <class _Tp, class _Alloc>
741void
742__list_imp<_Tp, _Alloc>::swap(__list_imp& __c)
Marshall Clow7d914d12015-07-13 20:04:56743#if _LIBCPP_STD_VER >= 14
Eric Fiselierfb342382016-12-28 06:06:09744 _NOEXCEPT_DEBUG
Marshall Clow7d914d12015-07-13 20:04:56745#else
Eric Fiselierfb342382016-12-28 06:06:09746 _NOEXCEPT_DEBUG_(!__alloc_traits::propagate_on_container_swap::value ||
Marshall Clow7d914d12015-07-13 20:04:56747 __is_nothrow_swappable<allocator_type>::value)
748#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16749{
Howard Hinnant1c3ec6d2011-09-27 23:55:03750 _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value ||
751 this->__node_alloc() == __c.__node_alloc(),
752 "list::swap: Either propagate_on_container_swap must be true"
753 " or the allocators must compare equal");
Howard Hinnant0949eed2011-06-30 21:18:19754 using _VSTD::swap;
Marshall Clow7d914d12015-07-13 20:04:56755 __swap_allocator(__node_alloc(), __c.__node_alloc());
Howard Hinnantbc8d3f92010-05-11 19:42:16756 swap(__sz(), __c.__sz());
757 swap(__end_, __c.__end_);
758 if (__sz() == 0)
Eric Fiselier8e7bd4f2016-01-04 03:27:52759 __end_.__next_ = __end_.__prev_ = __end_as_link();
Howard Hinnantbc8d3f92010-05-11 19:42:16760 else
Eric Fiselier8e7bd4f2016-01-04 03:27:52761 __end_.__prev_->__next_ = __end_.__next_->__prev_ = __end_as_link();
Howard Hinnantbc8d3f92010-05-11 19:42:16762 if (__c.__sz() == 0)
Eric Fiselier8e7bd4f2016-01-04 03:27:52763 __c.__end_.__next_ = __c.__end_.__prev_ = __c.__end_as_link();
Howard Hinnantbc8d3f92010-05-11 19:42:16764 else
Eric Fiselier8e7bd4f2016-01-04 03:27:52765 __c.__end_.__prev_->__next_ = __c.__end_.__next_->__prev_ = __c.__end_as_link();
Marshall Clowea8ed832014-08-05 01:34:12766
Howard Hinnant1c3ec6d2011-09-27 23:55:03767#if _LIBCPP_DEBUG_LEVEL >= 2
768 __libcpp_db* __db = __get_db();
769 __c_node* __cn1 = __db->__find_c_and_lock(this);
770 __c_node* __cn2 = __db->__find_c(&__c);
771 std::swap(__cn1->beg_, __cn2->beg_);
772 std::swap(__cn1->end_, __cn2->end_);
773 std::swap(__cn1->cap_, __cn2->cap_);
774 for (__i_node** __p = __cn1->end_; __p != __cn1->beg_;)
775 {
776 --__p;
777 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
Eric Fiselier8e7bd4f2016-01-04 03:27:52778 if (__i->__ptr_ == __c.__end_as_link())
Howard Hinnant1c3ec6d2011-09-27 23:55:03779 {
780 __cn2->__add(*__p);
781 if (--__cn1->end_ != __p)
782 memmove(__p, __p+1, (__cn1->end_ - __p)*sizeof(__i_node*));
783 }
784 else
785 (*__p)->__c_ = __cn1;
786 }
787 for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;)
788 {
789 --__p;
790 const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_);
Eric Fiselier8e7bd4f2016-01-04 03:27:52791 if (__i->__ptr_ == __end_as_link())
Howard Hinnant1c3ec6d2011-09-27 23:55:03792 {
793 __cn1->__add(*__p);
794 if (--__cn2->end_ != __p)
795 memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*));
796 }
797 else
798 (*__p)->__c_ = __cn2;
799 }
800 __db->unlock();
801#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16802}
803
Marshall Clowceead9c2015-02-18 17:24:08804template <class _Tp, class _Alloc /*= allocator<_Tp>*/>
Eric Fiselierc3589a82017-01-04 23:56:00805class _LIBCPP_TEMPLATE_VIS list
Howard Hinnantbc8d3f92010-05-11 19:42:16806 : private __list_imp<_Tp, _Alloc>
807{
808 typedef __list_imp<_Tp, _Alloc> base;
809 typedef typename base::__node __node;
810 typedef typename base::__node_allocator __node_allocator;
811 typedef typename base::__node_pointer __node_pointer;
812 typedef typename base::__node_alloc_traits __node_alloc_traits;
Howard Hinnant29f74322013-06-25 16:08:47813 typedef typename base::__node_base __node_base;
814 typedef typename base::__node_base_pointer __node_base_pointer;
Eric Fiselier5c74b482015-12-30 20:57:59815 typedef typename base::__link_pointer __link_pointer;
Howard Hinnantbc8d3f92010-05-11 19:42:16816
817public:
818 typedef _Tp value_type;
819 typedef _Alloc allocator_type;
820 static_assert((is_same<value_type, typename allocator_type::value_type>::value),
821 "Invalid allocator::value_type");
822 typedef value_type& reference;
823 typedef const value_type& const_reference;
824 typedef typename base::pointer pointer;
825 typedef typename base::const_pointer const_pointer;
826 typedef typename base::size_type size_type;
827 typedef typename base::difference_type difference_type;
828 typedef typename base::iterator iterator;
829 typedef typename base::const_iterator const_iterator;
Howard Hinnant0949eed2011-06-30 21:18:19830 typedef _VSTD::reverse_iterator<iterator> reverse_iterator;
831 typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator;
Howard Hinnantbc8d3f92010-05-11 19:42:16832
Howard Hinnant82894812010-09-22 16:48:34833 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28834 list()
835 _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value)
Howard Hinnant1c3ec6d2011-09-27 23:55:03836 {
837#if _LIBCPP_DEBUG_LEVEL >= 2
838 __get_db()->__insert_c(this);
839#endif
840 }
Howard Hinnant82894812010-09-22 16:48:34841 _LIBCPP_INLINE_VISIBILITY
Marshall Clow955f2c82013-09-08 19:11:51842 explicit list(const allocator_type& __a) : base(__a)
Howard Hinnant1c3ec6d2011-09-27 23:55:03843 {
844#if _LIBCPP_DEBUG_LEVEL >= 2
845 __get_db()->__insert_c(this);
846#endif
847 }
Marshall Clow955f2c82013-09-08 19:11:51848 explicit list(size_type __n);
849#if _LIBCPP_STD_VER > 11
850 explicit list(size_type __n, const allocator_type& __a);
851#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16852 list(size_type __n, const value_type& __x);
853 list(size_type __n, const value_type& __x, const allocator_type& __a);
854 template <class _InpIter>
855 list(_InpIter __f, _InpIter __l,
856 typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0);
857 template <class _InpIter>
858 list(_InpIter __f, _InpIter __l, const allocator_type& __a,
859 typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0);
860
861 list(const list& __c);
862 list(const list& __c, const allocator_type& __a);
Evgeniy Stepanov9341a8a2016-04-22 01:04:55863 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16864 list& operator=(const list& __c);
Eric Fiselier55ff80e2017-04-16 03:45:35865#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:16866 list(initializer_list<value_type> __il);
867 list(initializer_list<value_type> __il, const allocator_type& __a);
Eric Fiselier55ff80e2017-04-16 03:45:35868
Evgeniy Stepanov9341a8a2016-04-22 01:04:55869 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28870 list(list&& __c)
871 _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value);
Evgeniy Stepanov9341a8a2016-04-22 01:04:55872 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16873 list(list&& __c, const allocator_type& __a);
Evgeniy Stepanov9341a8a2016-04-22 01:04:55874 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28875 list& operator=(list&& __c)
876 _NOEXCEPT_(
877 __node_alloc_traits::propagate_on_container_move_assignment::value &&
878 is_nothrow_move_assignable<__node_allocator>::value);
Eric Fiselier55ff80e2017-04-16 03:45:35879
Howard Hinnant82894812010-09-22 16:48:34880 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16881 list& operator=(initializer_list<value_type> __il)
882 {assign(__il.begin(), __il.end()); return *this;}
Eric Fiselier55ff80e2017-04-16 03:45:35883
884 _LIBCPP_INLINE_VISIBILITY
885 void assign(initializer_list<value_type> __il)
886 {assign(__il.begin(), __il.end());}
887#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:16888
889 template <class _InpIter>
890 void assign(_InpIter __f, _InpIter __l,
891 typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0);
892 void assign(size_type __n, const value_type& __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16893
Evgeniy Stepanov9341a8a2016-04-22 01:04:55894 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28895 allocator_type get_allocator() const _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:16896
Howard Hinnant82894812010-09-22 16:48:34897 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28898 size_type size() const _NOEXCEPT {return base::__sz();}
Howard Hinnant82894812010-09-22 16:48:34899 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28900 bool empty() const _NOEXCEPT {return base::empty();}
Howard Hinnant82894812010-09-22 16:48:34901 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28902 size_type max_size() const _NOEXCEPT
Eric Fiselieref3060e2016-11-23 01:18:56903 {
904 return std::min<size_type>(
905 base::__node_alloc_max_size(),
906 numeric_limits<difference_type >::max());
907 }
Howard Hinnantbc8d3f92010-05-11 19:42:16908
Howard Hinnant82894812010-09-22 16:48:34909 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28910 iterator begin() _NOEXCEPT {return base::begin();}
Howard Hinnant82894812010-09-22 16:48:34911 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28912 const_iterator begin() const _NOEXCEPT {return base::begin();}
Howard Hinnant82894812010-09-22 16:48:34913 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28914 iterator end() _NOEXCEPT {return base::end();}
Howard Hinnant82894812010-09-22 16:48:34915 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28916 const_iterator end() const _NOEXCEPT {return base::end();}
Howard Hinnant82894812010-09-22 16:48:34917 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28918 const_iterator cbegin() const _NOEXCEPT {return base::begin();}
Howard Hinnant82894812010-09-22 16:48:34919 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28920 const_iterator cend() const _NOEXCEPT {return base::end();}
Howard Hinnantbc8d3f92010-05-11 19:42:16921
Howard Hinnant82894812010-09-22 16:48:34922 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28923 reverse_iterator rbegin() _NOEXCEPT
924 {return reverse_iterator(end());}
Howard Hinnant82894812010-09-22 16:48:34925 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28926 const_reverse_iterator rbegin() const _NOEXCEPT
927 {return const_reverse_iterator(end());}
Howard Hinnant82894812010-09-22 16:48:34928 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28929 reverse_iterator rend() _NOEXCEPT
930 {return reverse_iterator(begin());}
Howard Hinnant82894812010-09-22 16:48:34931 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28932 const_reverse_iterator rend() const _NOEXCEPT
933 {return const_reverse_iterator(begin());}
Howard Hinnant82894812010-09-22 16:48:34934 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28935 const_reverse_iterator crbegin() const _NOEXCEPT
936 {return const_reverse_iterator(end());}
Howard Hinnant82894812010-09-22 16:48:34937 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:28938 const_reverse_iterator crend() const _NOEXCEPT
939 {return const_reverse_iterator(begin());}
Howard Hinnantbc8d3f92010-05-11 19:42:16940
Howard Hinnant82894812010-09-22 16:48:34941 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c3ec6d2011-09-27 23:55:03942 reference front()
943 {
944 _LIBCPP_ASSERT(!empty(), "list::front called on empty list");
Eric Fiselier5c74b482015-12-30 20:57:59945 return base::__end_.__next_->__as_node()->__value_;
Howard Hinnant1c3ec6d2011-09-27 23:55:03946 }
Howard Hinnant82894812010-09-22 16:48:34947 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c3ec6d2011-09-27 23:55:03948 const_reference front() const
949 {
950 _LIBCPP_ASSERT(!empty(), "list::front called on empty list");
Eric Fiselier5c74b482015-12-30 20:57:59951 return base::__end_.__next_->__as_node()->__value_;
Howard Hinnant1c3ec6d2011-09-27 23:55:03952 }
Howard Hinnant82894812010-09-22 16:48:34953 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c3ec6d2011-09-27 23:55:03954 reference back()
955 {
956 _LIBCPP_ASSERT(!empty(), "list::back called on empty list");
Eric Fiselier5c74b482015-12-30 20:57:59957 return base::__end_.__prev_->__as_node()->__value_;
Howard Hinnant1c3ec6d2011-09-27 23:55:03958 }
Howard Hinnant82894812010-09-22 16:48:34959 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant1c3ec6d2011-09-27 23:55:03960 const_reference back() const
961 {
962 _LIBCPP_ASSERT(!empty(), "list::back called on empty list");
Eric Fiselier5c74b482015-12-30 20:57:59963 return base::__end_.__prev_->__as_node()->__value_;
Howard Hinnant1c3ec6d2011-09-27 23:55:03964 }
Howard Hinnantbc8d3f92010-05-11 19:42:16965
Eric Fiselier55ff80e2017-04-16 03:45:35966#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:16967 void push_front(value_type&& __x);
968 void push_back(value_type&& __x);
Eric Fiselier55ff80e2017-04-16 03:45:35969
Howard Hinnantbc8d3f92010-05-11 19:42:16970 template <class... _Args>
Marshall Clow4e42dc92017-01-24 23:09:12971#if _LIBCPP_STD_VER > 14
Eric Fiselier3816ef92016-07-21 03:20:17972 reference emplace_front(_Args&&... __args);
Marshall Clow4e42dc92017-01-24 23:09:12973#else
974 void emplace_front(_Args&&... __args);
975#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16976 template <class... _Args>
Marshall Clow4e42dc92017-01-24 23:09:12977#if _LIBCPP_STD_VER > 14
Eric Fiselier3816ef92016-07-21 03:20:17978 reference emplace_back(_Args&&... __args);
Marshall Clow4e42dc92017-01-24 23:09:12979#else
980 void emplace_back(_Args&&... __args);
981#endif
Howard Hinnantbc8d3f92010-05-11 19:42:16982 template <class... _Args>
983 iterator emplace(const_iterator __p, _Args&&... __args);
Eric Fiselier55ff80e2017-04-16 03:45:35984
Howard Hinnantbc8d3f92010-05-11 19:42:16985 iterator insert(const_iterator __p, value_type&& __x);
Eric Fiselier55ff80e2017-04-16 03:45:35986
987 _LIBCPP_INLINE_VISIBILITY
988 iterator insert(const_iterator __p, initializer_list<value_type> __il)
989 {return insert(__p, __il.begin(), __il.end());}
990#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:16991
992 void push_front(const value_type& __x);
993 void push_back(const value_type& __x);
994
995 iterator insert(const_iterator __p, const value_type& __x);
996 iterator insert(const_iterator __p, size_type __n, const value_type& __x);
997 template <class _InpIter>
998 iterator insert(const_iterator __p, _InpIter __f, _InpIter __l,
999 typename enable_if<__is_input_iterator<_InpIter>::value>::type* = 0);
Howard Hinnantbc8d3f92010-05-11 19:42:161000
Howard Hinnant82894812010-09-22 16:48:341001 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:281002 void swap(list& __c)
Marshall Clow7d914d12015-07-13 20:04:561003#if _LIBCPP_STD_VER >= 14
Eric Fiselierfb342382016-12-28 06:06:091004 _NOEXCEPT_DEBUG
Marshall Clow7d914d12015-07-13 20:04:561005#else
Eric Fiselierfb342382016-12-28 06:06:091006 _NOEXCEPT_DEBUG_(!__node_alloc_traits::propagate_on_container_swap::value ||
Howard Hinnantc5607272011-06-03 17:30:281007 __is_nothrow_swappable<__node_allocator>::value)
Marshall Clow7d914d12015-07-13 20:04:561008#endif
Howard Hinnantc5607272011-06-03 17:30:281009 {base::swap(__c);}
Howard Hinnant82894812010-09-22 16:48:341010 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc5607272011-06-03 17:30:281011 void clear() _NOEXCEPT {base::clear();}
Howard Hinnantbc8d3f92010-05-11 19:42:161012
1013 void pop_front();
1014 void pop_back();
1015
1016 iterator erase(const_iterator __p);
1017 iterator erase(const_iterator __f, const_iterator __l);
1018
1019 void resize(size_type __n);
1020 void resize(size_type __n, const value_type& __x);
1021
1022 void splice(const_iterator __p, list& __c);
Eric Fiselier55ff80e2017-04-16 03:45:351023#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant82894812010-09-22 16:48:341024 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161025 void splice(const_iterator __p, list&& __c) {splice(__p, __c);}
Howard Hinnant82894812010-09-22 16:48:341026 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161027 void splice(const_iterator __p, list&& __c, const_iterator __i)
1028 {splice(__p, __c, __i);}
Howard Hinnant82894812010-09-22 16:48:341029 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161030 void splice(const_iterator __p, list&& __c, const_iterator __f, const_iterator __l)
1031 {splice(__p, __c, __f, __l);}
Eric Fiselier55ff80e2017-04-16 03:45:351032#endif
1033 void splice(const_iterator __p, list& __c, const_iterator __i);
1034 void splice(const_iterator __p, list& __c, const_iterator __f, const_iterator __l);
Howard Hinnantbc8d3f92010-05-11 19:42:161035
1036 void remove(const value_type& __x);
1037 template <class _Pred> void remove_if(_Pred __pred);
Evgeniy Stepanov9341a8a2016-04-22 01:04:551038 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161039 void unique();
1040 template <class _BinaryPred>
1041 void unique(_BinaryPred __binary_pred);
Evgeniy Stepanov9341a8a2016-04-22 01:04:551042 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161043 void merge(list& __c);
Eric Fiselier55ff80e2017-04-16 03:45:351044#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant82894812010-09-22 16:48:341045 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161046 void merge(list&& __c) {merge(__c);}
Eric Fiselier55ff80e2017-04-16 03:45:351047
Howard Hinnantbc8d3f92010-05-11 19:42:161048 template <class _Comp>
Howard Hinnant82894812010-09-22 16:48:341049 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161050 void merge(list&& __c, _Comp __comp) {merge(__c, __comp);}
Eric Fiselier55ff80e2017-04-16 03:45:351051#endif
1052 template <class _Comp>
1053 void merge(list& __c, _Comp __comp);
1054
Evgeniy Stepanov9341a8a2016-04-22 01:04:551055 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161056 void sort();
1057 template <class _Comp>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551058 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:161059 void sort(_Comp __comp);
1060
Howard Hinnantc5607272011-06-03 17:30:281061 void reverse() _NOEXCEPT;
Howard Hinnantbc8d3f92010-05-11 19:42:161062
Howard Hinnant1c3ec6d2011-09-27 23:55:031063 bool __invariants() const;
1064
1065#if _LIBCPP_DEBUG_LEVEL >= 2
1066
1067 bool __dereferenceable(const const_iterator* __i) const;
1068 bool __decrementable(const const_iterator* __i) const;
1069 bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
1070 bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
1071
1072#endif // _LIBCPP_DEBUG_LEVEL >= 2
1073
Howard Hinnantbc8d3f92010-05-11 19:42:161074private:
Evgeniy Stepanov9341a8a2016-04-22 01:04:551075 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier5c74b482015-12-30 20:57:591076 static void __link_nodes (__link_pointer __p, __link_pointer __f, __link_pointer __l);
Evgeniy Stepanov9341a8a2016-04-22 01:04:551077 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier5c74b482015-12-30 20:57:591078 void __link_nodes_at_front(__link_pointer __f, __link_pointer __l);
Evgeniy Stepanov9341a8a2016-04-22 01:04:551079 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier5c74b482015-12-30 20:57:591080 void __link_nodes_at_back (__link_pointer __f, __link_pointer __l);
Howard Hinnantbc8d3f92010-05-11 19:42:161081 iterator __iterator(size_type __n);
1082 template <class _Comp>
1083 static iterator __sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp);
1084
Howard Hinnantc5607272011-06-03 17:30:281085 void __move_assign(list& __c, true_type)
1086 _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value);
Howard Hinnantbc8d3f92010-05-11 19:42:161087 void __move_assign(list& __c, false_type);
1088};
1089
1090// Link in nodes [__f, __l] just prior to __p
1091template <class _Tp, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551092inline
Howard Hinnantbc8d3f92010-05-11 19:42:161093void
Eric Fiselier5c74b482015-12-30 20:57:591094list<_Tp, _Alloc>::__link_nodes(__link_pointer __p, __link_pointer __f, __link_pointer __l)
Howard Hinnantbc8d3f92010-05-11 19:42:161095{
Howard Hinnant29f74322013-06-25 16:08:471096 __p->__prev_->__next_ = __f;
1097 __f->__prev_ = __p->__prev_;
1098 __p->__prev_ = __l;
1099 __l->__next_ = __p;
Howard Hinnantbc8d3f92010-05-11 19:42:161100}
1101
Marshall Clowea8ed832014-08-05 01:34:121102// Link in nodes [__f, __l] at the front of the list
1103template <class _Tp, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551104inline
Marshall Clowea8ed832014-08-05 01:34:121105void
Eric Fiselier5c74b482015-12-30 20:57:591106list<_Tp, _Alloc>::__link_nodes_at_front(__link_pointer __f, __link_pointer __l)
Marshall Clowea8ed832014-08-05 01:34:121107{
Eric Fiselier8e7bd4f2016-01-04 03:27:521108 __f->__prev_ = base::__end_as_link();
Marshall Clowfca038e2014-08-08 15:35:521109 __l->__next_ = base::__end_.__next_;
1110 __l->__next_->__prev_ = __l;
1111 base::__end_.__next_ = __f;
Marshall Clowea8ed832014-08-05 01:34:121112}
1113
1114// Link in nodes [__f, __l] at the front of the list
1115template <class _Tp, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551116inline
Marshall Clowea8ed832014-08-05 01:34:121117void
Eric Fiselier5c74b482015-12-30 20:57:591118list<_Tp, _Alloc>::__link_nodes_at_back(__link_pointer __f, __link_pointer __l)
Marshall Clowea8ed832014-08-05 01:34:121119{
Eric Fiselier8e7bd4f2016-01-04 03:27:521120 __l->__next_ = base::__end_as_link();
Marshall Clowfca038e2014-08-08 15:35:521121 __f->__prev_ = base::__end_.__prev_;
1122 __f->__prev_->__next_ = __f;
1123 base::__end_.__prev_ = __l;
Marshall Clowea8ed832014-08-05 01:34:121124}
1125
1126
Howard Hinnantbc8d3f92010-05-11 19:42:161127template <class _Tp, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551128inline
Howard Hinnantbc8d3f92010-05-11 19:42:161129typename list<_Tp, _Alloc>::iterator
1130list<_Tp, _Alloc>::__iterator(size_type __n)
1131{
Howard Hinnant0949eed2011-06-30 21:18:191132 return __n <= base::__sz() / 2 ? _VSTD::next(begin(), __n)
1133 : _VSTD::prev(end(), base::__sz() - __n);
Howard Hinnantbc8d3f92010-05-11 19:42:161134}
1135
1136template <class _Tp, class _Alloc>
1137list<_Tp, _Alloc>::list(size_type __n)
1138{
Howard Hinnant1c3ec6d2011-09-27 23:55:031139#if _LIBCPP_DEBUG_LEVEL >= 2
1140 __get_db()->__insert_c(this);
1141#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161142 for (; __n > 0; --__n)
Eric Fiselier55ff80e2017-04-16 03:45:351143#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:161144 emplace_back();
1145#else
1146 push_back(value_type());
1147#endif
1148}
1149
Marshall Clow955f2c82013-09-08 19:11:511150#if _LIBCPP_STD_VER > 11
1151template <class _Tp, class _Alloc>
1152list<_Tp, _Alloc>::list(size_type __n, const allocator_type& __a) : base(__a)
1153{
1154#if _LIBCPP_DEBUG_LEVEL >= 2
1155 __get_db()->__insert_c(this);
1156#endif
1157 for (; __n > 0; --__n)
Marshall Clow955f2c82013-09-08 19:11:511158 emplace_back();
Marshall Clow955f2c82013-09-08 19:11:511159}
1160#endif
1161
Howard Hinnantbc8d3f92010-05-11 19:42:161162template <class _Tp, class _Alloc>
1163list<_Tp, _Alloc>::list(size_type __n, const value_type& __x)
1164{
Howard Hinnant1c3ec6d2011-09-27 23:55:031165#if _LIBCPP_DEBUG_LEVEL >= 2
1166 __get_db()->__insert_c(this);
1167#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161168 for (; __n > 0; --__n)
1169 push_back(__x);
1170}
1171
1172template <class _Tp, class _Alloc>
1173list<_Tp, _Alloc>::list(size_type __n, const value_type& __x, const allocator_type& __a)
1174 : base(__a)
1175{
Howard Hinnant1c3ec6d2011-09-27 23:55:031176#if _LIBCPP_DEBUG_LEVEL >= 2
1177 __get_db()->__insert_c(this);
1178#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161179 for (; __n > 0; --__n)
1180 push_back(__x);
1181}
1182
1183template <class _Tp, class _Alloc>
1184template <class _InpIter>
1185list<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l,
1186 typename enable_if<__is_input_iterator<_InpIter>::value>::type*)
1187{
Howard Hinnant1c3ec6d2011-09-27 23:55:031188#if _LIBCPP_DEBUG_LEVEL >= 2
1189 __get_db()->__insert_c(this);
1190#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161191 for (; __f != __l; ++__f)
1192 push_back(*__f);
1193}
1194
1195template <class _Tp, class _Alloc>
1196template <class _InpIter>
1197list<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l, const allocator_type& __a,
1198 typename enable_if<__is_input_iterator<_InpIter>::value>::type*)
1199 : base(__a)
1200{
Howard Hinnant1c3ec6d2011-09-27 23:55:031201#if _LIBCPP_DEBUG_LEVEL >= 2
1202 __get_db()->__insert_c(this);
1203#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161204 for (; __f != __l; ++__f)
1205 push_back(*__f);
1206}
1207
1208template <class _Tp, class _Alloc>
1209list<_Tp, _Alloc>::list(const list& __c)
1210 : base(allocator_type(
1211 __node_alloc_traits::select_on_container_copy_construction(
1212 __c.__node_alloc())))
1213{
Howard Hinnant1c3ec6d2011-09-27 23:55:031214#if _LIBCPP_DEBUG_LEVEL >= 2
1215 __get_db()->__insert_c(this);
1216#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161217 for (const_iterator __i = __c.begin(), __e = __c.end(); __i != __e; ++__i)
1218 push_back(*__i);
1219}
1220
1221template <class _Tp, class _Alloc>
1222list<_Tp, _Alloc>::list(const list& __c, const allocator_type& __a)
1223 : base(__a)
1224{
Howard Hinnant1c3ec6d2011-09-27 23:55:031225#if _LIBCPP_DEBUG_LEVEL >= 2
1226 __get_db()->__insert_c(this);
1227#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161228 for (const_iterator __i = __c.begin(), __e = __c.end(); __i != __e; ++__i)
1229 push_back(*__i);
1230}
1231
Eric Fiselier55ff80e2017-04-16 03:45:351232#ifndef _LIBCPP_CXX03_LANG
Howard Hinnante3e32912011-08-12 21:56:021233
Howard Hinnantbc8d3f92010-05-11 19:42:161234template <class _Tp, class _Alloc>
1235list<_Tp, _Alloc>::list(initializer_list<value_type> __il, const allocator_type& __a)
1236 : base(__a)
1237{
Howard Hinnant1c3ec6d2011-09-27 23:55:031238#if _LIBCPP_DEBUG_LEVEL >= 2
1239 __get_db()->__insert_c(this);
1240#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161241 for (typename initializer_list<value_type>::const_iterator __i = __il.begin(),
1242 __e = __il.end(); __i != __e; ++__i)
1243 push_back(*__i);
1244}
1245
1246template <class _Tp, class _Alloc>
1247list<_Tp, _Alloc>::list(initializer_list<value_type> __il)
1248{
Howard Hinnant1c3ec6d2011-09-27 23:55:031249#if _LIBCPP_DEBUG_LEVEL >= 2
1250 __get_db()->__insert_c(this);
1251#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161252 for (typename initializer_list<value_type>::const_iterator __i = __il.begin(),
1253 __e = __il.end(); __i != __e; ++__i)
1254 push_back(*__i);
1255}
1256
Howard Hinnantbc8d3f92010-05-11 19:42:161257template <class _Tp, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551258inline
Howard Hinnantbc8d3f92010-05-11 19:42:161259list<_Tp, _Alloc>::list(list&& __c)
Howard Hinnantc5607272011-06-03 17:30:281260 _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value)
Howard Hinnant0949eed2011-06-30 21:18:191261 : base(allocator_type(_VSTD::move(__c.__node_alloc())))
Howard Hinnantbc8d3f92010-05-11 19:42:161262{
Howard Hinnant1c3ec6d2011-09-27 23:55:031263#if _LIBCPP_DEBUG_LEVEL >= 2
1264 __get_db()->__insert_c(this);
1265#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161266 splice(end(), __c);
1267}
1268
1269template <class _Tp, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551270inline
Howard Hinnantbc8d3f92010-05-11 19:42:161271list<_Tp, _Alloc>::list(list&& __c, const allocator_type& __a)
1272 : base(__a)
1273{
Howard Hinnant1c3ec6d2011-09-27 23:55:031274#if _LIBCPP_DEBUG_LEVEL >= 2
1275 __get_db()->__insert_c(this);
1276#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161277 if (__a == __c.get_allocator())
1278 splice(end(), __c);
1279 else
1280 {
Howard Hinnant99968442011-11-29 18:15:501281 typedef move_iterator<iterator> _Ip;
1282 assign(_Ip(__c.begin()), _Ip(__c.end()));
Howard Hinnantbc8d3f92010-05-11 19:42:161283 }
1284}
1285
1286template <class _Tp, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551287inline
Howard Hinnantbc8d3f92010-05-11 19:42:161288list<_Tp, _Alloc>&
1289list<_Tp, _Alloc>::operator=(list&& __c)
Howard Hinnantc5607272011-06-03 17:30:281290 _NOEXCEPT_(
1291 __node_alloc_traits::propagate_on_container_move_assignment::value &&
1292 is_nothrow_move_assignable<__node_allocator>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:161293{
1294 __move_assign(__c, integral_constant<bool,
1295 __node_alloc_traits::propagate_on_container_move_assignment::value>());
1296 return *this;
1297}
1298
1299template <class _Tp, class _Alloc>
1300void
1301list<_Tp, _Alloc>::__move_assign(list& __c, false_type)
1302{
1303 if (base::__node_alloc() != __c.__node_alloc())
1304 {
Howard Hinnant99968442011-11-29 18:15:501305 typedef move_iterator<iterator> _Ip;
1306 assign(_Ip(__c.begin()), _Ip(__c.end()));
Howard Hinnantbc8d3f92010-05-11 19:42:161307 }
1308 else
1309 __move_assign(__c, true_type());
1310}
1311
1312template <class _Tp, class _Alloc>
1313void
1314list<_Tp, _Alloc>::__move_assign(list& __c, true_type)
Howard Hinnantc5607272011-06-03 17:30:281315 _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value)
Howard Hinnantbc8d3f92010-05-11 19:42:161316{
1317 clear();
1318 base::__move_assign_alloc(__c);
1319 splice(end(), __c);
1320}
1321
Eric Fiselier55ff80e2017-04-16 03:45:351322#endif // _LIBCPP_CXX03_LANG
1323
1324template <class _Tp, class _Alloc>
1325inline
1326list<_Tp, _Alloc>&
1327list<_Tp, _Alloc>::operator=(const list& __c)
1328{
1329 if (this != &__c)
1330 {
1331 base::__copy_assign_alloc(__c);
1332 assign(__c.begin(), __c.end());
1333 }
1334 return *this;
1335}
Howard Hinnantbc8d3f92010-05-11 19:42:161336
1337template <class _Tp, class _Alloc>
1338template <class _InpIter>
1339void
1340list<_Tp, _Alloc>::assign(_InpIter __f, _InpIter __l,
1341 typename enable_if<__is_input_iterator<_InpIter>::value>::type*)
1342{
1343 iterator __i = begin();
1344 iterator __e = end();
1345 for (; __f != __l && __i != __e; ++__f, ++__i)
1346 *__i = *__f;
1347 if (__i == __e)
1348 insert(__e, __f, __l);
1349 else
1350 erase(__i, __e);
Eric Fiselierfb342382016-12-28 06:06:091351#if _LIBCPP_DEBUG_LEVEL >= 2
1352 __get_db()->__invalidate_all(this);
1353#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161354}
1355
1356template <class _Tp, class _Alloc>
1357void
1358list<_Tp, _Alloc>::assign(size_type __n, const value_type& __x)
1359{
1360 iterator __i = begin();
1361 iterator __e = end();
1362 for (; __n > 0 && __i != __e; --__n, ++__i)
1363 *__i = __x;
1364 if (__i == __e)
1365 insert(__e, __n, __x);
1366 else
1367 erase(__i, __e);
Eric Fiselierfb342382016-12-28 06:06:091368#if _LIBCPP_DEBUG_LEVEL >= 2
1369 __get_db()->__invalidate_all(this);
1370#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161371}
1372
1373template <class _Tp, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:551374inline
Howard Hinnantbc8d3f92010-05-11 19:42:161375_Alloc
Howard Hinnantc5607272011-06-03 17:30:281376list<_Tp, _Alloc>::get_allocator() const _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:161377{
1378 return allocator_type(base::__node_alloc());
1379}
1380
1381template <class _Tp, class _Alloc>
1382typename list<_Tp, _Alloc>::iterator
1383list<_Tp, _Alloc>::insert(const_iterator __p, const value_type& __x)
1384{
Howard Hinnant1c3ec6d2011-09-27 23:55:031385#if _LIBCPP_DEBUG_LEVEL >= 2
1386 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
1387 "list::insert(iterator, x) called with an iterator not"
1388 " referring to this list");
1389#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161390 __node_allocator& __na = base::__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501391 typedef __allocator_destructor<__node_allocator> _Dp;
1392 unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
Howard Hinnantbc8d3f92010-05-11 19:42:161393 __hold->__prev_ = 0;
Howard Hinnant0949eed2011-06-30 21:18:191394 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
Eric Fiselier5c74b482015-12-30 20:57:591395 __link_nodes(__p.__ptr_, __hold->__as_link(), __hold->__as_link());
Howard Hinnantbc8d3f92010-05-11 19:42:161396 ++base::__sz();
Howard Hinnant79a35572013-04-05 00:18:491397#if _LIBCPP_DEBUG_LEVEL >= 2
Eric Fiselier5c74b482015-12-30 20:57:591398 return iterator(__hold.release()->__as_link(), this);
Howard Hinnant79a35572013-04-05 00:18:491399#else
Eric Fiselier5c74b482015-12-30 20:57:591400 return iterator(__hold.release()->__as_link());
Howard Hinnant79a35572013-04-05 00:18:491401#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161402}
1403
1404template <class _Tp, class _Alloc>
1405typename list<_Tp, _Alloc>::iterator
1406list<_Tp, _Alloc>::insert(const_iterator __p, size_type __n, const value_type& __x)
1407{
Howard Hinnant1c3ec6d2011-09-27 23:55:031408#if _LIBCPP_DEBUG_LEVEL >= 2
1409 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
1410 "list::insert(iterator, n, x) called with an iterator not"
1411 " referring to this list");
Howard Hinnant29f74322013-06-25 16:08:471412 iterator __r(__p.__ptr_, this);
Howard Hinnant1c3ec6d2011-09-27 23:55:031413#else
Howard Hinnant29f74322013-06-25 16:08:471414 iterator __r(__p.__ptr_);
Howard Hinnant1c3ec6d2011-09-27 23:55:031415#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161416 if (__n > 0)
1417 {
1418 size_type __ds = 0;
1419 __node_allocator& __na = base::__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501420 typedef __allocator_destructor<__node_allocator> _Dp;
1421 unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
Howard Hinnantbc8d3f92010-05-11 19:42:161422 __hold->__prev_ = 0;
Howard Hinnant0949eed2011-06-30 21:18:191423 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
Howard Hinnantbc8d3f92010-05-11 19:42:161424 ++__ds;
Howard Hinnant1c3ec6d2011-09-27 23:55:031425#if _LIBCPP_DEBUG_LEVEL >= 2
Eric Fiselier5c74b482015-12-30 20:57:591426 __r = iterator(__hold->__as_link(), this);
Howard Hinnant1c3ec6d2011-09-27 23:55:031427#else
Eric Fiselier5c74b482015-12-30 20:57:591428 __r = iterator(__hold->__as_link());
Howard Hinnant1c3ec6d2011-09-27 23:55:031429#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161430 __hold.release();
1431 iterator __e = __r;
1432#ifndef _LIBCPP_NO_EXCEPTIONS
1433 try
1434 {
Howard Hinnant324bb032010-08-22 00:02:431435#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:161436 for (--__n; __n != 0; --__n, ++__e, ++__ds)
1437 {
1438 __hold.reset(__node_alloc_traits::allocate(__na, 1));
Howard Hinnant0949eed2011-06-30 21:18:191439 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
Eric Fiselier5c74b482015-12-30 20:57:591440 __e.__ptr_->__next_ = __hold->__as_link();
Howard Hinnantbc8d3f92010-05-11 19:42:161441 __hold->__prev_ = __e.__ptr_;
1442 __hold.release();
1443 }
1444#ifndef _LIBCPP_NO_EXCEPTIONS
1445 }
1446 catch (...)
1447 {
1448 while (true)
1449 {
Howard Hinnant0949eed2011-06-30 21:18:191450 __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
Eric Fiselier5c74b482015-12-30 20:57:591451 __link_pointer __prev = __e.__ptr_->__prev_;
1452 __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
Howard Hinnantbc8d3f92010-05-11 19:42:161453 if (__prev == 0)
1454 break;
Howard Hinnant1c3ec6d2011-09-27 23:55:031455#if _LIBCPP_DEBUG_LEVEL >= 2
1456 __e = iterator(__prev, this);
1457#else
Howard Hinnantbc8d3f92010-05-11 19:42:161458 __e = iterator(__prev);
Howard Hinnant1c3ec6d2011-09-27 23:55:031459#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161460 }
1461 throw;
1462 }
Howard Hinnant324bb032010-08-22 00:02:431463#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant29f74322013-06-25 16:08:471464 __link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_);
Howard Hinnantbc8d3f92010-05-11 19:42:161465 base::__sz() += __ds;
1466 }
1467 return __r;
1468}
1469
1470template <class _Tp, class _Alloc>
1471template <class _InpIter>
1472typename list<_Tp, _Alloc>::iterator
1473list<_Tp, _Alloc>::insert(const_iterator __p, _InpIter __f, _InpIter __l,
1474 typename enable_if<__is_input_iterator<_InpIter>::value>::type*)
1475{
Howard Hinnant1c3ec6d2011-09-27 23:55:031476#if _LIBCPP_DEBUG_LEVEL >= 2
1477 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
1478 "list::insert(iterator, range) called with an iterator not"
1479 " referring to this list");
Howard Hinnant29f74322013-06-25 16:08:471480 iterator __r(__p.__ptr_, this);
Howard Hinnant1c3ec6d2011-09-27 23:55:031481#else
Howard Hinnant29f74322013-06-25 16:08:471482 iterator __r(__p.__ptr_);
Howard Hinnant1c3ec6d2011-09-27 23:55:031483#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161484 if (__f != __l)
1485 {
1486 size_type __ds = 0;
1487 __node_allocator& __na = base::__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501488 typedef __allocator_destructor<__node_allocator> _Dp;
1489 unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
Howard Hinnantbc8d3f92010-05-11 19:42:161490 __hold->__prev_ = 0;
Howard Hinnant0949eed2011-06-30 21:18:191491 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f);
Howard Hinnantbc8d3f92010-05-11 19:42:161492 ++__ds;
Howard Hinnant1c3ec6d2011-09-27 23:55:031493#if _LIBCPP_DEBUG_LEVEL >= 2
Eric Fiselier5c74b482015-12-30 20:57:591494 __r = iterator(__hold.get()->__as_link(), this);
Howard Hinnant1c3ec6d2011-09-27 23:55:031495#else
Eric Fiselier5c74b482015-12-30 20:57:591496 __r = iterator(__hold.get()->__as_link());
Howard Hinnant1c3ec6d2011-09-27 23:55:031497#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161498 __hold.release();
1499 iterator __e = __r;
1500#ifndef _LIBCPP_NO_EXCEPTIONS
1501 try
1502 {
Howard Hinnant324bb032010-08-22 00:02:431503#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier537876b2015-03-19 03:20:021504 for (++__f; __f != __l; ++__f, (void) ++__e, (void) ++__ds)
Howard Hinnantbc8d3f92010-05-11 19:42:161505 {
1506 __hold.reset(__node_alloc_traits::allocate(__na, 1));
Howard Hinnant0949eed2011-06-30 21:18:191507 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f);
Eric Fiselier5c74b482015-12-30 20:57:591508 __e.__ptr_->__next_ = __hold.get()->__as_link();
Howard Hinnantbc8d3f92010-05-11 19:42:161509 __hold->__prev_ = __e.__ptr_;
1510 __hold.release();
1511 }
1512#ifndef _LIBCPP_NO_EXCEPTIONS
1513 }
1514 catch (...)
1515 {
1516 while (true)
1517 {
Howard Hinnant0949eed2011-06-30 21:18:191518 __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
Eric Fiselier5c74b482015-12-30 20:57:591519 __link_pointer __prev = __e.__ptr_->__prev_;
1520 __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
Howard Hinnantbc8d3f92010-05-11 19:42:161521 if (__prev == 0)
1522 break;
Howard Hinnant1c3ec6d2011-09-27 23:55:031523#if _LIBCPP_DEBUG_LEVEL >= 2
1524 __e = iterator(__prev, this);
1525#else
Howard Hinnantbc8d3f92010-05-11 19:42:161526 __e = iterator(__prev);
Howard Hinnant1c3ec6d2011-09-27 23:55:031527#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161528 }
1529 throw;
1530 }
Howard Hinnant324bb032010-08-22 00:02:431531#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant29f74322013-06-25 16:08:471532 __link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_);
Howard Hinnantbc8d3f92010-05-11 19:42:161533 base::__sz() += __ds;
1534 }
1535 return __r;
1536}
1537
1538template <class _Tp, class _Alloc>
1539void
1540list<_Tp, _Alloc>::push_front(const value_type& __x)
1541{
1542 __node_allocator& __na = base::__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501543 typedef __allocator_destructor<__node_allocator> _Dp;
1544 unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
Howard Hinnant0949eed2011-06-30 21:18:191545 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
Eric Fiselier5c74b482015-12-30 20:57:591546 __link_pointer __nl = __hold->__as_link();
1547 __link_nodes_at_front(__nl, __nl);
Howard Hinnantbc8d3f92010-05-11 19:42:161548 ++base::__sz();
1549 __hold.release();
1550}
1551
1552template <class _Tp, class _Alloc>
1553void
1554list<_Tp, _Alloc>::push_back(const value_type& __x)
1555{
1556 __node_allocator& __na = base::__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501557 typedef __allocator_destructor<__node_allocator> _Dp;
1558 unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
Howard Hinnant0949eed2011-06-30 21:18:191559 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
Eric Fiselier5c74b482015-12-30 20:57:591560 __link_nodes_at_back(__hold.get()->__as_link(), __hold.get()->__as_link());
Howard Hinnantbc8d3f92010-05-11 19:42:161561 ++base::__sz();
1562 __hold.release();
1563}
1564
Eric Fiselier55ff80e2017-04-16 03:45:351565#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:161566
1567template <class _Tp, class _Alloc>
1568void
1569list<_Tp, _Alloc>::push_front(value_type&& __x)
1570{
1571 __node_allocator& __na = base::__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501572 typedef __allocator_destructor<__node_allocator> _Dp;
1573 unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
Howard Hinnant0949eed2011-06-30 21:18:191574 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
Eric Fiselier5c74b482015-12-30 20:57:591575 __link_nodes_at_front(__hold.get()->__as_link(), __hold.get()->__as_link());
Howard Hinnantbc8d3f92010-05-11 19:42:161576 ++base::__sz();
1577 __hold.release();
1578}
1579
1580template <class _Tp, class _Alloc>
1581void
1582list<_Tp, _Alloc>::push_back(value_type&& __x)
1583{
1584 __node_allocator& __na = base::__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501585 typedef __allocator_destructor<__node_allocator> _Dp;
1586 unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
Howard Hinnant0949eed2011-06-30 21:18:191587 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
Eric Fiselier5c74b482015-12-30 20:57:591588 __link_nodes_at_back(__hold.get()->__as_link(), __hold.get()->__as_link());
Howard Hinnantbc8d3f92010-05-11 19:42:161589 ++base::__sz();
1590 __hold.release();
1591}
1592
Howard Hinnantbc8d3f92010-05-11 19:42:161593template <class _Tp, class _Alloc>
1594template <class... _Args>
Marshall Clow4e42dc92017-01-24 23:09:121595#if _LIBCPP_STD_VER > 14
Eric Fiselier3816ef92016-07-21 03:20:171596typename list<_Tp, _Alloc>::reference
Marshall Clow4e42dc92017-01-24 23:09:121597#else
1598void
1599#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161600list<_Tp, _Alloc>::emplace_front(_Args&&... __args)
1601{
1602 __node_allocator& __na = base::__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501603 typedef __allocator_destructor<__node_allocator> _Dp;
1604 unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
Howard Hinnant0949eed2011-06-30 21:18:191605 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
Eric Fiselier5c74b482015-12-30 20:57:591606 __link_nodes_at_front(__hold.get()->__as_link(), __hold.get()->__as_link());
Howard Hinnantbc8d3f92010-05-11 19:42:161607 ++base::__sz();
Marshall Clow4e42dc92017-01-24 23:09:121608#if _LIBCPP_STD_VER > 14
Eric Fiselier3816ef92016-07-21 03:20:171609 return __hold.release()->__value_;
Marshall Clow4e42dc92017-01-24 23:09:121610#else
1611 __hold.release();
1612#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161613}
1614
1615template <class _Tp, class _Alloc>
1616template <class... _Args>
Marshall Clow4e42dc92017-01-24 23:09:121617#if _LIBCPP_STD_VER > 14
Eric Fiselier3816ef92016-07-21 03:20:171618typename list<_Tp, _Alloc>::reference
Marshall Clow4e42dc92017-01-24 23:09:121619#else
1620void
1621#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161622list<_Tp, _Alloc>::emplace_back(_Args&&... __args)
1623{
1624 __node_allocator& __na = base::__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501625 typedef __allocator_destructor<__node_allocator> _Dp;
1626 unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
Howard Hinnant0949eed2011-06-30 21:18:191627 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
Eric Fiselier5c74b482015-12-30 20:57:591628 __link_pointer __nl = __hold->__as_link();
1629 __link_nodes_at_back(__nl, __nl);
Howard Hinnantbc8d3f92010-05-11 19:42:161630 ++base::__sz();
Marshall Clow4e42dc92017-01-24 23:09:121631#if _LIBCPP_STD_VER > 14
Eric Fiselier3816ef92016-07-21 03:20:171632 return __hold.release()->__value_;
Marshall Clow4e42dc92017-01-24 23:09:121633#else
1634 __hold.release();
1635#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161636}
1637
1638template <class _Tp, class _Alloc>
1639template <class... _Args>
1640typename list<_Tp, _Alloc>::iterator
1641list<_Tp, _Alloc>::emplace(const_iterator __p, _Args&&... __args)
1642{
Howard Hinnant79a35572013-04-05 00:18:491643#if _LIBCPP_DEBUG_LEVEL >= 2
1644 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
1645 "list::emplace(iterator, args...) called with an iterator not"
1646 " referring to this list");
1647#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161648 __node_allocator& __na = base::__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501649 typedef __allocator_destructor<__node_allocator> _Dp;
1650 unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
Howard Hinnantbc8d3f92010-05-11 19:42:161651 __hold->__prev_ = 0;
Howard Hinnant0949eed2011-06-30 21:18:191652 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...);
Eric Fiselier5c74b482015-12-30 20:57:591653 __link_pointer __nl = __hold.get()->__as_link();
1654 __link_nodes(__p.__ptr_, __nl, __nl);
Howard Hinnantbc8d3f92010-05-11 19:42:161655 ++base::__sz();
Eric Fiselier5c74b482015-12-30 20:57:591656 __hold.release();
Howard Hinnant1c3ec6d2011-09-27 23:55:031657#if _LIBCPP_DEBUG_LEVEL >= 2
Eric Fiselier5c74b482015-12-30 20:57:591658 return iterator(__nl, this);
Howard Hinnant1c3ec6d2011-09-27 23:55:031659#else
Eric Fiselier5c74b482015-12-30 20:57:591660 return iterator(__nl);
Howard Hinnant1c3ec6d2011-09-27 23:55:031661#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161662}
1663
Howard Hinnantbc8d3f92010-05-11 19:42:161664template <class _Tp, class _Alloc>
1665typename list<_Tp, _Alloc>::iterator
1666list<_Tp, _Alloc>::insert(const_iterator __p, value_type&& __x)
1667{
Howard Hinnant1c3ec6d2011-09-27 23:55:031668#if _LIBCPP_DEBUG_LEVEL >= 2
1669 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
1670 "list::insert(iterator, x) called with an iterator not"
1671 " referring to this list");
1672#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161673 __node_allocator& __na = base::__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501674 typedef __allocator_destructor<__node_allocator> _Dp;
1675 unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
Howard Hinnantbc8d3f92010-05-11 19:42:161676 __hold->__prev_ = 0;
Howard Hinnant0949eed2011-06-30 21:18:191677 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x));
Eric Fiselier5c74b482015-12-30 20:57:591678 __link_pointer __nl = __hold->__as_link();
1679 __link_nodes(__p.__ptr_, __nl, __nl);
Howard Hinnantbc8d3f92010-05-11 19:42:161680 ++base::__sz();
Eric Fiselier5c74b482015-12-30 20:57:591681 __hold.release();
Howard Hinnant1c3ec6d2011-09-27 23:55:031682#if _LIBCPP_DEBUG_LEVEL >= 2
Eric Fiselier5c74b482015-12-30 20:57:591683 return iterator(__nl, this);
Howard Hinnant1c3ec6d2011-09-27 23:55:031684#else
Eric Fiselier5c74b482015-12-30 20:57:591685 return iterator(__nl);
Howard Hinnant1c3ec6d2011-09-27 23:55:031686#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161687}
1688
Eric Fiselier55ff80e2017-04-16 03:45:351689#endif // _LIBCPP_CXX03_LANG
Howard Hinnantbc8d3f92010-05-11 19:42:161690
1691template <class _Tp, class _Alloc>
1692void
1693list<_Tp, _Alloc>::pop_front()
1694{
Howard Hinnant1c3ec6d2011-09-27 23:55:031695 _LIBCPP_ASSERT(!empty(), "list::pop_front() called with empty list");
Howard Hinnantbc8d3f92010-05-11 19:42:161696 __node_allocator& __na = base::__node_alloc();
Eric Fiselier5c74b482015-12-30 20:57:591697 __link_pointer __n = base::__end_.__next_;
Howard Hinnantbc8d3f92010-05-11 19:42:161698 base::__unlink_nodes(__n, __n);
1699 --base::__sz();
Howard Hinnant1c3ec6d2011-09-27 23:55:031700#if _LIBCPP_DEBUG_LEVEL >= 2
1701 __c_node* __c = __get_db()->__find_c_and_lock(this);
1702 for (__i_node** __p = __c->end_; __p != __c->beg_; )
1703 {
1704 --__p;
1705 iterator* __i = static_cast<iterator*>((*__p)->__i_);
Howard Hinnant29f74322013-06-25 16:08:471706 if (__i->__ptr_ == __n)
Howard Hinnant1c3ec6d2011-09-27 23:55:031707 {
1708 (*__p)->__c_ = nullptr;
1709 if (--__c->end_ != __p)
1710 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
1711 }
1712 }
1713 __get_db()->unlock();
1714#endif
Eric Fiselier5c74b482015-12-30 20:57:591715 __node_pointer __np = __n->__as_node();
1716 __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
1717 __node_alloc_traits::deallocate(__na, __np, 1);
Howard Hinnantbc8d3f92010-05-11 19:42:161718}
1719
1720template <class _Tp, class _Alloc>
1721void
1722list<_Tp, _Alloc>::pop_back()
1723{
Dmitri Gribenkoc7a39cf2013-06-24 06:15:571724 _LIBCPP_ASSERT(!empty(), "list::pop_back() called with empty list");
Howard Hinnantbc8d3f92010-05-11 19:42:161725 __node_allocator& __na = base::__node_alloc();
Eric Fiselier5c74b482015-12-30 20:57:591726 __link_pointer __n = base::__end_.__prev_;
Howard Hinnantbc8d3f92010-05-11 19:42:161727 base::__unlink_nodes(__n, __n);
1728 --base::__sz();
Howard Hinnant1c3ec6d2011-09-27 23:55:031729#if _LIBCPP_DEBUG_LEVEL >= 2
1730 __c_node* __c = __get_db()->__find_c_and_lock(this);
1731 for (__i_node** __p = __c->end_; __p != __c->beg_; )
1732 {
1733 --__p;
1734 iterator* __i = static_cast<iterator*>((*__p)->__i_);
Howard Hinnant29f74322013-06-25 16:08:471735 if (__i->__ptr_ == __n)
Howard Hinnant1c3ec6d2011-09-27 23:55:031736 {
1737 (*__p)->__c_ = nullptr;
1738 if (--__c->end_ != __p)
1739 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
1740 }
1741 }
1742 __get_db()->unlock();
1743#endif
Eric Fiselier5c74b482015-12-30 20:57:591744 __node_pointer __np = __n->__as_node();
1745 __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
1746 __node_alloc_traits::deallocate(__na, __np, 1);
Howard Hinnantbc8d3f92010-05-11 19:42:161747}
1748
1749template <class _Tp, class _Alloc>
1750typename list<_Tp, _Alloc>::iterator
1751list<_Tp, _Alloc>::erase(const_iterator __p)
1752{
Howard Hinnant1c3ec6d2011-09-27 23:55:031753#if _LIBCPP_DEBUG_LEVEL >= 2
1754 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
1755 "list::erase(iterator) called with an iterator not"
1756 " referring to this list");
1757#endif
Howard Hinnant79a35572013-04-05 00:18:491758 _LIBCPP_ASSERT(__p != end(),
1759 "list::erase(iterator) called with a non-dereferenceable iterator");
Howard Hinnantbc8d3f92010-05-11 19:42:161760 __node_allocator& __na = base::__node_alloc();
Eric Fiselier5c74b482015-12-30 20:57:591761 __link_pointer __n = __p.__ptr_;
1762 __link_pointer __r = __n->__next_;
Howard Hinnantbc8d3f92010-05-11 19:42:161763 base::__unlink_nodes(__n, __n);
1764 --base::__sz();
Howard Hinnant1c3ec6d2011-09-27 23:55:031765#if _LIBCPP_DEBUG_LEVEL >= 2
1766 __c_node* __c = __get_db()->__find_c_and_lock(this);
Eric Fiselier1e836f02016-10-23 19:26:391767 for (__i_node** __ip = __c->end_; __ip != __c->beg_; )
Howard Hinnant1c3ec6d2011-09-27 23:55:031768 {
Eric Fiselier1e836f02016-10-23 19:26:391769 --__ip;
1770 iterator* __i = static_cast<iterator*>((*__ip)->__i_);
Howard Hinnant29f74322013-06-25 16:08:471771 if (__i->__ptr_ == __n)
Howard Hinnant1c3ec6d2011-09-27 23:55:031772 {
Eric Fiselier1e836f02016-10-23 19:26:391773 (*__ip)->__c_ = nullptr;
1774 if (--__c->end_ != __ip)
1775 memmove(__ip, __ip+1, (__c->end_ - __ip)*sizeof(__i_node*));
Howard Hinnant1c3ec6d2011-09-27 23:55:031776 }
1777 }
1778 __get_db()->unlock();
1779#endif
Eric Fiselier5c74b482015-12-30 20:57:591780 __node_pointer __np = __n->__as_node();
1781 __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
1782 __node_alloc_traits::deallocate(__na, __np, 1);
Howard Hinnant1c3ec6d2011-09-27 23:55:031783#if _LIBCPP_DEBUG_LEVEL >= 2
1784 return iterator(__r, this);
1785#else
Howard Hinnantbc8d3f92010-05-11 19:42:161786 return iterator(__r);
Howard Hinnant1c3ec6d2011-09-27 23:55:031787#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161788}
1789
1790template <class _Tp, class _Alloc>
1791typename list<_Tp, _Alloc>::iterator
1792list<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l)
1793{
Howard Hinnant1c3ec6d2011-09-27 23:55:031794#if _LIBCPP_DEBUG_LEVEL >= 2
1795 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__f) == this,
1796 "list::erase(iterator, iterator) called with an iterator not"
1797 " referring to this list");
Eric Fiselierfb342382016-12-28 06:06:091798 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__l) == this,
1799 "list::erase(iterator, iterator) called with an iterator not"
1800 " referring to this list");
Howard Hinnant1c3ec6d2011-09-27 23:55:031801#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161802 if (__f != __l)
1803 {
1804 __node_allocator& __na = base::__node_alloc();
Howard Hinnant29f74322013-06-25 16:08:471805 base::__unlink_nodes(__f.__ptr_, __l.__ptr_->__prev_);
Howard Hinnantbc8d3f92010-05-11 19:42:161806 while (__f != __l)
1807 {
Eric Fiselier5c74b482015-12-30 20:57:591808 __link_pointer __n = __f.__ptr_;
Howard Hinnantbc8d3f92010-05-11 19:42:161809 ++__f;
1810 --base::__sz();
Howard Hinnant1c3ec6d2011-09-27 23:55:031811#if _LIBCPP_DEBUG_LEVEL >= 2
1812 __c_node* __c = __get_db()->__find_c_and_lock(this);
1813 for (__i_node** __p = __c->end_; __p != __c->beg_; )
1814 {
1815 --__p;
1816 iterator* __i = static_cast<iterator*>((*__p)->__i_);
Howard Hinnant29f74322013-06-25 16:08:471817 if (__i->__ptr_ == __n)
Howard Hinnant1c3ec6d2011-09-27 23:55:031818 {
1819 (*__p)->__c_ = nullptr;
1820 if (--__c->end_ != __p)
1821 memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
1822 }
1823 }
1824 __get_db()->unlock();
1825#endif
Eric Fiselier5c74b482015-12-30 20:57:591826 __node_pointer __np = __n->__as_node();
1827 __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_));
1828 __node_alloc_traits::deallocate(__na, __np, 1);
Howard Hinnantbc8d3f92010-05-11 19:42:161829 }
1830 }
Howard Hinnant1c3ec6d2011-09-27 23:55:031831#if _LIBCPP_DEBUG_LEVEL >= 2
Howard Hinnant29f74322013-06-25 16:08:471832 return iterator(__l.__ptr_, this);
Howard Hinnant1c3ec6d2011-09-27 23:55:031833#else
Howard Hinnant29f74322013-06-25 16:08:471834 return iterator(__l.__ptr_);
Howard Hinnant1c3ec6d2011-09-27 23:55:031835#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161836}
1837
1838template <class _Tp, class _Alloc>
1839void
1840list<_Tp, _Alloc>::resize(size_type __n)
1841{
1842 if (__n < base::__sz())
1843 erase(__iterator(__n), end());
1844 else if (__n > base::__sz())
1845 {
1846 __n -= base::__sz();
1847 size_type __ds = 0;
1848 __node_allocator& __na = base::__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501849 typedef __allocator_destructor<__node_allocator> _Dp;
1850 unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
Howard Hinnantbc8d3f92010-05-11 19:42:161851 __hold->__prev_ = 0;
Howard Hinnant0949eed2011-06-30 21:18:191852 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_));
Howard Hinnantbc8d3f92010-05-11 19:42:161853 ++__ds;
Howard Hinnant1c3ec6d2011-09-27 23:55:031854#if _LIBCPP_DEBUG_LEVEL >= 2
Eric Fiselier5c74b482015-12-30 20:57:591855 iterator __r = iterator(__hold.release()->__as_link(), this);
Howard Hinnant1c3ec6d2011-09-27 23:55:031856#else
Eric Fiselier5c74b482015-12-30 20:57:591857 iterator __r = iterator(__hold.release()->__as_link());
Howard Hinnant1c3ec6d2011-09-27 23:55:031858#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161859 iterator __e = __r;
1860#ifndef _LIBCPP_NO_EXCEPTIONS
1861 try
1862 {
Howard Hinnant324bb032010-08-22 00:02:431863#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:161864 for (--__n; __n != 0; --__n, ++__e, ++__ds)
1865 {
1866 __hold.reset(__node_alloc_traits::allocate(__na, 1));
Howard Hinnant0949eed2011-06-30 21:18:191867 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_));
Eric Fiselier5c74b482015-12-30 20:57:591868 __e.__ptr_->__next_ = __hold.get()->__as_link();
Howard Hinnantbc8d3f92010-05-11 19:42:161869 __hold->__prev_ = __e.__ptr_;
1870 __hold.release();
1871 }
1872#ifndef _LIBCPP_NO_EXCEPTIONS
1873 }
1874 catch (...)
1875 {
1876 while (true)
1877 {
Howard Hinnant0949eed2011-06-30 21:18:191878 __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
Eric Fiselier5c74b482015-12-30 20:57:591879 __link_pointer __prev = __e.__ptr_->__prev_;
1880 __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
Howard Hinnantbc8d3f92010-05-11 19:42:161881 if (__prev == 0)
1882 break;
Howard Hinnant1c3ec6d2011-09-27 23:55:031883#if _LIBCPP_DEBUG_LEVEL >= 2
1884 __e = iterator(__prev, this);
1885#else
Howard Hinnantbc8d3f92010-05-11 19:42:161886 __e = iterator(__prev);
Howard Hinnant1c3ec6d2011-09-27 23:55:031887#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161888 }
1889 throw;
1890 }
Howard Hinnant324bb032010-08-22 00:02:431891#endif // _LIBCPP_NO_EXCEPTIONS
Marshall Clowea8ed832014-08-05 01:34:121892 __link_nodes_at_back(__r.__ptr_, __e.__ptr_);
Howard Hinnantbc8d3f92010-05-11 19:42:161893 base::__sz() += __ds;
1894 }
1895}
1896
1897template <class _Tp, class _Alloc>
1898void
1899list<_Tp, _Alloc>::resize(size_type __n, const value_type& __x)
1900{
1901 if (__n < base::__sz())
1902 erase(__iterator(__n), end());
1903 else if (__n > base::__sz())
1904 {
1905 __n -= base::__sz();
1906 size_type __ds = 0;
1907 __node_allocator& __na = base::__node_alloc();
Howard Hinnant99968442011-11-29 18:15:501908 typedef __allocator_destructor<__node_allocator> _Dp;
1909 unique_ptr<__node, _Dp> __hold(__node_alloc_traits::allocate(__na, 1), _Dp(__na, 1));
Howard Hinnantbc8d3f92010-05-11 19:42:161910 __hold->__prev_ = 0;
Howard Hinnant0949eed2011-06-30 21:18:191911 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
Howard Hinnantbc8d3f92010-05-11 19:42:161912 ++__ds;
Eric Fiselier5c74b482015-12-30 20:57:591913 __link_pointer __nl = __hold.release()->__as_link();
Howard Hinnant1c3ec6d2011-09-27 23:55:031914#if _LIBCPP_DEBUG_LEVEL >= 2
Eric Fiselier5c74b482015-12-30 20:57:591915 iterator __r = iterator(__nl, this);
Howard Hinnant1c3ec6d2011-09-27 23:55:031916#else
Eric Fiselier5c74b482015-12-30 20:57:591917 iterator __r = iterator(__nl);
Howard Hinnant1c3ec6d2011-09-27 23:55:031918#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161919 iterator __e = __r;
1920#ifndef _LIBCPP_NO_EXCEPTIONS
1921 try
1922 {
Howard Hinnant324bb032010-08-22 00:02:431923#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:161924 for (--__n; __n != 0; --__n, ++__e, ++__ds)
1925 {
1926 __hold.reset(__node_alloc_traits::allocate(__na, 1));
Howard Hinnant0949eed2011-06-30 21:18:191927 __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x);
Eric Fiselier5c74b482015-12-30 20:57:591928 __e.__ptr_->__next_ = __hold.get()->__as_link();
Howard Hinnantbc8d3f92010-05-11 19:42:161929 __hold->__prev_ = __e.__ptr_;
1930 __hold.release();
1931 }
1932#ifndef _LIBCPP_NO_EXCEPTIONS
1933 }
1934 catch (...)
1935 {
1936 while (true)
1937 {
Howard Hinnant0949eed2011-06-30 21:18:191938 __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e));
Eric Fiselier5c74b482015-12-30 20:57:591939 __link_pointer __prev = __e.__ptr_->__prev_;
1940 __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1);
Howard Hinnantbc8d3f92010-05-11 19:42:161941 if (__prev == 0)
1942 break;
Howard Hinnant1c3ec6d2011-09-27 23:55:031943#if _LIBCPP_DEBUG_LEVEL >= 2
1944 __e = iterator(__prev, this);
1945#else
Howard Hinnantbc8d3f92010-05-11 19:42:161946 __e = iterator(__prev);
Howard Hinnant1c3ec6d2011-09-27 23:55:031947#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161948 }
1949 throw;
1950 }
Howard Hinnant324bb032010-08-22 00:02:431951#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier8e7bd4f2016-01-04 03:27:521952 __link_nodes(base::__end_as_link(), __r.__ptr_, __e.__ptr_);
Howard Hinnantbc8d3f92010-05-11 19:42:161953 base::__sz() += __ds;
Howard Hinnant324bb032010-08-22 00:02:431954 }
Howard Hinnantbc8d3f92010-05-11 19:42:161955}
1956
1957template <class _Tp, class _Alloc>
1958void
1959list<_Tp, _Alloc>::splice(const_iterator __p, list& __c)
1960{
Howard Hinnant1c3ec6d2011-09-27 23:55:031961 _LIBCPP_ASSERT(this != &__c,
1962 "list::splice(iterator, list) called with this == &list");
1963#if _LIBCPP_DEBUG_LEVEL >= 2
1964 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
1965 "list::splice(iterator, list) called with an iterator not"
1966 " referring to this list");
1967#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161968 if (!__c.empty())
1969 {
Eric Fiselier5c74b482015-12-30 20:57:591970 __link_pointer __f = __c.__end_.__next_;
1971 __link_pointer __l = __c.__end_.__prev_;
Howard Hinnantbc8d3f92010-05-11 19:42:161972 base::__unlink_nodes(__f, __l);
Howard Hinnant29f74322013-06-25 16:08:471973 __link_nodes(__p.__ptr_, __f, __l);
Howard Hinnantbc8d3f92010-05-11 19:42:161974 base::__sz() += __c.__sz();
1975 __c.__sz() = 0;
Howard Hinnant1c3ec6d2011-09-27 23:55:031976#if _LIBCPP_DEBUG_LEVEL >= 2
1977 __libcpp_db* __db = __get_db();
1978 __c_node* __cn1 = __db->__find_c_and_lock(this);
1979 __c_node* __cn2 = __db->__find_c(&__c);
Eric Fiselier1e836f02016-10-23 19:26:391980 for (__i_node** __ip = __cn2->end_; __ip != __cn2->beg_;)
Howard Hinnant1c3ec6d2011-09-27 23:55:031981 {
Eric Fiselier1e836f02016-10-23 19:26:391982 --__ip;
1983 iterator* __i = static_cast<iterator*>((*__ip)->__i_);
Eric Fiselier8e7bd4f2016-01-04 03:27:521984 if (__i->__ptr_ != __c.__end_as_link())
Howard Hinnant1c3ec6d2011-09-27 23:55:031985 {
Eric Fiselier1e836f02016-10-23 19:26:391986 __cn1->__add(*__ip);
1987 (*__ip)->__c_ = __cn1;
1988 if (--__cn2->end_ != __ip)
1989 memmove(__ip, __ip+1, (__cn2->end_ - __ip)*sizeof(__i_node*));
Howard Hinnant1c3ec6d2011-09-27 23:55:031990 }
1991 }
1992 __db->unlock();
1993#endif
Howard Hinnantbc8d3f92010-05-11 19:42:161994 }
1995}
1996
1997template <class _Tp, class _Alloc>
1998void
1999list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __i)
2000{
Howard Hinnant1c3ec6d2011-09-27 23:55:032001#if _LIBCPP_DEBUG_LEVEL >= 2
2002 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
2003 "list::splice(iterator, list, iterator) called with first iterator not"
2004 " referring to this list");
2005 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__i) == &__c,
2006 "list::splice(iterator, list, iterator) called with second iterator not"
2007 " referring to list argument");
2008 _LIBCPP_ASSERT(__get_const_db()->__dereferenceable(&__i),
2009 "list::splice(iterator, list, iterator) called with second iterator not"
2010 " derefereceable");
2011#endif
2012 if (__p.__ptr_ != __i.__ptr_ && __p.__ptr_ != __i.__ptr_->__next_)
Howard Hinnantbc8d3f92010-05-11 19:42:162013 {
Eric Fiselier5c74b482015-12-30 20:57:592014 __link_pointer __f = __i.__ptr_;
Howard Hinnantbc8d3f92010-05-11 19:42:162015 base::__unlink_nodes(__f, __f);
Howard Hinnant29f74322013-06-25 16:08:472016 __link_nodes(__p.__ptr_, __f, __f);
Howard Hinnantbc8d3f92010-05-11 19:42:162017 --__c.__sz();
2018 ++base::__sz();
Howard Hinnant1c3ec6d2011-09-27 23:55:032019#if _LIBCPP_DEBUG_LEVEL >= 2
2020 __libcpp_db* __db = __get_db();
2021 __c_node* __cn1 = __db->__find_c_and_lock(this);
2022 __c_node* __cn2 = __db->__find_c(&__c);
Eric Fiselier1e836f02016-10-23 19:26:392023 for (__i_node** __ip = __cn2->end_; __ip != __cn2->beg_;)
Howard Hinnant1c3ec6d2011-09-27 23:55:032024 {
Eric Fiselier1e836f02016-10-23 19:26:392025 --__ip;
2026 iterator* __j = static_cast<iterator*>((*__ip)->__i_);
Howard Hinnant29f74322013-06-25 16:08:472027 if (__j->__ptr_ == __f)
Howard Hinnant1c3ec6d2011-09-27 23:55:032028 {
Eric Fiselier1e836f02016-10-23 19:26:392029 __cn1->__add(*__ip);
2030 (*__ip)->__c_ = __cn1;
2031 if (--__cn2->end_ != __ip)
2032 memmove(__ip, __ip+1, (__cn2->end_ - __ip)*sizeof(__i_node*));
Howard Hinnant1c3ec6d2011-09-27 23:55:032033 }
2034 }
2035 __db->unlock();
2036#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162037 }
2038}
2039
2040template <class _Tp, class _Alloc>
2041void
2042list<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __f, const_iterator __l)
2043{
Howard Hinnant1c3ec6d2011-09-27 23:55:032044#if _LIBCPP_DEBUG_LEVEL >= 2
2045 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
2046 "list::splice(iterator, list, iterator, iterator) called with first iterator not"
2047 " referring to this list");
2048 _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__f) == &__c,
2049 "list::splice(iterator, list, iterator, iterator) called with second iterator not"
2050 " referring to list argument");
2051 if (this == &__c)
2052 {
2053 for (const_iterator __i = __f; __i != __l; ++__i)
2054 _LIBCPP_ASSERT(__i != __p,
2055 "list::splice(iterator, list, iterator, iterator)"
2056 " called with the first iterator within the range"
2057 " of the second and third iterators");
2058 }
2059#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162060 if (__f != __l)
2061 {
2062 if (this != &__c)
2063 {
Howard Hinnant0949eed2011-06-30 21:18:192064 size_type __s = _VSTD::distance(__f, __l);
Howard Hinnantbc8d3f92010-05-11 19:42:162065 __c.__sz() -= __s;
2066 base::__sz() += __s;
2067 }
Eric Fiselier5c74b482015-12-30 20:57:592068 __link_pointer __first = __f.__ptr_;
Howard Hinnantbc8d3f92010-05-11 19:42:162069 --__l;
Eric Fiselier5c74b482015-12-30 20:57:592070 __link_pointer __last = __l.__ptr_;
Howard Hinnantbc8d3f92010-05-11 19:42:162071 base::__unlink_nodes(__first, __last);
Howard Hinnant29f74322013-06-25 16:08:472072 __link_nodes(__p.__ptr_, __first, __last);
Howard Hinnant1c3ec6d2011-09-27 23:55:032073#if _LIBCPP_DEBUG_LEVEL >= 2
2074 __libcpp_db* __db = __get_db();
2075 __c_node* __cn1 = __db->__find_c_and_lock(this);
2076 __c_node* __cn2 = __db->__find_c(&__c);
Eric Fiselier1e836f02016-10-23 19:26:392077 for (__i_node** __ip = __cn2->end_; __ip != __cn2->beg_;)
Howard Hinnant1c3ec6d2011-09-27 23:55:032078 {
Eric Fiselier1e836f02016-10-23 19:26:392079 --__ip;
2080 iterator* __j = static_cast<iterator*>((*__ip)->__i_);
Eric Fiselier5c74b482015-12-30 20:57:592081 for (__link_pointer __k = __f.__ptr_;
Howard Hinnant1c3ec6d2011-09-27 23:55:032082 __k != __l.__ptr_; __k = __k->__next_)
2083 {
2084 if (__j->__ptr_ == __k)
2085 {
Eric Fiselier1e836f02016-10-23 19:26:392086 __cn1->__add(*__ip);
2087 (*__ip)->__c_ = __cn1;
2088 if (--__cn2->end_ != __ip)
2089 memmove(__ip, __ip+1, (__cn2->end_ - __ip)*sizeof(__i_node*));
Howard Hinnant1c3ec6d2011-09-27 23:55:032090 }
2091 }
2092 }
2093 __db->unlock();
2094#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162095 }
2096}
2097
2098template <class _Tp, class _Alloc>
2099void
2100list<_Tp, _Alloc>::remove(const value_type& __x)
2101{
Eric Fiselierbad1d6c2016-12-14 22:48:382102 list<_Tp, _Alloc> __deleted_nodes(get_allocator()); // collect the nodes we're removing
Marshall Clowfca038e2014-08-08 15:35:522103 for (const_iterator __i = begin(), __e = end(); __i != __e;)
Howard Hinnantbc8d3f92010-05-11 19:42:162104 {
2105 if (*__i == __x)
2106 {
Marshall Clowfca038e2014-08-08 15:35:522107 const_iterator __j = _VSTD::next(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:162108 for (; __j != __e && *__j == __x; ++__j)
2109 ;
Marshall Clowfca038e2014-08-08 15:35:522110 __deleted_nodes.splice(__deleted_nodes.end(), *this, __i, __j);
2111 __i = __j;
Marshall Clowf0f1bca2014-08-04 17:32:252112 if (__i != __e)
Marshall Clowea8ed832014-08-05 01:34:122113 ++__i;
Howard Hinnantbc8d3f92010-05-11 19:42:162114 }
2115 else
2116 ++__i;
2117 }
2118}
2119
2120template <class _Tp, class _Alloc>
2121template <class _Pred>
2122void
2123list<_Tp, _Alloc>::remove_if(_Pred __pred)
2124{
2125 for (iterator __i = begin(), __e = end(); __i != __e;)
2126 {
2127 if (__pred(*__i))
2128 {
Howard Hinnant0949eed2011-06-30 21:18:192129 iterator __j = _VSTD::next(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:162130 for (; __j != __e && __pred(*__j); ++__j)
2131 ;
2132 __i = erase(__i, __j);
Marshall Clowf0f1bca2014-08-04 17:32:252133 if (__i != __e)
Marshall Clowea8ed832014-08-05 01:34:122134 ++__i;
Howard Hinnantbc8d3f92010-05-11 19:42:162135 }
2136 else
2137 ++__i;
2138 }
2139}
2140
2141template <class _Tp, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:552142inline
Howard Hinnantbc8d3f92010-05-11 19:42:162143void
2144list<_Tp, _Alloc>::unique()
2145{
2146 unique(__equal_to<value_type>());
2147}
2148
2149template <class _Tp, class _Alloc>
2150template <class _BinaryPred>
2151void
2152list<_Tp, _Alloc>::unique(_BinaryPred __binary_pred)
2153{
2154 for (iterator __i = begin(), __e = end(); __i != __e;)
2155 {
Howard Hinnant0949eed2011-06-30 21:18:192156 iterator __j = _VSTD::next(__i);
Howard Hinnantbc8d3f92010-05-11 19:42:162157 for (; __j != __e && __binary_pred(*__i, *__j); ++__j)
2158 ;
2159 if (++__i != __j)
2160 __i = erase(__i, __j);
2161 }
2162}
2163
2164template <class _Tp, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:552165inline
Howard Hinnantbc8d3f92010-05-11 19:42:162166void
2167list<_Tp, _Alloc>::merge(list& __c)
2168{
2169 merge(__c, __less<value_type>());
2170}
2171
2172template <class _Tp, class _Alloc>
2173template <class _Comp>
2174void
2175list<_Tp, _Alloc>::merge(list& __c, _Comp __comp)
2176{
2177 if (this != &__c)
2178 {
2179 iterator __f1 = begin();
2180 iterator __e1 = end();
2181 iterator __f2 = __c.begin();
2182 iterator __e2 = __c.end();
2183 while (__f1 != __e1 && __f2 != __e2)
2184 {
2185 if (__comp(*__f2, *__f1))
2186 {
2187 size_type __ds = 1;
Howard Hinnant0949eed2011-06-30 21:18:192188 iterator __m2 = _VSTD::next(__f2);
Howard Hinnantbc8d3f92010-05-11 19:42:162189 for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2, ++__ds)
2190 ;
2191 base::__sz() += __ds;
2192 __c.__sz() -= __ds;
Eric Fiselier5c74b482015-12-30 20:57:592193 __link_pointer __f = __f2.__ptr_;
2194 __link_pointer __l = __m2.__ptr_->__prev_;
Howard Hinnantbc8d3f92010-05-11 19:42:162195 __f2 = __m2;
2196 base::__unlink_nodes(__f, __l);
Howard Hinnant0949eed2011-06-30 21:18:192197 __m2 = _VSTD::next(__f1);
Howard Hinnant29f74322013-06-25 16:08:472198 __link_nodes(__f1.__ptr_, __f, __l);
Howard Hinnantbc8d3f92010-05-11 19:42:162199 __f1 = __m2;
2200 }
2201 else
2202 ++__f1;
2203 }
2204 splice(__e1, __c);
Howard Hinnant1c3ec6d2011-09-27 23:55:032205#if _LIBCPP_DEBUG_LEVEL >= 2
2206 __libcpp_db* __db = __get_db();
2207 __c_node* __cn1 = __db->__find_c_and_lock(this);
2208 __c_node* __cn2 = __db->__find_c(&__c);
2209 for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;)
2210 {
2211 --__p;
2212 iterator* __i = static_cast<iterator*>((*__p)->__i_);
Eric Fiselier8e7bd4f2016-01-04 03:27:522213 if (__i->__ptr_ != __c.__end_as_link())
Howard Hinnant1c3ec6d2011-09-27 23:55:032214 {
2215 __cn1->__add(*__p);
2216 (*__p)->__c_ = __cn1;
2217 if (--__cn2->end_ != __p)
2218 memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*));
2219 }
2220 }
2221 __db->unlock();
2222#endif
Howard Hinnantbc8d3f92010-05-11 19:42:162223 }
2224}
2225
2226template <class _Tp, class _Alloc>
Evgeniy Stepanov9341a8a2016-04-22 01:04:552227inline
Howard Hinnantbc8d3f92010-05-11 19:42:162228void
2229list<_Tp, _Alloc>::sort()
2230{
2231 sort(__less<value_type>());
2232}
2233
2234template <class _Tp, class _Alloc>
2235template <class _Comp>
Evgeniy Stepanov9341a8a2016-04-22 01:04:552236inline
Howard Hinnantbc8d3f92010-05-11 19:42:162237void
2238list<_Tp, _Alloc>::sort(_Comp __comp)
2239{
2240 __sort(begin(), end(), base::__sz(), __comp);
2241}
2242
2243template <class _Tp, class _Alloc>
2244template <class _Comp>
Howard Hinnantbc8d3f92010-05-11 19:42:162245typename list<_Tp, _Alloc>::iterator
2246list<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp)
2247{
2248 switch (__n)
2249 {
2250 case 0:
2251 case 1:
2252 return __f1;
2253 case 2:
2254 if (__comp(*--__e2, *__f1))
2255 {
Eric Fiselier5c74b482015-12-30 20:57:592256 __link_pointer __f = __e2.__ptr_;
Howard Hinnantbc8d3f92010-05-11 19:42:162257 base::__unlink_nodes(__f, __f);
Howard Hinnant29f74322013-06-25 16:08:472258 __link_nodes(__f1.__ptr_, __f, __f);
Howard Hinnantbc8d3f92010-05-11 19:42:162259 return __e2;
2260 }
2261 return __f1;
2262 }
2263 size_type __n2 = __n / 2;
Howard Hinnant0949eed2011-06-30 21:18:192264 iterator __e1 = _VSTD::next(__f1, __n2);
Howard Hinnantbc8d3f92010-05-11 19:42:162265 iterator __r = __f1 = __sort(__f1, __e1, __n2, __comp);
2266 iterator __f2 = __e1 = __sort(__e1, __e2, __n - __n2, __comp);
2267 if (__comp(*__f2, *__f1))
2268 {
Howard Hinnant0949eed2011-06-30 21:18:192269 iterator __m2 = _VSTD::next(__f2);
Howard Hinnantbc8d3f92010-05-11 19:42:162270 for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
2271 ;
Eric Fiselier5c74b482015-12-30 20:57:592272 __link_pointer __f = __f2.__ptr_;
2273 __link_pointer __l = __m2.__ptr_->__prev_;
Howard Hinnantbc8d3f92010-05-11 19:42:162274 __r = __f2;
2275 __e1 = __f2 = __m2;
2276 base::__unlink_nodes(__f, __l);
Howard Hinnant0949eed2011-06-30 21:18:192277 __m2 = _VSTD::next(__f1);
Howard Hinnant29f74322013-06-25 16:08:472278 __link_nodes(__f1.__ptr_, __f, __l);
Howard Hinnantbc8d3f92010-05-11 19:42:162279 __f1 = __m2;
2280 }
2281 else
2282 ++__f1;
2283 while (__f1 != __e1 && __f2 != __e2)
2284 {
2285 if (__comp(*__f2, *__f1))
2286 {
Howard Hinnant0949eed2011-06-30 21:18:192287 iterator __m2 = _VSTD::next(__f2);
Howard Hinnantbc8d3f92010-05-11 19:42:162288 for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2)
2289 ;
Eric Fiselier5c74b482015-12-30 20:57:592290 __link_pointer __f = __f2.__ptr_;
2291 __link_pointer __l = __m2.__ptr_->__prev_;
Howard Hinnantbc8d3f92010-05-11 19:42:162292 if (__e1 == __f2)
2293 __e1 = __m2;
2294 __f2 = __m2;
2295 base::__unlink_nodes(__f, __l);
Howard Hinnant0949eed2011-06-30 21:18:192296 __m2 = _VSTD::next(__f1);
Howard Hinnant29f74322013-06-25 16:08:472297 __link_nodes(__f1.__ptr_, __f, __l);
Howard Hinnantbc8d3f92010-05-11 19:42:162298 __f1 = __m2;
2299 }
2300 else
2301 ++__f1;
2302 }
2303 return __r;
2304}
2305
2306template <class _Tp, class _Alloc>
2307void
Howard Hinnantc5607272011-06-03 17:30:282308list<_Tp, _Alloc>::reverse() _NOEXCEPT
Howard Hinnantbc8d3f92010-05-11 19:42:162309{
2310 if (base::__sz() > 1)
2311 {
2312 iterator __e = end();
Howard Hinnant1c3ec6d2011-09-27 23:55:032313 for (iterator __i = begin(); __i.__ptr_ != __e.__ptr_;)
2314 {
Howard Hinnant0949eed2011-06-30 21:18:192315 _VSTD::swap(__i.__ptr_->__prev_, __i.__ptr_->__next_);
Howard Hinnant1c3ec6d2011-09-27 23:55:032316 __i.__ptr_ = __i.__ptr_->__prev_;
2317 }
Howard Hinnant0949eed2011-06-30 21:18:192318 _VSTD::swap(__e.__ptr_->__prev_, __e.__ptr_->__next_);
Howard Hinnantbc8d3f92010-05-11 19:42:162319 }
2320}
2321
2322template <class _Tp, class _Alloc>
Howard Hinnant1c3ec6d2011-09-27 23:55:032323bool
2324list<_Tp, _Alloc>::__invariants() const
2325{
2326 return size() == _VSTD::distance(begin(), end());
2327}
2328
2329#if _LIBCPP_DEBUG_LEVEL >= 2
2330
2331template <class _Tp, class _Alloc>
2332bool
2333list<_Tp, _Alloc>::__dereferenceable(const const_iterator* __i) const
2334{
Eric Fiselier8e7bd4f2016-01-04 03:27:522335 return __i->__ptr_ != this->__end_as_link();
Howard Hinnant1c3ec6d2011-09-27 23:55:032336}
2337
2338template <class _Tp, class _Alloc>
2339bool
2340list<_Tp, _Alloc>::__decrementable(const const_iterator* __i) const
2341{
2342 return !empty() && __i->__ptr_ != base::__end_.__next_;
2343}
2344
2345template <class _Tp, class _Alloc>
2346bool
Eric Fiselier0e5ebbc2016-12-23 23:37:522347list<_Tp, _Alloc>::__addable(const const_iterator*, ptrdiff_t) const
Howard Hinnant1c3ec6d2011-09-27 23:55:032348{
2349 return false;
2350}
2351
2352template <class _Tp, class _Alloc>
2353bool
Eric Fiselier0e5ebbc2016-12-23 23:37:522354list<_Tp, _Alloc>::__subscriptable(const const_iterator*, ptrdiff_t) const
Howard Hinnant1c3ec6d2011-09-27 23:55:032355{
2356 return false;
2357}
2358
2359#endif // _LIBCPP_DEBUG_LEVEL >= 2
2360
2361template <class _Tp, class _Alloc>
Howard Hinnant82894812010-09-22 16:48:342362inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162363bool
2364operator==(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2365{
Howard Hinnant0949eed2011-06-30 21:18:192366 return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin());
Howard Hinnantbc8d3f92010-05-11 19:42:162367}
2368
2369template <class _Tp, class _Alloc>
Howard Hinnant82894812010-09-22 16:48:342370inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162371bool
2372operator< (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2373{
Howard Hinnant0949eed2011-06-30 21:18:192374 return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
Howard Hinnantbc8d3f92010-05-11 19:42:162375}
2376
2377template <class _Tp, class _Alloc>
Howard Hinnant82894812010-09-22 16:48:342378inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162379bool
2380operator!=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2381{
2382 return !(__x == __y);
2383}
2384
2385template <class _Tp, class _Alloc>
Howard Hinnant82894812010-09-22 16:48:342386inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162387bool
2388operator> (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2389{
2390 return __y < __x;
2391}
2392
2393template <class _Tp, class _Alloc>
Howard Hinnant82894812010-09-22 16:48:342394inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162395bool
2396operator>=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2397{
2398 return !(__x < __y);
2399}
2400
2401template <class _Tp, class _Alloc>
Howard Hinnant82894812010-09-22 16:48:342402inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162403bool
2404operator<=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y)
2405{
2406 return !(__y < __x);
2407}
2408
2409template <class _Tp, class _Alloc>
Howard Hinnant82894812010-09-22 16:48:342410inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:162411void
2412swap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y)
Howard Hinnantc5607272011-06-03 17:30:282413 _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y)))
Howard Hinnantbc8d3f92010-05-11 19:42:162414{
2415 __x.swap(__y);
2416}
2417
2418_LIBCPP_END_NAMESPACE_STD
2419
Eric Fiselier018a3d52017-05-31 22:07:492420_LIBCPP_POP_MACROS
2421
Howard Hinnantbc8d3f92010-05-11 19:42:162422#endif // _LIBCPP_LIST