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