146035553Spatrick// -*- C++ -*- 2*4bdff4beSrobert//===----------------------------------------------------------------------===// 346035553Spatrick// 446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 546035553Spatrick// See https://llvm.org/LICENSE.txt for license information. 646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 746035553Spatrick// 846035553Spatrick//===----------------------------------------------------------------------===// 946035553Spatrick 1046035553Spatrick#ifndef _LIBCPP_LIST 1146035553Spatrick#define _LIBCPP_LIST 1246035553Spatrick 1346035553Spatrick/* 1446035553Spatrick list synopsis 1546035553Spatrick 1646035553Spatricknamespace std 1746035553Spatrick{ 1846035553Spatrick 1946035553Spatricktemplate <class T, class Alloc = allocator<T> > 2046035553Spatrickclass list 2146035553Spatrick{ 2246035553Spatrickpublic: 2346035553Spatrick 2446035553Spatrick // types: 2546035553Spatrick typedef T value_type; 2646035553Spatrick typedef Alloc allocator_type; 2746035553Spatrick typedef typename allocator_type::reference reference; 2846035553Spatrick typedef typename allocator_type::const_reference const_reference; 2946035553Spatrick typedef typename allocator_type::pointer pointer; 3046035553Spatrick typedef typename allocator_type::const_pointer const_pointer; 3146035553Spatrick typedef implementation-defined iterator; 3246035553Spatrick typedef implementation-defined const_iterator; 3346035553Spatrick typedef implementation-defined size_type; 3446035553Spatrick typedef implementation-defined difference_type; 3546035553Spatrick typedef reverse_iterator<iterator> reverse_iterator; 3646035553Spatrick typedef reverse_iterator<const_iterator> const_reverse_iterator; 3746035553Spatrick 3846035553Spatrick list() 3946035553Spatrick noexcept(is_nothrow_default_constructible<allocator_type>::value); 4046035553Spatrick explicit list(const allocator_type& a); 4146035553Spatrick explicit list(size_type n); 4246035553Spatrick explicit list(size_type n, const allocator_type& a); // C++14 4346035553Spatrick list(size_type n, const value_type& value); 4446035553Spatrick list(size_type n, const value_type& value, const allocator_type& a); 4546035553Spatrick template <class Iter> 4646035553Spatrick list(Iter first, Iter last); 4746035553Spatrick template <class Iter> 4846035553Spatrick list(Iter first, Iter last, const allocator_type& a); 4946035553Spatrick list(const list& x); 5046035553Spatrick list(const list&, const allocator_type& a); 5146035553Spatrick list(list&& x) 5246035553Spatrick noexcept(is_nothrow_move_constructible<allocator_type>::value); 5346035553Spatrick list(list&&, const allocator_type& a); 5446035553Spatrick list(initializer_list<value_type>); 5546035553Spatrick list(initializer_list<value_type>, const allocator_type& a); 5646035553Spatrick 5746035553Spatrick ~list(); 5846035553Spatrick 5946035553Spatrick list& operator=(const list& x); 6046035553Spatrick list& operator=(list&& x) 6146035553Spatrick noexcept( 6246035553Spatrick allocator_type::propagate_on_container_move_assignment::value && 6346035553Spatrick is_nothrow_move_assignable<allocator_type>::value); 6446035553Spatrick list& operator=(initializer_list<value_type>); 6546035553Spatrick template <class Iter> 6646035553Spatrick void assign(Iter first, Iter last); 6746035553Spatrick void assign(size_type n, const value_type& t); 6846035553Spatrick void assign(initializer_list<value_type>); 6946035553Spatrick 7046035553Spatrick allocator_type get_allocator() const noexcept; 7146035553Spatrick 7246035553Spatrick iterator begin() noexcept; 7346035553Spatrick const_iterator begin() const noexcept; 7446035553Spatrick iterator end() noexcept; 7546035553Spatrick const_iterator end() const noexcept; 7646035553Spatrick reverse_iterator rbegin() noexcept; 7746035553Spatrick const_reverse_iterator rbegin() const noexcept; 7846035553Spatrick reverse_iterator rend() noexcept; 7946035553Spatrick const_reverse_iterator rend() const noexcept; 8046035553Spatrick const_iterator cbegin() const noexcept; 8146035553Spatrick const_iterator cend() const noexcept; 8246035553Spatrick const_reverse_iterator crbegin() const noexcept; 8346035553Spatrick const_reverse_iterator crend() const noexcept; 8446035553Spatrick 8546035553Spatrick reference front(); 8646035553Spatrick const_reference front() const; 8746035553Spatrick reference back(); 8846035553Spatrick const_reference back() const; 8946035553Spatrick 9046035553Spatrick bool empty() const noexcept; 9146035553Spatrick size_type size() const noexcept; 9246035553Spatrick size_type max_size() const noexcept; 9346035553Spatrick 9446035553Spatrick template <class... Args> 9546035553Spatrick reference emplace_front(Args&&... args); // reference in C++17 9646035553Spatrick void pop_front(); 9746035553Spatrick template <class... Args> 9846035553Spatrick reference emplace_back(Args&&... args); // reference in C++17 9946035553Spatrick void pop_back(); 10046035553Spatrick void push_front(const value_type& x); 10146035553Spatrick void push_front(value_type&& x); 10246035553Spatrick void push_back(const value_type& x); 10346035553Spatrick void push_back(value_type&& x); 10446035553Spatrick template <class... Args> 10546035553Spatrick iterator emplace(const_iterator position, Args&&... args); 10646035553Spatrick iterator insert(const_iterator position, const value_type& x); 10746035553Spatrick iterator insert(const_iterator position, value_type&& x); 10846035553Spatrick iterator insert(const_iterator position, size_type n, const value_type& x); 10946035553Spatrick template <class Iter> 11046035553Spatrick iterator insert(const_iterator position, Iter first, Iter last); 11146035553Spatrick iterator insert(const_iterator position, initializer_list<value_type> il); 11246035553Spatrick 11346035553Spatrick iterator erase(const_iterator position); 11446035553Spatrick iterator erase(const_iterator position, const_iterator last); 11546035553Spatrick 11646035553Spatrick void resize(size_type sz); 11746035553Spatrick void resize(size_type sz, const value_type& c); 11846035553Spatrick 11946035553Spatrick void swap(list&) 12046035553Spatrick noexcept(allocator_traits<allocator_type>::is_always_equal::value); // C++17 12146035553Spatrick void clear() noexcept; 12246035553Spatrick 12346035553Spatrick void splice(const_iterator position, list& x); 12446035553Spatrick void splice(const_iterator position, list&& x); 12546035553Spatrick void splice(const_iterator position, list& x, const_iterator i); 12646035553Spatrick void splice(const_iterator position, list&& x, const_iterator i); 12746035553Spatrick void splice(const_iterator position, list& x, const_iterator first, 12846035553Spatrick const_iterator last); 12946035553Spatrick void splice(const_iterator position, list&& x, const_iterator first, 13046035553Spatrick const_iterator last); 13146035553Spatrick 13246035553Spatrick size_type remove(const value_type& value); // void before C++20 13346035553Spatrick template <class Pred> 13446035553Spatrick size_type remove_if(Pred pred); // void before C++20 13546035553Spatrick size_type unique(); // void before C++20 13646035553Spatrick template <class BinaryPredicate> 13746035553Spatrick size_type unique(BinaryPredicate binary_pred); // void before C++20 13846035553Spatrick void merge(list& x); 13946035553Spatrick void merge(list&& x); 14046035553Spatrick template <class Compare> 14146035553Spatrick void merge(list& x, Compare comp); 14246035553Spatrick template <class Compare> 14346035553Spatrick void merge(list&& x, Compare comp); 14446035553Spatrick void sort(); 14546035553Spatrick template <class Compare> 14646035553Spatrick void sort(Compare comp); 14746035553Spatrick void reverse() noexcept; 14846035553Spatrick}; 14946035553Spatrick 15046035553Spatrick 15146035553Spatricktemplate <class InputIterator, class Allocator = allocator<typename iterator_traits<InputIterator>::value_type>> 15246035553Spatrick list(InputIterator, InputIterator, Allocator = Allocator()) 15346035553Spatrick -> list<typename iterator_traits<InputIterator>::value_type, Allocator>; // C++17 15446035553Spatrick 15546035553Spatricktemplate <class T, class Alloc> 15646035553Spatrick bool operator==(const list<T,Alloc>& x, const list<T,Alloc>& y); 15746035553Spatricktemplate <class T, class Alloc> 15846035553Spatrick bool operator< (const list<T,Alloc>& x, const list<T,Alloc>& y); 15946035553Spatricktemplate <class T, class Alloc> 16046035553Spatrick bool operator!=(const list<T,Alloc>& x, const list<T,Alloc>& y); 16146035553Spatricktemplate <class T, class Alloc> 16246035553Spatrick bool operator> (const list<T,Alloc>& x, const list<T,Alloc>& y); 16346035553Spatricktemplate <class T, class Alloc> 16446035553Spatrick bool operator>=(const list<T,Alloc>& x, const list<T,Alloc>& y); 16546035553Spatricktemplate <class T, class Alloc> 16646035553Spatrick bool operator<=(const list<T,Alloc>& x, const list<T,Alloc>& y); 16746035553Spatrick 16846035553Spatricktemplate <class T, class Alloc> 16946035553Spatrick void swap(list<T,Alloc>& x, list<T,Alloc>& y) 17046035553Spatrick noexcept(noexcept(x.swap(y))); 17146035553Spatrick 17246035553Spatricktemplate <class T, class Allocator, class U> 173037e7968Spatrick typename list<T, Allocator>::size_type 174037e7968Spatrick erase(list<T, Allocator>& c, const U& value); // C++20 17546035553Spatricktemplate <class T, class Allocator, class Predicate> 176037e7968Spatrick typename list<T, Allocator>::size_type 177037e7968Spatrick erase_if(list<T, Allocator>& c, Predicate pred); // C++20 17846035553Spatrick 17946035553Spatrick} // std 18046035553Spatrick 18146035553Spatrick*/ 18246035553Spatrick 183*4bdff4beSrobert#include <__algorithm/comp.h> 184*4bdff4beSrobert#include <__algorithm/equal.h> 185*4bdff4beSrobert#include <__algorithm/lexicographical_compare.h> 186*4bdff4beSrobert#include <__algorithm/min.h> 187*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler 18846035553Spatrick#include <__config> 18976d0caaeSpatrick#include <__debug> 190*4bdff4beSrobert#include <__format/enable_insertable.h> 191*4bdff4beSrobert#include <__iterator/distance.h> 192*4bdff4beSrobert#include <__iterator/iterator_traits.h> 193*4bdff4beSrobert#include <__iterator/move_iterator.h> 194*4bdff4beSrobert#include <__iterator/next.h> 195*4bdff4beSrobert#include <__iterator/prev.h> 196*4bdff4beSrobert#include <__iterator/reverse_iterator.h> 197*4bdff4beSrobert#include <__memory/addressof.h> 198*4bdff4beSrobert#include <__memory/allocator.h> 199*4bdff4beSrobert#include <__memory/allocator_destructor.h> 200*4bdff4beSrobert#include <__memory/allocator_traits.h> 201*4bdff4beSrobert#include <__memory/compressed_pair.h> 202*4bdff4beSrobert#include <__memory/pointer_traits.h> 203*4bdff4beSrobert#include <__memory/swap_allocator.h> 204*4bdff4beSrobert#include <__memory/unique_ptr.h> 205*4bdff4beSrobert#include <__memory_resource/polymorphic_allocator.h> 206*4bdff4beSrobert#include <__type_traits/is_allocator.h> 20776d0caaeSpatrick#include <__utility/forward.h> 208*4bdff4beSrobert#include <__utility/move.h> 209*4bdff4beSrobert#include <__utility/swap.h> 210*4bdff4beSrobert#include <cstring> 21176d0caaeSpatrick#include <limits> 21246035553Spatrick#include <type_traits> 21346035553Spatrick#include <version> 21446035553Spatrick 215*4bdff4beSrobert// standard-mandated includes 216*4bdff4beSrobert 217*4bdff4beSrobert// [iterator.range] 218*4bdff4beSrobert#include <__iterator/access.h> 219*4bdff4beSrobert#include <__iterator/data.h> 220*4bdff4beSrobert#include <__iterator/empty.h> 221*4bdff4beSrobert#include <__iterator/reverse_access.h> 222*4bdff4beSrobert#include <__iterator/size.h> 223*4bdff4beSrobert 224*4bdff4beSrobert// [list.syn] 225*4bdff4beSrobert#include <compare> 226*4bdff4beSrobert#include <initializer_list> 227*4bdff4beSrobert 22846035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 22946035553Spatrick# pragma GCC system_header 23046035553Spatrick#endif 23146035553Spatrick 23246035553Spatrick_LIBCPP_PUSH_MACROS 23346035553Spatrick#include <__undef_macros> 23446035553Spatrick 23546035553Spatrick 23646035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD 23746035553Spatrick 23846035553Spatricktemplate <class _Tp, class _VoidPtr> struct __list_node; 23946035553Spatricktemplate <class _Tp, class _VoidPtr> struct __list_node_base; 24046035553Spatrick 24146035553Spatricktemplate <class _Tp, class _VoidPtr> 24246035553Spatrickstruct __list_node_pointer_traits { 243*4bdff4beSrobert typedef __rebind_pointer_t<_VoidPtr, __list_node<_Tp, _VoidPtr> > 24446035553Spatrick __node_pointer; 245*4bdff4beSrobert typedef __rebind_pointer_t<_VoidPtr, __list_node_base<_Tp, _VoidPtr> > 24646035553Spatrick __base_pointer; 24746035553Spatrick 24846035553Spatrick#if defined(_LIBCPP_ABI_LIST_REMOVE_NODE_POINTER_UB) 24946035553Spatrick typedef __base_pointer __link_pointer; 25046035553Spatrick#else 251*4bdff4beSrobert typedef __conditional_t<is_pointer<_VoidPtr>::value, __base_pointer, __node_pointer> __link_pointer; 25246035553Spatrick#endif 25346035553Spatrick 254*4bdff4beSrobert typedef __conditional_t<is_same<__link_pointer, __node_pointer>::value, __base_pointer, __node_pointer> 255*4bdff4beSrobert __non_link_pointer; 25646035553Spatrick 25746035553Spatrick static _LIBCPP_INLINE_VISIBILITY 25846035553Spatrick __link_pointer __unsafe_link_pointer_cast(__link_pointer __p) { 25946035553Spatrick return __p; 26046035553Spatrick } 26146035553Spatrick 26246035553Spatrick static _LIBCPP_INLINE_VISIBILITY 26346035553Spatrick __link_pointer __unsafe_link_pointer_cast(__non_link_pointer __p) { 26446035553Spatrick return static_cast<__link_pointer>(static_cast<_VoidPtr>(__p)); 26546035553Spatrick } 26646035553Spatrick 26746035553Spatrick}; 26846035553Spatrick 26946035553Spatricktemplate <class _Tp, class _VoidPtr> 27046035553Spatrickstruct __list_node_base 27146035553Spatrick{ 27246035553Spatrick typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits; 27346035553Spatrick typedef typename _NodeTraits::__node_pointer __node_pointer; 27446035553Spatrick typedef typename _NodeTraits::__base_pointer __base_pointer; 27546035553Spatrick typedef typename _NodeTraits::__link_pointer __link_pointer; 27646035553Spatrick 27746035553Spatrick __link_pointer __prev_; 27846035553Spatrick __link_pointer __next_; 27946035553Spatrick 28046035553Spatrick _LIBCPP_INLINE_VISIBILITY 28146035553Spatrick __list_node_base() : __prev_(_NodeTraits::__unsafe_link_pointer_cast(__self())), 28246035553Spatrick __next_(_NodeTraits::__unsafe_link_pointer_cast(__self())) {} 28346035553Spatrick 28446035553Spatrick _LIBCPP_INLINE_VISIBILITY 28546035553Spatrick __base_pointer __self() { 28646035553Spatrick return pointer_traits<__base_pointer>::pointer_to(*this); 28746035553Spatrick } 28846035553Spatrick 28946035553Spatrick _LIBCPP_INLINE_VISIBILITY 29046035553Spatrick __node_pointer __as_node() { 29146035553Spatrick return static_cast<__node_pointer>(__self()); 29246035553Spatrick } 29346035553Spatrick}; 29446035553Spatrick 29546035553Spatricktemplate <class _Tp, class _VoidPtr> 29676d0caaeSpatrickstruct _LIBCPP_STANDALONE_DEBUG __list_node 29746035553Spatrick : public __list_node_base<_Tp, _VoidPtr> 29846035553Spatrick{ 29946035553Spatrick _Tp __value_; 30046035553Spatrick 30146035553Spatrick typedef __list_node_base<_Tp, _VoidPtr> __base; 30246035553Spatrick typedef typename __base::__link_pointer __link_pointer; 30346035553Spatrick 30446035553Spatrick _LIBCPP_INLINE_VISIBILITY 30546035553Spatrick __link_pointer __as_link() { 30646035553Spatrick return static_cast<__link_pointer>(__base::__self()); 30746035553Spatrick } 30846035553Spatrick}; 30946035553Spatrick 31046035553Spatricktemplate <class _Tp, class _Alloc = allocator<_Tp> > class _LIBCPP_TEMPLATE_VIS list; 31146035553Spatricktemplate <class _Tp, class _Alloc> class __list_imp; 31246035553Spatricktemplate <class _Tp, class _VoidPtr> class _LIBCPP_TEMPLATE_VIS __list_const_iterator; 31346035553Spatrick 31446035553Spatricktemplate <class _Tp, class _VoidPtr> 31546035553Spatrickclass _LIBCPP_TEMPLATE_VIS __list_iterator 31646035553Spatrick{ 31746035553Spatrick typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits; 31846035553Spatrick typedef typename _NodeTraits::__link_pointer __link_pointer; 31946035553Spatrick 32046035553Spatrick __link_pointer __ptr_; 32146035553Spatrick 32246035553Spatrick _LIBCPP_INLINE_VISIBILITY 32346035553Spatrick explicit __list_iterator(__link_pointer __p, const void* __c) _NOEXCEPT 32446035553Spatrick : __ptr_(__p) 32546035553Spatrick { 326*4bdff4beSrobert (void)__c; 327*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 32846035553Spatrick __get_db()->__insert_ic(this, __c); 32946035553Spatrick#endif 330*4bdff4beSrobert } 33146035553Spatrick 33246035553Spatrick template<class, class> friend class list; 33346035553Spatrick template<class, class> friend class __list_imp; 33446035553Spatrick template<class, class> friend class __list_const_iterator; 33546035553Spatrickpublic: 33646035553Spatrick typedef bidirectional_iterator_tag iterator_category; 33746035553Spatrick typedef _Tp value_type; 33846035553Spatrick typedef value_type& reference; 339*4bdff4beSrobert typedef __rebind_pointer_t<_VoidPtr, value_type> pointer; 34046035553Spatrick typedef typename pointer_traits<pointer>::difference_type difference_type; 34146035553Spatrick 34246035553Spatrick _LIBCPP_INLINE_VISIBILITY 34346035553Spatrick __list_iterator() _NOEXCEPT : __ptr_(nullptr) 34446035553Spatrick { 345*4bdff4beSrobert _VSTD::__debug_db_insert_i(this); 34646035553Spatrick } 34746035553Spatrick 348*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 34946035553Spatrick 35046035553Spatrick _LIBCPP_INLINE_VISIBILITY 35146035553Spatrick __list_iterator(const __list_iterator& __p) 35246035553Spatrick : __ptr_(__p.__ptr_) 35346035553Spatrick { 354*4bdff4beSrobert __get_db()->__iterator_copy(this, _VSTD::addressof(__p)); 35546035553Spatrick } 35646035553Spatrick 35746035553Spatrick _LIBCPP_INLINE_VISIBILITY 35846035553Spatrick ~__list_iterator() 35946035553Spatrick { 36046035553Spatrick __get_db()->__erase_i(this); 36146035553Spatrick } 36246035553Spatrick 36346035553Spatrick _LIBCPP_INLINE_VISIBILITY 36446035553Spatrick __list_iterator& operator=(const __list_iterator& __p) 36546035553Spatrick { 366*4bdff4beSrobert if (this != _VSTD::addressof(__p)) 36746035553Spatrick { 368*4bdff4beSrobert __get_db()->__iterator_copy(this, _VSTD::addressof(__p)); 36946035553Spatrick __ptr_ = __p.__ptr_; 37046035553Spatrick } 37146035553Spatrick return *this; 37246035553Spatrick } 37346035553Spatrick 374*4bdff4beSrobert#endif // _LIBCPP_ENABLE_DEBUG_MODE 37546035553Spatrick 37646035553Spatrick _LIBCPP_INLINE_VISIBILITY 37746035553Spatrick reference operator*() const 37846035553Spatrick { 379*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), 38046035553Spatrick "Attempted to dereference a non-dereferenceable list::iterator"); 38146035553Spatrick return __ptr_->__as_node()->__value_; 38246035553Spatrick } 38346035553Spatrick _LIBCPP_INLINE_VISIBILITY 38446035553Spatrick pointer operator->() const 38546035553Spatrick { 386*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), 38746035553Spatrick "Attempted to dereference a non-dereferenceable list::iterator"); 38846035553Spatrick return pointer_traits<pointer>::pointer_to(__ptr_->__as_node()->__value_); 38946035553Spatrick } 39046035553Spatrick 39146035553Spatrick _LIBCPP_INLINE_VISIBILITY 39246035553Spatrick __list_iterator& operator++() 39346035553Spatrick { 394*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), 39576d0caaeSpatrick "Attempted to increment a non-incrementable list::iterator"); 39646035553Spatrick __ptr_ = __ptr_->__next_; 39746035553Spatrick return *this; 39846035553Spatrick } 39946035553Spatrick _LIBCPP_INLINE_VISIBILITY 40046035553Spatrick __list_iterator operator++(int) {__list_iterator __t(*this); ++(*this); return __t;} 40146035553Spatrick 40246035553Spatrick _LIBCPP_INLINE_VISIBILITY 40346035553Spatrick __list_iterator& operator--() 40446035553Spatrick { 405*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__decrementable(this), 40676d0caaeSpatrick "Attempted to decrement a non-decrementable list::iterator"); 40746035553Spatrick __ptr_ = __ptr_->__prev_; 40846035553Spatrick return *this; 40946035553Spatrick } 41046035553Spatrick _LIBCPP_INLINE_VISIBILITY 41146035553Spatrick __list_iterator operator--(int) {__list_iterator __t(*this); --(*this); return __t;} 41246035553Spatrick 41346035553Spatrick friend _LIBCPP_INLINE_VISIBILITY 41446035553Spatrick bool operator==(const __list_iterator& __x, const __list_iterator& __y) 41546035553Spatrick { 41646035553Spatrick return __x.__ptr_ == __y.__ptr_; 41746035553Spatrick } 41846035553Spatrick friend _LIBCPP_INLINE_VISIBILITY 41946035553Spatrick bool operator!=(const __list_iterator& __x, const __list_iterator& __y) 42046035553Spatrick {return !(__x == __y);} 42146035553Spatrick}; 42246035553Spatrick 42346035553Spatricktemplate <class _Tp, class _VoidPtr> 42446035553Spatrickclass _LIBCPP_TEMPLATE_VIS __list_const_iterator 42546035553Spatrick{ 42646035553Spatrick typedef __list_node_pointer_traits<_Tp, _VoidPtr> _NodeTraits; 42746035553Spatrick typedef typename _NodeTraits::__link_pointer __link_pointer; 42846035553Spatrick 42946035553Spatrick __link_pointer __ptr_; 43046035553Spatrick 43146035553Spatrick _LIBCPP_INLINE_VISIBILITY 43246035553Spatrick explicit __list_const_iterator(__link_pointer __p, const void* __c) _NOEXCEPT 43346035553Spatrick : __ptr_(__p) 43446035553Spatrick { 435*4bdff4beSrobert (void)__c; 436*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 43746035553Spatrick __get_db()->__insert_ic(this, __c); 43846035553Spatrick#endif 439*4bdff4beSrobert } 44046035553Spatrick 44146035553Spatrick template<class, class> friend class list; 44246035553Spatrick template<class, class> friend class __list_imp; 44346035553Spatrickpublic: 44446035553Spatrick typedef bidirectional_iterator_tag iterator_category; 44546035553Spatrick typedef _Tp value_type; 44646035553Spatrick typedef const value_type& reference; 447*4bdff4beSrobert typedef __rebind_pointer_t<_VoidPtr, const value_type> pointer; 44846035553Spatrick typedef typename pointer_traits<pointer>::difference_type difference_type; 44946035553Spatrick 45046035553Spatrick _LIBCPP_INLINE_VISIBILITY 45146035553Spatrick __list_const_iterator() _NOEXCEPT : __ptr_(nullptr) 45246035553Spatrick { 453*4bdff4beSrobert _VSTD::__debug_db_insert_i(this); 45446035553Spatrick } 45546035553Spatrick _LIBCPP_INLINE_VISIBILITY 45646035553Spatrick __list_const_iterator(const __list_iterator<_Tp, _VoidPtr>& __p) _NOEXCEPT 45746035553Spatrick : __ptr_(__p.__ptr_) 45846035553Spatrick { 459*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 460*4bdff4beSrobert __get_db()->__iterator_copy(this, _VSTD::addressof(__p)); 46146035553Spatrick#endif 46246035553Spatrick } 46346035553Spatrick 464*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 46546035553Spatrick 46646035553Spatrick _LIBCPP_INLINE_VISIBILITY 46746035553Spatrick __list_const_iterator(const __list_const_iterator& __p) 46846035553Spatrick : __ptr_(__p.__ptr_) 46946035553Spatrick { 470*4bdff4beSrobert __get_db()->__iterator_copy(this, _VSTD::addressof(__p)); 47146035553Spatrick } 47246035553Spatrick 47346035553Spatrick _LIBCPP_INLINE_VISIBILITY 47446035553Spatrick ~__list_const_iterator() 47546035553Spatrick { 47646035553Spatrick __get_db()->__erase_i(this); 47746035553Spatrick } 47846035553Spatrick 47946035553Spatrick _LIBCPP_INLINE_VISIBILITY 48046035553Spatrick __list_const_iterator& operator=(const __list_const_iterator& __p) 48146035553Spatrick { 482*4bdff4beSrobert if (this != _VSTD::addressof(__p)) 48346035553Spatrick { 484*4bdff4beSrobert __get_db()->__iterator_copy(this, _VSTD::addressof(__p)); 48546035553Spatrick __ptr_ = __p.__ptr_; 48646035553Spatrick } 48746035553Spatrick return *this; 48846035553Spatrick } 48946035553Spatrick 490*4bdff4beSrobert#endif // _LIBCPP_ENABLE_DEBUG_MODE 49146035553Spatrick _LIBCPP_INLINE_VISIBILITY 49246035553Spatrick reference operator*() const 49346035553Spatrick { 494*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), 49546035553Spatrick "Attempted to dereference a non-dereferenceable list::const_iterator"); 49646035553Spatrick return __ptr_->__as_node()->__value_; 49746035553Spatrick } 49846035553Spatrick _LIBCPP_INLINE_VISIBILITY 49946035553Spatrick pointer operator->() const 50046035553Spatrick { 501*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), 50246035553Spatrick "Attempted to dereference a non-dereferenceable list::const_iterator"); 50346035553Spatrick return pointer_traits<pointer>::pointer_to(__ptr_->__as_node()->__value_); 50446035553Spatrick } 50546035553Spatrick 50646035553Spatrick _LIBCPP_INLINE_VISIBILITY 50746035553Spatrick __list_const_iterator& operator++() 50846035553Spatrick { 509*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this), 51076d0caaeSpatrick "Attempted to increment a non-incrementable list::const_iterator"); 51146035553Spatrick __ptr_ = __ptr_->__next_; 51246035553Spatrick return *this; 51346035553Spatrick } 51446035553Spatrick _LIBCPP_INLINE_VISIBILITY 51546035553Spatrick __list_const_iterator operator++(int) {__list_const_iterator __t(*this); ++(*this); return __t;} 51646035553Spatrick 51746035553Spatrick _LIBCPP_INLINE_VISIBILITY 51846035553Spatrick __list_const_iterator& operator--() 51946035553Spatrick { 520*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__decrementable(this), 52176d0caaeSpatrick "Attempted to decrement a non-decrementable list::const_iterator"); 52246035553Spatrick __ptr_ = __ptr_->__prev_; 52346035553Spatrick return *this; 52446035553Spatrick } 52546035553Spatrick _LIBCPP_INLINE_VISIBILITY 52646035553Spatrick __list_const_iterator operator--(int) {__list_const_iterator __t(*this); --(*this); return __t;} 52746035553Spatrick 52846035553Spatrick friend _LIBCPP_INLINE_VISIBILITY 52946035553Spatrick bool operator==(const __list_const_iterator& __x, const __list_const_iterator& __y) 53046035553Spatrick { 53146035553Spatrick return __x.__ptr_ == __y.__ptr_; 53246035553Spatrick } 53346035553Spatrick friend _LIBCPP_INLINE_VISIBILITY 53446035553Spatrick bool operator!=(const __list_const_iterator& __x, const __list_const_iterator& __y) 53546035553Spatrick {return !(__x == __y);} 53646035553Spatrick}; 53746035553Spatrick 53846035553Spatricktemplate <class _Tp, class _Alloc> 53946035553Spatrickclass __list_imp 54046035553Spatrick{ 54146035553Spatrick __list_imp(const __list_imp&); 54246035553Spatrick __list_imp& operator=(const __list_imp&); 54346035553Spatrickpublic: 54446035553Spatrick typedef _Alloc allocator_type; 54546035553Spatrick typedef allocator_traits<allocator_type> __alloc_traits; 54646035553Spatrick typedef typename __alloc_traits::size_type size_type; 54746035553Spatrickprotected: 54846035553Spatrick typedef _Tp value_type; 54946035553Spatrick typedef typename __alloc_traits::void_pointer __void_pointer; 55046035553Spatrick typedef __list_iterator<value_type, __void_pointer> iterator; 55146035553Spatrick typedef __list_const_iterator<value_type, __void_pointer> const_iterator; 55246035553Spatrick typedef __list_node_base<value_type, __void_pointer> __node_base; 55346035553Spatrick typedef __list_node<value_type, __void_pointer> __node; 554*4bdff4beSrobert typedef __rebind_alloc<__alloc_traits, __node> __node_allocator; 55546035553Spatrick typedef allocator_traits<__node_allocator> __node_alloc_traits; 55646035553Spatrick typedef typename __node_alloc_traits::pointer __node_pointer; 55746035553Spatrick typedef typename __node_alloc_traits::pointer __node_const_pointer; 55846035553Spatrick typedef __list_node_pointer_traits<value_type, __void_pointer> __node_pointer_traits; 55946035553Spatrick typedef typename __node_pointer_traits::__link_pointer __link_pointer; 56046035553Spatrick typedef __link_pointer __link_const_pointer; 56146035553Spatrick typedef typename __alloc_traits::pointer pointer; 56246035553Spatrick typedef typename __alloc_traits::const_pointer const_pointer; 56346035553Spatrick typedef typename __alloc_traits::difference_type difference_type; 56446035553Spatrick 565*4bdff4beSrobert typedef __rebind_alloc<__alloc_traits, __node_base> __node_base_allocator; 56646035553Spatrick typedef typename allocator_traits<__node_base_allocator>::pointer __node_base_pointer; 56746035553Spatrick static_assert((!is_same<allocator_type, __node_allocator>::value), 56846035553Spatrick "internal allocator type must differ from user-specified " 56946035553Spatrick "type; otherwise overload resolution breaks"); 57046035553Spatrick 57146035553Spatrick __node_base __end_; 57246035553Spatrick __compressed_pair<size_type, __node_allocator> __size_alloc_; 57346035553Spatrick 57446035553Spatrick _LIBCPP_INLINE_VISIBILITY 57546035553Spatrick __link_pointer __end_as_link() const _NOEXCEPT { 57646035553Spatrick return __node_pointer_traits::__unsafe_link_pointer_cast( 57746035553Spatrick const_cast<__node_base&>(__end_).__self()); 57846035553Spatrick } 57946035553Spatrick 58046035553Spatrick _LIBCPP_INLINE_VISIBILITY 58146035553Spatrick size_type& __sz() _NOEXCEPT {return __size_alloc_.first();} 58246035553Spatrick _LIBCPP_INLINE_VISIBILITY 58346035553Spatrick const size_type& __sz() const _NOEXCEPT 58446035553Spatrick {return __size_alloc_.first();} 58546035553Spatrick _LIBCPP_INLINE_VISIBILITY 58646035553Spatrick __node_allocator& __node_alloc() _NOEXCEPT 58746035553Spatrick {return __size_alloc_.second();} 58846035553Spatrick _LIBCPP_INLINE_VISIBILITY 58946035553Spatrick const __node_allocator& __node_alloc() const _NOEXCEPT 59046035553Spatrick {return __size_alloc_.second();} 59146035553Spatrick 59246035553Spatrick _LIBCPP_INLINE_VISIBILITY 59346035553Spatrick size_type __node_alloc_max_size() const _NOEXCEPT { 59446035553Spatrick return __node_alloc_traits::max_size(__node_alloc()); 59546035553Spatrick } 59646035553Spatrick _LIBCPP_INLINE_VISIBILITY 59746035553Spatrick static void __unlink_nodes(__link_pointer __f, __link_pointer __l) _NOEXCEPT; 59846035553Spatrick 59946035553Spatrick _LIBCPP_INLINE_VISIBILITY 60046035553Spatrick __list_imp() 60146035553Spatrick _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value); 60246035553Spatrick _LIBCPP_INLINE_VISIBILITY 60346035553Spatrick __list_imp(const allocator_type& __a); 60446035553Spatrick _LIBCPP_INLINE_VISIBILITY 60546035553Spatrick __list_imp(const __node_allocator& __a); 60646035553Spatrick#ifndef _LIBCPP_CXX03_LANG 60746035553Spatrick __list_imp(__node_allocator&& __a) _NOEXCEPT; 60846035553Spatrick#endif 60946035553Spatrick ~__list_imp(); 61046035553Spatrick void clear() _NOEXCEPT; 61146035553Spatrick _LIBCPP_INLINE_VISIBILITY 61246035553Spatrick bool empty() const _NOEXCEPT {return __sz() == 0;} 61346035553Spatrick 61446035553Spatrick _LIBCPP_INLINE_VISIBILITY 61546035553Spatrick iterator begin() _NOEXCEPT 61646035553Spatrick { 61746035553Spatrick return iterator(__end_.__next_, this); 61846035553Spatrick } 61946035553Spatrick _LIBCPP_INLINE_VISIBILITY 62046035553Spatrick const_iterator begin() const _NOEXCEPT 62146035553Spatrick { 62246035553Spatrick return const_iterator(__end_.__next_, this); 62346035553Spatrick } 62446035553Spatrick _LIBCPP_INLINE_VISIBILITY 62546035553Spatrick iterator end() _NOEXCEPT 62646035553Spatrick { 62746035553Spatrick return iterator(__end_as_link(), this); 62846035553Spatrick } 62946035553Spatrick _LIBCPP_INLINE_VISIBILITY 63046035553Spatrick const_iterator end() const _NOEXCEPT 63146035553Spatrick { 63246035553Spatrick return const_iterator(__end_as_link(), this); 63346035553Spatrick } 63446035553Spatrick 63546035553Spatrick void swap(__list_imp& __c) 63646035553Spatrick#if _LIBCPP_STD_VER >= 14 63746035553Spatrick _NOEXCEPT; 63846035553Spatrick#else 63946035553Spatrick _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 64046035553Spatrick __is_nothrow_swappable<allocator_type>::value); 64146035553Spatrick#endif 64246035553Spatrick 64346035553Spatrick _LIBCPP_INLINE_VISIBILITY 64446035553Spatrick void __copy_assign_alloc(const __list_imp& __c) 64546035553Spatrick {__copy_assign_alloc(__c, integral_constant<bool, 64646035553Spatrick __node_alloc_traits::propagate_on_container_copy_assignment::value>());} 64746035553Spatrick 64846035553Spatrick _LIBCPP_INLINE_VISIBILITY 64946035553Spatrick void __move_assign_alloc(__list_imp& __c) 65046035553Spatrick _NOEXCEPT_( 65146035553Spatrick !__node_alloc_traits::propagate_on_container_move_assignment::value || 65246035553Spatrick is_nothrow_move_assignable<__node_allocator>::value) 65346035553Spatrick {__move_assign_alloc(__c, integral_constant<bool, 65446035553Spatrick __node_alloc_traits::propagate_on_container_move_assignment::value>());} 65546035553Spatrick 65646035553Spatrickprivate: 65746035553Spatrick _LIBCPP_INLINE_VISIBILITY 65846035553Spatrick void __copy_assign_alloc(const __list_imp& __c, true_type) 65946035553Spatrick { 66046035553Spatrick if (__node_alloc() != __c.__node_alloc()) 66146035553Spatrick clear(); 66246035553Spatrick __node_alloc() = __c.__node_alloc(); 66346035553Spatrick } 66446035553Spatrick 66546035553Spatrick _LIBCPP_INLINE_VISIBILITY 66646035553Spatrick void __copy_assign_alloc(const __list_imp&, false_type) 66746035553Spatrick {} 66846035553Spatrick 66946035553Spatrick _LIBCPP_INLINE_VISIBILITY 67046035553Spatrick void __move_assign_alloc(__list_imp& __c, true_type) 67146035553Spatrick _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value) 67246035553Spatrick { 67346035553Spatrick __node_alloc() = _VSTD::move(__c.__node_alloc()); 67446035553Spatrick } 67546035553Spatrick 67646035553Spatrick _LIBCPP_INLINE_VISIBILITY 67746035553Spatrick void __move_assign_alloc(__list_imp&, false_type) 67846035553Spatrick _NOEXCEPT 67946035553Spatrick {} 68046035553Spatrick}; 68146035553Spatrick 68246035553Spatrick// Unlink nodes [__f, __l] 68346035553Spatricktemplate <class _Tp, class _Alloc> 68446035553Spatrickinline 68546035553Spatrickvoid 68646035553Spatrick__list_imp<_Tp, _Alloc>::__unlink_nodes(__link_pointer __f, __link_pointer __l) 68746035553Spatrick _NOEXCEPT 68846035553Spatrick{ 68946035553Spatrick __f->__prev_->__next_ = __l->__next_; 69046035553Spatrick __l->__next_->__prev_ = __f->__prev_; 69146035553Spatrick} 69246035553Spatrick 69346035553Spatricktemplate <class _Tp, class _Alloc> 69446035553Spatrickinline 69546035553Spatrick__list_imp<_Tp, _Alloc>::__list_imp() 69646035553Spatrick _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value) 69746035553Spatrick : __size_alloc_(0, __default_init_tag()) 69846035553Spatrick{ 69946035553Spatrick} 70046035553Spatrick 70146035553Spatricktemplate <class _Tp, class _Alloc> 70246035553Spatrickinline 70346035553Spatrick__list_imp<_Tp, _Alloc>::__list_imp(const allocator_type& __a) 70446035553Spatrick : __size_alloc_(0, __node_allocator(__a)) 70546035553Spatrick{ 70646035553Spatrick} 70746035553Spatrick 70846035553Spatricktemplate <class _Tp, class _Alloc> 70946035553Spatrickinline __list_imp<_Tp, _Alloc>::__list_imp(const __node_allocator& __a) 71046035553Spatrick : __size_alloc_(0, __a) {} 71146035553Spatrick 71246035553Spatrick#ifndef _LIBCPP_CXX03_LANG 71346035553Spatricktemplate <class _Tp, class _Alloc> 71446035553Spatrickinline __list_imp<_Tp, _Alloc>::__list_imp(__node_allocator&& __a) _NOEXCEPT 71576d0caaeSpatrick : __size_alloc_(0, _VSTD::move(__a)) {} 71646035553Spatrick#endif 71746035553Spatrick 71846035553Spatricktemplate <class _Tp, class _Alloc> 71946035553Spatrick__list_imp<_Tp, _Alloc>::~__list_imp() { 72046035553Spatrick clear(); 721*4bdff4beSrobert std::__debug_db_erase_c(this); 72246035553Spatrick} 72346035553Spatrick 72446035553Spatricktemplate <class _Tp, class _Alloc> 72546035553Spatrickvoid 72646035553Spatrick__list_imp<_Tp, _Alloc>::clear() _NOEXCEPT 72746035553Spatrick{ 72846035553Spatrick if (!empty()) 72946035553Spatrick { 73046035553Spatrick __node_allocator& __na = __node_alloc(); 73146035553Spatrick __link_pointer __f = __end_.__next_; 73246035553Spatrick __link_pointer __l = __end_as_link(); 73346035553Spatrick __unlink_nodes(__f, __l->__prev_); 73446035553Spatrick __sz() = 0; 73546035553Spatrick while (__f != __l) 73646035553Spatrick { 73746035553Spatrick __node_pointer __np = __f->__as_node(); 73846035553Spatrick __f = __f->__next_; 73946035553Spatrick __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_)); 74046035553Spatrick __node_alloc_traits::deallocate(__na, __np, 1); 74146035553Spatrick } 742*4bdff4beSrobert std::__debug_db_invalidate_all(this); 74346035553Spatrick } 74446035553Spatrick} 74546035553Spatrick 74646035553Spatricktemplate <class _Tp, class _Alloc> 74746035553Spatrickvoid 74846035553Spatrick__list_imp<_Tp, _Alloc>::swap(__list_imp& __c) 74946035553Spatrick#if _LIBCPP_STD_VER >= 14 75046035553Spatrick _NOEXCEPT 75146035553Spatrick#else 75246035553Spatrick _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || 75346035553Spatrick __is_nothrow_swappable<allocator_type>::value) 75446035553Spatrick#endif 75546035553Spatrick{ 75646035553Spatrick _LIBCPP_ASSERT(__alloc_traits::propagate_on_container_swap::value || 75746035553Spatrick this->__node_alloc() == __c.__node_alloc(), 75846035553Spatrick "list::swap: Either propagate_on_container_swap must be true" 75946035553Spatrick " or the allocators must compare equal"); 76046035553Spatrick using _VSTD::swap; 76176d0caaeSpatrick _VSTD::__swap_allocator(__node_alloc(), __c.__node_alloc()); 76246035553Spatrick swap(__sz(), __c.__sz()); 76346035553Spatrick swap(__end_, __c.__end_); 76446035553Spatrick if (__sz() == 0) 76546035553Spatrick __end_.__next_ = __end_.__prev_ = __end_as_link(); 76646035553Spatrick else 76746035553Spatrick __end_.__prev_->__next_ = __end_.__next_->__prev_ = __end_as_link(); 76846035553Spatrick if (__c.__sz() == 0) 76946035553Spatrick __c.__end_.__next_ = __c.__end_.__prev_ = __c.__end_as_link(); 77046035553Spatrick else 77146035553Spatrick __c.__end_.__prev_->__next_ = __c.__end_.__next_->__prev_ = __c.__end_as_link(); 77246035553Spatrick 773*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 77446035553Spatrick __libcpp_db* __db = __get_db(); 77546035553Spatrick __c_node* __cn1 = __db->__find_c_and_lock(this); 776*4bdff4beSrobert __c_node* __cn2 = __db->__find_c(_VSTD::addressof(__c)); 77776d0caaeSpatrick _VSTD::swap(__cn1->beg_, __cn2->beg_); 77876d0caaeSpatrick _VSTD::swap(__cn1->end_, __cn2->end_); 77976d0caaeSpatrick _VSTD::swap(__cn1->cap_, __cn2->cap_); 78046035553Spatrick for (__i_node** __p = __cn1->end_; __p != __cn1->beg_;) 78146035553Spatrick { 78246035553Spatrick --__p; 78346035553Spatrick const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_); 78446035553Spatrick if (__i->__ptr_ == __c.__end_as_link()) 78546035553Spatrick { 78646035553Spatrick __cn2->__add(*__p); 78746035553Spatrick if (--__cn1->end_ != __p) 78876d0caaeSpatrick _VSTD::memmove(__p, __p+1, (__cn1->end_ - __p)*sizeof(__i_node*)); 78946035553Spatrick } 79046035553Spatrick else 79146035553Spatrick (*__p)->__c_ = __cn1; 79246035553Spatrick } 79346035553Spatrick for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;) 79446035553Spatrick { 79546035553Spatrick --__p; 79646035553Spatrick const_iterator* __i = static_cast<const_iterator*>((*__p)->__i_); 79746035553Spatrick if (__i->__ptr_ == __end_as_link()) 79846035553Spatrick { 79946035553Spatrick __cn1->__add(*__p); 80046035553Spatrick if (--__cn2->end_ != __p) 80176d0caaeSpatrick _VSTD::memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*)); 80246035553Spatrick } 80346035553Spatrick else 80446035553Spatrick (*__p)->__c_ = __cn2; 80546035553Spatrick } 80646035553Spatrick __db->unlock(); 80746035553Spatrick#endif 80846035553Spatrick} 80946035553Spatrick 81046035553Spatricktemplate <class _Tp, class _Alloc /*= allocator<_Tp>*/> 81146035553Spatrickclass _LIBCPP_TEMPLATE_VIS list 81246035553Spatrick : private __list_imp<_Tp, _Alloc> 81346035553Spatrick{ 81446035553Spatrick typedef __list_imp<_Tp, _Alloc> base; 81546035553Spatrick typedef typename base::__node __node; 81646035553Spatrick typedef typename base::__node_allocator __node_allocator; 81746035553Spatrick typedef typename base::__node_pointer __node_pointer; 81846035553Spatrick typedef typename base::__node_alloc_traits __node_alloc_traits; 81946035553Spatrick typedef typename base::__node_base __node_base; 82046035553Spatrick typedef typename base::__node_base_pointer __node_base_pointer; 82146035553Spatrick typedef typename base::__link_pointer __link_pointer; 82246035553Spatrick 82346035553Spatrickpublic: 82446035553Spatrick typedef _Tp value_type; 82546035553Spatrick typedef _Alloc allocator_type; 82646035553Spatrick static_assert((is_same<value_type, typename allocator_type::value_type>::value), 82746035553Spatrick "Invalid allocator::value_type"); 82846035553Spatrick typedef value_type& reference; 82946035553Spatrick typedef const value_type& const_reference; 83046035553Spatrick typedef typename base::pointer pointer; 83146035553Spatrick typedef typename base::const_pointer const_pointer; 83246035553Spatrick typedef typename base::size_type size_type; 83346035553Spatrick typedef typename base::difference_type difference_type; 83446035553Spatrick typedef typename base::iterator iterator; 83546035553Spatrick typedef typename base::const_iterator const_iterator; 83646035553Spatrick typedef _VSTD::reverse_iterator<iterator> reverse_iterator; 83746035553Spatrick typedef _VSTD::reverse_iterator<const_iterator> const_reverse_iterator; 83846035553Spatrick#if _LIBCPP_STD_VER > 17 83946035553Spatrick typedef size_type __remove_return_type; 84046035553Spatrick#else 84146035553Spatrick typedef void __remove_return_type; 84246035553Spatrick#endif 84346035553Spatrick 844*4bdff4beSrobert static_assert(is_same<allocator_type, __rebind_alloc<allocator_traits<allocator_type>, value_type> >::value, 845*4bdff4beSrobert "[allocator.requirements] states that rebinding an allocator to the same type should result in the " 846*4bdff4beSrobert "original allocator"); 847*4bdff4beSrobert 84846035553Spatrick _LIBCPP_INLINE_VISIBILITY 84946035553Spatrick list() 85046035553Spatrick _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value) 85146035553Spatrick { 852*4bdff4beSrobert _VSTD::__debug_db_insert_c(this); 85346035553Spatrick } 85446035553Spatrick _LIBCPP_INLINE_VISIBILITY 85546035553Spatrick explicit list(const allocator_type& __a) : base(__a) 85646035553Spatrick { 857*4bdff4beSrobert _VSTD::__debug_db_insert_c(this); 85846035553Spatrick } 85946035553Spatrick explicit list(size_type __n); 86046035553Spatrick#if _LIBCPP_STD_VER > 11 86146035553Spatrick explicit list(size_type __n, const allocator_type& __a); 86246035553Spatrick#endif 86346035553Spatrick list(size_type __n, const value_type& __x); 864*4bdff4beSrobert template <class = __enable_if_t<__is_allocator<_Alloc>::value> > 865*4bdff4beSrobert list(size_type __n, const value_type& __x, const allocator_type& __a) : base(__a) 866*4bdff4beSrobert { 867*4bdff4beSrobert _VSTD::__debug_db_insert_c(this); 868*4bdff4beSrobert for (; __n > 0; --__n) 869*4bdff4beSrobert push_back(__x); 870*4bdff4beSrobert } 871*4bdff4beSrobert 87246035553Spatrick template <class _InpIter> 87346035553Spatrick list(_InpIter __f, _InpIter __l, 874*4bdff4beSrobert __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>* = 0); 87546035553Spatrick template <class _InpIter> 87646035553Spatrick list(_InpIter __f, _InpIter __l, const allocator_type& __a, 877*4bdff4beSrobert __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>* = 0); 87846035553Spatrick 87946035553Spatrick list(const list& __c); 880*4bdff4beSrobert list(const list& __c, const __type_identity_t<allocator_type>& __a); 88146035553Spatrick _LIBCPP_INLINE_VISIBILITY 88246035553Spatrick list& operator=(const list& __c); 88346035553Spatrick#ifndef _LIBCPP_CXX03_LANG 88446035553Spatrick list(initializer_list<value_type> __il); 88546035553Spatrick list(initializer_list<value_type> __il, const allocator_type& __a); 88646035553Spatrick 88746035553Spatrick _LIBCPP_INLINE_VISIBILITY 88846035553Spatrick list(list&& __c) 88946035553Spatrick _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value); 89046035553Spatrick _LIBCPP_INLINE_VISIBILITY 891*4bdff4beSrobert list(list&& __c, const __type_identity_t<allocator_type>& __a); 89246035553Spatrick _LIBCPP_INLINE_VISIBILITY 89346035553Spatrick list& operator=(list&& __c) 89446035553Spatrick _NOEXCEPT_( 89546035553Spatrick __node_alloc_traits::propagate_on_container_move_assignment::value && 89646035553Spatrick is_nothrow_move_assignable<__node_allocator>::value); 89746035553Spatrick 89846035553Spatrick _LIBCPP_INLINE_VISIBILITY 89946035553Spatrick list& operator=(initializer_list<value_type> __il) 90046035553Spatrick {assign(__il.begin(), __il.end()); return *this;} 90146035553Spatrick 90246035553Spatrick _LIBCPP_INLINE_VISIBILITY 90346035553Spatrick void assign(initializer_list<value_type> __il) 90446035553Spatrick {assign(__il.begin(), __il.end());} 90546035553Spatrick#endif // _LIBCPP_CXX03_LANG 90646035553Spatrick 90746035553Spatrick template <class _InpIter> 90846035553Spatrick void assign(_InpIter __f, _InpIter __l, 909*4bdff4beSrobert __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>* = 0); 91046035553Spatrick void assign(size_type __n, const value_type& __x); 91146035553Spatrick 91246035553Spatrick _LIBCPP_INLINE_VISIBILITY 91346035553Spatrick allocator_type get_allocator() const _NOEXCEPT; 91446035553Spatrick 91546035553Spatrick _LIBCPP_INLINE_VISIBILITY 91646035553Spatrick size_type size() const _NOEXCEPT {return base::__sz();} 91746035553Spatrick _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY 91846035553Spatrick bool empty() const _NOEXCEPT {return base::empty();} 91946035553Spatrick _LIBCPP_INLINE_VISIBILITY 92046035553Spatrick size_type max_size() const _NOEXCEPT 92146035553Spatrick { 92276d0caaeSpatrick return _VSTD::min<size_type>( 92346035553Spatrick base::__node_alloc_max_size(), 92446035553Spatrick numeric_limits<difference_type >::max()); 92546035553Spatrick } 92646035553Spatrick 92746035553Spatrick _LIBCPP_INLINE_VISIBILITY 92846035553Spatrick iterator begin() _NOEXCEPT {return base::begin();} 92946035553Spatrick _LIBCPP_INLINE_VISIBILITY 93046035553Spatrick const_iterator begin() const _NOEXCEPT {return base::begin();} 93146035553Spatrick _LIBCPP_INLINE_VISIBILITY 93246035553Spatrick iterator end() _NOEXCEPT {return base::end();} 93346035553Spatrick _LIBCPP_INLINE_VISIBILITY 93446035553Spatrick const_iterator end() const _NOEXCEPT {return base::end();} 93546035553Spatrick _LIBCPP_INLINE_VISIBILITY 93646035553Spatrick const_iterator cbegin() const _NOEXCEPT {return base::begin();} 93746035553Spatrick _LIBCPP_INLINE_VISIBILITY 93846035553Spatrick const_iterator cend() const _NOEXCEPT {return base::end();} 93946035553Spatrick 94046035553Spatrick _LIBCPP_INLINE_VISIBILITY 94146035553Spatrick reverse_iterator rbegin() _NOEXCEPT 94246035553Spatrick {return reverse_iterator(end());} 94346035553Spatrick _LIBCPP_INLINE_VISIBILITY 94446035553Spatrick const_reverse_iterator rbegin() const _NOEXCEPT 94546035553Spatrick {return const_reverse_iterator(end());} 94646035553Spatrick _LIBCPP_INLINE_VISIBILITY 94746035553Spatrick reverse_iterator rend() _NOEXCEPT 94846035553Spatrick {return reverse_iterator(begin());} 94946035553Spatrick _LIBCPP_INLINE_VISIBILITY 95046035553Spatrick const_reverse_iterator rend() const _NOEXCEPT 95146035553Spatrick {return const_reverse_iterator(begin());} 95246035553Spatrick _LIBCPP_INLINE_VISIBILITY 95346035553Spatrick const_reverse_iterator crbegin() const _NOEXCEPT 95446035553Spatrick {return const_reverse_iterator(end());} 95546035553Spatrick _LIBCPP_INLINE_VISIBILITY 95646035553Spatrick const_reverse_iterator crend() const _NOEXCEPT 95746035553Spatrick {return const_reverse_iterator(begin());} 95846035553Spatrick 95946035553Spatrick _LIBCPP_INLINE_VISIBILITY 96046035553Spatrick reference front() 96146035553Spatrick { 96246035553Spatrick _LIBCPP_ASSERT(!empty(), "list::front called on empty list"); 96346035553Spatrick return base::__end_.__next_->__as_node()->__value_; 96446035553Spatrick } 96546035553Spatrick _LIBCPP_INLINE_VISIBILITY 96646035553Spatrick const_reference front() const 96746035553Spatrick { 96846035553Spatrick _LIBCPP_ASSERT(!empty(), "list::front called on empty list"); 96946035553Spatrick return base::__end_.__next_->__as_node()->__value_; 97046035553Spatrick } 97146035553Spatrick _LIBCPP_INLINE_VISIBILITY 97246035553Spatrick reference back() 97346035553Spatrick { 97446035553Spatrick _LIBCPP_ASSERT(!empty(), "list::back called on empty list"); 97546035553Spatrick return base::__end_.__prev_->__as_node()->__value_; 97646035553Spatrick } 97746035553Spatrick _LIBCPP_INLINE_VISIBILITY 97846035553Spatrick const_reference back() const 97946035553Spatrick { 98046035553Spatrick _LIBCPP_ASSERT(!empty(), "list::back called on empty list"); 98146035553Spatrick return base::__end_.__prev_->__as_node()->__value_; 98246035553Spatrick } 98346035553Spatrick 98446035553Spatrick#ifndef _LIBCPP_CXX03_LANG 98546035553Spatrick void push_front(value_type&& __x); 98646035553Spatrick void push_back(value_type&& __x); 98746035553Spatrick 98846035553Spatrick template <class... _Args> 98946035553Spatrick#if _LIBCPP_STD_VER > 14 99046035553Spatrick reference emplace_front(_Args&&... __args); 99146035553Spatrick#else 99246035553Spatrick void emplace_front(_Args&&... __args); 99346035553Spatrick#endif 99446035553Spatrick template <class... _Args> 99546035553Spatrick#if _LIBCPP_STD_VER > 14 99646035553Spatrick reference emplace_back(_Args&&... __args); 99746035553Spatrick#else 99846035553Spatrick void emplace_back(_Args&&... __args); 99946035553Spatrick#endif 100046035553Spatrick template <class... _Args> 100146035553Spatrick iterator emplace(const_iterator __p, _Args&&... __args); 100246035553Spatrick 100346035553Spatrick iterator insert(const_iterator __p, value_type&& __x); 100446035553Spatrick 100546035553Spatrick _LIBCPP_INLINE_VISIBILITY 100646035553Spatrick iterator insert(const_iterator __p, initializer_list<value_type> __il) 100746035553Spatrick {return insert(__p, __il.begin(), __il.end());} 100846035553Spatrick#endif // _LIBCPP_CXX03_LANG 100946035553Spatrick 101046035553Spatrick void push_front(const value_type& __x); 101146035553Spatrick void push_back(const value_type& __x); 101246035553Spatrick 101346035553Spatrick#ifndef _LIBCPP_CXX03_LANG 101446035553Spatrick template <class _Arg> 101546035553Spatrick _LIBCPP_INLINE_VISIBILITY 101646035553Spatrick void __emplace_back(_Arg&& __arg) { emplace_back(_VSTD::forward<_Arg>(__arg)); } 101746035553Spatrick#else 101846035553Spatrick _LIBCPP_INLINE_VISIBILITY 101946035553Spatrick void __emplace_back(value_type const& __arg) { push_back(__arg); } 102046035553Spatrick#endif 102146035553Spatrick 102246035553Spatrick iterator insert(const_iterator __p, const value_type& __x); 102346035553Spatrick iterator insert(const_iterator __p, size_type __n, const value_type& __x); 102446035553Spatrick template <class _InpIter> 102546035553Spatrick iterator insert(const_iterator __p, _InpIter __f, _InpIter __l, 1026*4bdff4beSrobert __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>* = 0); 102746035553Spatrick 102846035553Spatrick _LIBCPP_INLINE_VISIBILITY 102946035553Spatrick void swap(list& __c) 103046035553Spatrick#if _LIBCPP_STD_VER >= 14 103146035553Spatrick _NOEXCEPT 103246035553Spatrick#else 103346035553Spatrick _NOEXCEPT_(!__node_alloc_traits::propagate_on_container_swap::value || 103446035553Spatrick __is_nothrow_swappable<__node_allocator>::value) 103546035553Spatrick#endif 103646035553Spatrick {base::swap(__c);} 103746035553Spatrick _LIBCPP_INLINE_VISIBILITY 103846035553Spatrick void clear() _NOEXCEPT {base::clear();} 103946035553Spatrick 104046035553Spatrick void pop_front(); 104146035553Spatrick void pop_back(); 104246035553Spatrick 104346035553Spatrick iterator erase(const_iterator __p); 104446035553Spatrick iterator erase(const_iterator __f, const_iterator __l); 104546035553Spatrick 104646035553Spatrick void resize(size_type __n); 104746035553Spatrick void resize(size_type __n, const value_type& __x); 104846035553Spatrick 104946035553Spatrick void splice(const_iterator __p, list& __c); 105046035553Spatrick#ifndef _LIBCPP_CXX03_LANG 105146035553Spatrick _LIBCPP_INLINE_VISIBILITY 105246035553Spatrick void splice(const_iterator __p, list&& __c) {splice(__p, __c);} 105346035553Spatrick _LIBCPP_INLINE_VISIBILITY 105446035553Spatrick void splice(const_iterator __p, list&& __c, const_iterator __i) 105546035553Spatrick {splice(__p, __c, __i);} 105646035553Spatrick _LIBCPP_INLINE_VISIBILITY 105746035553Spatrick void splice(const_iterator __p, list&& __c, const_iterator __f, const_iterator __l) 105846035553Spatrick {splice(__p, __c, __f, __l);} 105946035553Spatrick#endif 106046035553Spatrick void splice(const_iterator __p, list& __c, const_iterator __i); 106146035553Spatrick void splice(const_iterator __p, list& __c, const_iterator __f, const_iterator __l); 106246035553Spatrick 106346035553Spatrick __remove_return_type remove(const value_type& __x); 106446035553Spatrick template <class _Pred> __remove_return_type remove_if(_Pred __pred); 106546035553Spatrick _LIBCPP_INLINE_VISIBILITY 1066*4bdff4beSrobert __remove_return_type unique() { return unique(__equal_to()); } 106746035553Spatrick template <class _BinaryPred> 106846035553Spatrick __remove_return_type unique(_BinaryPred __binary_pred); 106946035553Spatrick _LIBCPP_INLINE_VISIBILITY 107046035553Spatrick void merge(list& __c); 107146035553Spatrick#ifndef _LIBCPP_CXX03_LANG 107246035553Spatrick _LIBCPP_INLINE_VISIBILITY 107346035553Spatrick void merge(list&& __c) {merge(__c);} 107446035553Spatrick 107546035553Spatrick template <class _Comp> 107646035553Spatrick _LIBCPP_INLINE_VISIBILITY 107746035553Spatrick void merge(list&& __c, _Comp __comp) {merge(__c, __comp);} 107846035553Spatrick#endif 107946035553Spatrick template <class _Comp> 108046035553Spatrick void merge(list& __c, _Comp __comp); 108146035553Spatrick 108246035553Spatrick _LIBCPP_INLINE_VISIBILITY 108346035553Spatrick void sort(); 108446035553Spatrick template <class _Comp> 108546035553Spatrick _LIBCPP_INLINE_VISIBILITY 108646035553Spatrick void sort(_Comp __comp); 108746035553Spatrick 108846035553Spatrick void reverse() _NOEXCEPT; 108946035553Spatrick 109046035553Spatrick bool __invariants() const; 109146035553Spatrick 109246035553Spatrick typedef __allocator_destructor<__node_allocator> __node_destructor; 109346035553Spatrick typedef unique_ptr<__node, __node_destructor> __hold_pointer; 109446035553Spatrick 109546035553Spatrick _LIBCPP_INLINE_VISIBILITY 109646035553Spatrick __hold_pointer __allocate_node(__node_allocator& __na) { 109746035553Spatrick __node_pointer __p = __node_alloc_traits::allocate(__na, 1); 109846035553Spatrick __p->__prev_ = nullptr; 109946035553Spatrick return __hold_pointer(__p, __node_destructor(__na, 1)); 110046035553Spatrick } 110146035553Spatrick 1102*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 110346035553Spatrick 110446035553Spatrick bool __dereferenceable(const const_iterator* __i) const; 110546035553Spatrick bool __decrementable(const const_iterator* __i) const; 110646035553Spatrick bool __addable(const const_iterator* __i, ptrdiff_t __n) const; 110746035553Spatrick bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const; 110846035553Spatrick 1109*4bdff4beSrobert#endif // _LIBCPP_ENABLE_DEBUG_MODE 111046035553Spatrick 111146035553Spatrickprivate: 111246035553Spatrick _LIBCPP_INLINE_VISIBILITY 111346035553Spatrick static void __link_nodes (__link_pointer __p, __link_pointer __f, __link_pointer __l); 111446035553Spatrick _LIBCPP_INLINE_VISIBILITY 111546035553Spatrick void __link_nodes_at_front(__link_pointer __f, __link_pointer __l); 111646035553Spatrick _LIBCPP_INLINE_VISIBILITY 111746035553Spatrick void __link_nodes_at_back (__link_pointer __f, __link_pointer __l); 111846035553Spatrick iterator __iterator(size_type __n); 111946035553Spatrick template <class _Comp> 112046035553Spatrick static iterator __sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp); 112146035553Spatrick 112246035553Spatrick void __move_assign(list& __c, true_type) 112346035553Spatrick _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value); 112446035553Spatrick void __move_assign(list& __c, false_type); 112546035553Spatrick}; 112646035553Spatrick 1127*4bdff4beSrobert#if _LIBCPP_STD_VER >= 17 112846035553Spatricktemplate<class _InputIterator, 112976d0caaeSpatrick class _Alloc = allocator<__iter_value_type<_InputIterator>>, 1130*4bdff4beSrobert class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 1131*4bdff4beSrobert class = enable_if_t<__is_allocator<_Alloc>::value> 113246035553Spatrick > 113346035553Spatricklist(_InputIterator, _InputIterator) 113476d0caaeSpatrick -> list<__iter_value_type<_InputIterator>, _Alloc>; 113546035553Spatrick 113646035553Spatricktemplate<class _InputIterator, 113746035553Spatrick class _Alloc, 1138*4bdff4beSrobert class = enable_if_t<__is_cpp17_input_iterator<_InputIterator>::value>, 1139*4bdff4beSrobert class = enable_if_t<__is_allocator<_Alloc>::value> 114046035553Spatrick > 114146035553Spatricklist(_InputIterator, _InputIterator, _Alloc) 114276d0caaeSpatrick -> list<__iter_value_type<_InputIterator>, _Alloc>; 114346035553Spatrick#endif 114446035553Spatrick 114546035553Spatrick// Link in nodes [__f, __l] just prior to __p 114646035553Spatricktemplate <class _Tp, class _Alloc> 114746035553Spatrickinline 114846035553Spatrickvoid 114946035553Spatricklist<_Tp, _Alloc>::__link_nodes(__link_pointer __p, __link_pointer __f, __link_pointer __l) 115046035553Spatrick{ 115146035553Spatrick __p->__prev_->__next_ = __f; 115246035553Spatrick __f->__prev_ = __p->__prev_; 115346035553Spatrick __p->__prev_ = __l; 115446035553Spatrick __l->__next_ = __p; 115546035553Spatrick} 115646035553Spatrick 115746035553Spatrick// Link in nodes [__f, __l] at the front of the list 115846035553Spatricktemplate <class _Tp, class _Alloc> 115946035553Spatrickinline 116046035553Spatrickvoid 116146035553Spatricklist<_Tp, _Alloc>::__link_nodes_at_front(__link_pointer __f, __link_pointer __l) 116246035553Spatrick{ 116346035553Spatrick __f->__prev_ = base::__end_as_link(); 116446035553Spatrick __l->__next_ = base::__end_.__next_; 116546035553Spatrick __l->__next_->__prev_ = __l; 116646035553Spatrick base::__end_.__next_ = __f; 116746035553Spatrick} 116846035553Spatrick 116946035553Spatrick// Link in nodes [__f, __l] at the back of the list 117046035553Spatricktemplate <class _Tp, class _Alloc> 117146035553Spatrickinline 117246035553Spatrickvoid 117346035553Spatricklist<_Tp, _Alloc>::__link_nodes_at_back(__link_pointer __f, __link_pointer __l) 117446035553Spatrick{ 117546035553Spatrick __l->__next_ = base::__end_as_link(); 117646035553Spatrick __f->__prev_ = base::__end_.__prev_; 117746035553Spatrick __f->__prev_->__next_ = __f; 117846035553Spatrick base::__end_.__prev_ = __l; 117946035553Spatrick} 118046035553Spatrick 118146035553Spatrick 118246035553Spatricktemplate <class _Tp, class _Alloc> 118346035553Spatrickinline 118446035553Spatricktypename list<_Tp, _Alloc>::iterator 118546035553Spatricklist<_Tp, _Alloc>::__iterator(size_type __n) 118646035553Spatrick{ 118746035553Spatrick return __n <= base::__sz() / 2 ? _VSTD::next(begin(), __n) 118846035553Spatrick : _VSTD::prev(end(), base::__sz() - __n); 118946035553Spatrick} 119046035553Spatrick 119146035553Spatricktemplate <class _Tp, class _Alloc> 119246035553Spatricklist<_Tp, _Alloc>::list(size_type __n) 119346035553Spatrick{ 1194*4bdff4beSrobert _VSTD::__debug_db_insert_c(this); 119546035553Spatrick for (; __n > 0; --__n) 119646035553Spatrick#ifndef _LIBCPP_CXX03_LANG 119746035553Spatrick emplace_back(); 119846035553Spatrick#else 119946035553Spatrick push_back(value_type()); 120046035553Spatrick#endif 120146035553Spatrick} 120246035553Spatrick 120346035553Spatrick#if _LIBCPP_STD_VER > 11 120446035553Spatricktemplate <class _Tp, class _Alloc> 120546035553Spatricklist<_Tp, _Alloc>::list(size_type __n, const allocator_type& __a) : base(__a) 120646035553Spatrick{ 1207*4bdff4beSrobert _VSTD::__debug_db_insert_c(this); 120846035553Spatrick for (; __n > 0; --__n) 120946035553Spatrick emplace_back(); 121046035553Spatrick} 121146035553Spatrick#endif 121246035553Spatrick 121346035553Spatricktemplate <class _Tp, class _Alloc> 121446035553Spatricklist<_Tp, _Alloc>::list(size_type __n, const value_type& __x) 121546035553Spatrick{ 1216*4bdff4beSrobert _VSTD::__debug_db_insert_c(this); 121746035553Spatrick for (; __n > 0; --__n) 121846035553Spatrick push_back(__x); 121946035553Spatrick} 122046035553Spatrick 122146035553Spatricktemplate <class _Tp, class _Alloc> 122246035553Spatricktemplate <class _InpIter> 122346035553Spatricklist<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l, 1224*4bdff4beSrobert __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>*) 122546035553Spatrick{ 1226*4bdff4beSrobert _VSTD::__debug_db_insert_c(this); 122746035553Spatrick for (; __f != __l; ++__f) 122846035553Spatrick __emplace_back(*__f); 122946035553Spatrick} 123046035553Spatrick 123146035553Spatricktemplate <class _Tp, class _Alloc> 123246035553Spatricktemplate <class _InpIter> 123346035553Spatricklist<_Tp, _Alloc>::list(_InpIter __f, _InpIter __l, const allocator_type& __a, 1234*4bdff4beSrobert __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>*) 123546035553Spatrick : base(__a) 123646035553Spatrick{ 1237*4bdff4beSrobert _VSTD::__debug_db_insert_c(this); 123846035553Spatrick for (; __f != __l; ++__f) 123946035553Spatrick __emplace_back(*__f); 124046035553Spatrick} 124146035553Spatrick 124246035553Spatricktemplate <class _Tp, class _Alloc> 124346035553Spatricklist<_Tp, _Alloc>::list(const list& __c) 124446035553Spatrick : base(__node_alloc_traits::select_on_container_copy_construction( 124546035553Spatrick __c.__node_alloc())) { 1246*4bdff4beSrobert _VSTD::__debug_db_insert_c(this); 124746035553Spatrick for (const_iterator __i = __c.begin(), __e = __c.end(); __i != __e; ++__i) 124846035553Spatrick push_back(*__i); 124946035553Spatrick} 125046035553Spatrick 125146035553Spatricktemplate <class _Tp, class _Alloc> 1252*4bdff4beSrobertlist<_Tp, _Alloc>::list(const list& __c, const __type_identity_t<allocator_type>& __a) 125346035553Spatrick : base(__a) 125446035553Spatrick{ 1255*4bdff4beSrobert _VSTD::__debug_db_insert_c(this); 125646035553Spatrick for (const_iterator __i = __c.begin(), __e = __c.end(); __i != __e; ++__i) 125746035553Spatrick push_back(*__i); 125846035553Spatrick} 125946035553Spatrick 126046035553Spatrick#ifndef _LIBCPP_CXX03_LANG 126146035553Spatrick 126246035553Spatricktemplate <class _Tp, class _Alloc> 126346035553Spatricklist<_Tp, _Alloc>::list(initializer_list<value_type> __il, const allocator_type& __a) 126446035553Spatrick : base(__a) 126546035553Spatrick{ 1266*4bdff4beSrobert _VSTD::__debug_db_insert_c(this); 126746035553Spatrick for (typename initializer_list<value_type>::const_iterator __i = __il.begin(), 126846035553Spatrick __e = __il.end(); __i != __e; ++__i) 126946035553Spatrick push_back(*__i); 127046035553Spatrick} 127146035553Spatrick 127246035553Spatricktemplate <class _Tp, class _Alloc> 127346035553Spatricklist<_Tp, _Alloc>::list(initializer_list<value_type> __il) 127446035553Spatrick{ 1275*4bdff4beSrobert _VSTD::__debug_db_insert_c(this); 127646035553Spatrick for (typename initializer_list<value_type>::const_iterator __i = __il.begin(), 127746035553Spatrick __e = __il.end(); __i != __e; ++__i) 127846035553Spatrick push_back(*__i); 127946035553Spatrick} 128046035553Spatrick 128146035553Spatricktemplate <class _Tp, class _Alloc> 128246035553Spatrickinline list<_Tp, _Alloc>::list(list&& __c) 128346035553Spatrick _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value) 128446035553Spatrick : base(_VSTD::move(__c.__node_alloc())) { 1285*4bdff4beSrobert _VSTD::__debug_db_insert_c(this); 128646035553Spatrick splice(end(), __c); 128746035553Spatrick} 128846035553Spatrick 128946035553Spatricktemplate <class _Tp, class _Alloc> 129046035553Spatrickinline 1291*4bdff4beSrobertlist<_Tp, _Alloc>::list(list&& __c, const __type_identity_t<allocator_type>& __a) 129246035553Spatrick : base(__a) 129346035553Spatrick{ 1294*4bdff4beSrobert _VSTD::__debug_db_insert_c(this); 129546035553Spatrick if (__a == __c.get_allocator()) 129646035553Spatrick splice(end(), __c); 129746035553Spatrick else 129846035553Spatrick { 129946035553Spatrick typedef move_iterator<iterator> _Ip; 130046035553Spatrick assign(_Ip(__c.begin()), _Ip(__c.end())); 130146035553Spatrick } 130246035553Spatrick} 130346035553Spatrick 130446035553Spatricktemplate <class _Tp, class _Alloc> 130546035553Spatrickinline 130646035553Spatricklist<_Tp, _Alloc>& 130746035553Spatricklist<_Tp, _Alloc>::operator=(list&& __c) 130846035553Spatrick _NOEXCEPT_( 130946035553Spatrick __node_alloc_traits::propagate_on_container_move_assignment::value && 131046035553Spatrick is_nothrow_move_assignable<__node_allocator>::value) 131146035553Spatrick{ 131246035553Spatrick __move_assign(__c, integral_constant<bool, 131346035553Spatrick __node_alloc_traits::propagate_on_container_move_assignment::value>()); 131446035553Spatrick return *this; 131546035553Spatrick} 131646035553Spatrick 131746035553Spatricktemplate <class _Tp, class _Alloc> 131846035553Spatrickvoid 131946035553Spatricklist<_Tp, _Alloc>::__move_assign(list& __c, false_type) 132046035553Spatrick{ 132146035553Spatrick if (base::__node_alloc() != __c.__node_alloc()) 132246035553Spatrick { 132346035553Spatrick typedef move_iterator<iterator> _Ip; 132446035553Spatrick assign(_Ip(__c.begin()), _Ip(__c.end())); 132546035553Spatrick } 132646035553Spatrick else 132746035553Spatrick __move_assign(__c, true_type()); 132846035553Spatrick} 132946035553Spatrick 133046035553Spatricktemplate <class _Tp, class _Alloc> 133146035553Spatrickvoid 133246035553Spatricklist<_Tp, _Alloc>::__move_assign(list& __c, true_type) 133346035553Spatrick _NOEXCEPT_(is_nothrow_move_assignable<__node_allocator>::value) 133446035553Spatrick{ 133546035553Spatrick clear(); 133646035553Spatrick base::__move_assign_alloc(__c); 133746035553Spatrick splice(end(), __c); 133846035553Spatrick} 133946035553Spatrick 134046035553Spatrick#endif // _LIBCPP_CXX03_LANG 134146035553Spatrick 134246035553Spatricktemplate <class _Tp, class _Alloc> 134346035553Spatrickinline 134446035553Spatricklist<_Tp, _Alloc>& 134546035553Spatricklist<_Tp, _Alloc>::operator=(const list& __c) 134646035553Spatrick{ 1347*4bdff4beSrobert if (this != _VSTD::addressof(__c)) 134846035553Spatrick { 134946035553Spatrick base::__copy_assign_alloc(__c); 135046035553Spatrick assign(__c.begin(), __c.end()); 135146035553Spatrick } 135246035553Spatrick return *this; 135346035553Spatrick} 135446035553Spatrick 135546035553Spatricktemplate <class _Tp, class _Alloc> 135646035553Spatricktemplate <class _InpIter> 135746035553Spatrickvoid 135846035553Spatricklist<_Tp, _Alloc>::assign(_InpIter __f, _InpIter __l, 1359*4bdff4beSrobert __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>*) 136046035553Spatrick{ 136146035553Spatrick iterator __i = begin(); 136246035553Spatrick iterator __e = end(); 1363*4bdff4beSrobert for (; __f != __l && __i != __e; ++__f, (void) ++__i) 136446035553Spatrick *__i = *__f; 136546035553Spatrick if (__i == __e) 136646035553Spatrick insert(__e, __f, __l); 136746035553Spatrick else 136846035553Spatrick erase(__i, __e); 1369*4bdff4beSrobert std::__debug_db_invalidate_all(this); 137046035553Spatrick} 137146035553Spatrick 137246035553Spatricktemplate <class _Tp, class _Alloc> 137346035553Spatrickvoid 137446035553Spatricklist<_Tp, _Alloc>::assign(size_type __n, const value_type& __x) 137546035553Spatrick{ 137646035553Spatrick iterator __i = begin(); 137746035553Spatrick iterator __e = end(); 1378*4bdff4beSrobert for (; __n > 0 && __i != __e; --__n, (void) ++__i) 137946035553Spatrick *__i = __x; 138046035553Spatrick if (__i == __e) 138146035553Spatrick insert(__e, __n, __x); 138246035553Spatrick else 138346035553Spatrick erase(__i, __e); 1384*4bdff4beSrobert std::__debug_db_invalidate_all(this); 138546035553Spatrick} 138646035553Spatrick 138746035553Spatricktemplate <class _Tp, class _Alloc> 138846035553Spatrickinline 138946035553Spatrick_Alloc 139046035553Spatricklist<_Tp, _Alloc>::get_allocator() const _NOEXCEPT 139146035553Spatrick{ 139246035553Spatrick return allocator_type(base::__node_alloc()); 139346035553Spatrick} 139446035553Spatrick 139546035553Spatricktemplate <class _Tp, class _Alloc> 139646035553Spatricktypename list<_Tp, _Alloc>::iterator 139746035553Spatricklist<_Tp, _Alloc>::insert(const_iterator __p, const value_type& __x) 139846035553Spatrick{ 1399*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, 1400*4bdff4beSrobert "list::insert(iterator, x) called with an iterator not referring to this list"); 140146035553Spatrick __node_allocator& __na = base::__node_alloc(); 140246035553Spatrick __hold_pointer __hold = __allocate_node(__na); 140346035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); 140446035553Spatrick __link_nodes(__p.__ptr_, __hold->__as_link(), __hold->__as_link()); 140546035553Spatrick ++base::__sz(); 140646035553Spatrick return iterator(__hold.release()->__as_link(), this); 140746035553Spatrick} 140846035553Spatrick 140946035553Spatricktemplate <class _Tp, class _Alloc> 141046035553Spatricktypename list<_Tp, _Alloc>::iterator 141146035553Spatricklist<_Tp, _Alloc>::insert(const_iterator __p, size_type __n, const value_type& __x) 141246035553Spatrick{ 1413*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, 1414*4bdff4beSrobert "list::insert(iterator, n, x) called with an iterator not referring to this list"); 141546035553Spatrick iterator __r(__p.__ptr_, this); 141646035553Spatrick if (__n > 0) 141746035553Spatrick { 141846035553Spatrick size_type __ds = 0; 141946035553Spatrick __node_allocator& __na = base::__node_alloc(); 142046035553Spatrick __hold_pointer __hold = __allocate_node(__na); 142146035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); 142246035553Spatrick ++__ds; 142346035553Spatrick __r = iterator(__hold->__as_link(), this); 142446035553Spatrick __hold.release(); 142546035553Spatrick iterator __e = __r; 142646035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 142746035553Spatrick try 142846035553Spatrick { 142946035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 1430*4bdff4beSrobert for (--__n; __n != 0; --__n, (void) ++__e, ++__ds) 143146035553Spatrick { 143246035553Spatrick __hold.reset(__node_alloc_traits::allocate(__na, 1)); 143346035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); 143446035553Spatrick __e.__ptr_->__next_ = __hold->__as_link(); 143546035553Spatrick __hold->__prev_ = __e.__ptr_; 143646035553Spatrick __hold.release(); 143746035553Spatrick } 143846035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 143946035553Spatrick } 144046035553Spatrick catch (...) 144146035553Spatrick { 144246035553Spatrick while (true) 144346035553Spatrick { 144446035553Spatrick __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e)); 144546035553Spatrick __link_pointer __prev = __e.__ptr_->__prev_; 144646035553Spatrick __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1); 144746035553Spatrick if (__prev == 0) 144846035553Spatrick break; 144946035553Spatrick __e = iterator(__prev, this); 145046035553Spatrick } 145146035553Spatrick throw; 145246035553Spatrick } 145346035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 145446035553Spatrick __link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_); 145546035553Spatrick base::__sz() += __ds; 145646035553Spatrick } 145746035553Spatrick return __r; 145846035553Spatrick} 145946035553Spatrick 146046035553Spatricktemplate <class _Tp, class _Alloc> 146146035553Spatricktemplate <class _InpIter> 146246035553Spatricktypename list<_Tp, _Alloc>::iterator 146346035553Spatricklist<_Tp, _Alloc>::insert(const_iterator __p, _InpIter __f, _InpIter __l, 1464*4bdff4beSrobert __enable_if_t<__is_cpp17_input_iterator<_InpIter>::value>*) 146546035553Spatrick{ 1466*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, 1467*4bdff4beSrobert "list::insert(iterator, range) called with an iterator not referring to this list"); 146846035553Spatrick iterator __r(__p.__ptr_, this); 146946035553Spatrick if (__f != __l) 147046035553Spatrick { 147146035553Spatrick size_type __ds = 0; 147246035553Spatrick __node_allocator& __na = base::__node_alloc(); 147346035553Spatrick __hold_pointer __hold = __allocate_node(__na); 147446035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f); 147546035553Spatrick ++__ds; 147646035553Spatrick __r = iterator(__hold.get()->__as_link(), this); 147746035553Spatrick __hold.release(); 147846035553Spatrick iterator __e = __r; 147946035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 148046035553Spatrick try 148146035553Spatrick { 148246035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 1483*4bdff4beSrobert for (++__f; __f != __l; ++__f, (void) ++__e, ++__ds) 148446035553Spatrick { 148546035553Spatrick __hold.reset(__node_alloc_traits::allocate(__na, 1)); 148646035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), *__f); 148746035553Spatrick __e.__ptr_->__next_ = __hold.get()->__as_link(); 148846035553Spatrick __hold->__prev_ = __e.__ptr_; 148946035553Spatrick __hold.release(); 149046035553Spatrick } 149146035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 149246035553Spatrick } 149346035553Spatrick catch (...) 149446035553Spatrick { 149546035553Spatrick while (true) 149646035553Spatrick { 149746035553Spatrick __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e)); 149846035553Spatrick __link_pointer __prev = __e.__ptr_->__prev_; 149946035553Spatrick __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1); 150046035553Spatrick if (__prev == 0) 150146035553Spatrick break; 150246035553Spatrick __e = iterator(__prev, this); 150346035553Spatrick } 150446035553Spatrick throw; 150546035553Spatrick } 150646035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 150746035553Spatrick __link_nodes(__p.__ptr_, __r.__ptr_, __e.__ptr_); 150846035553Spatrick base::__sz() += __ds; 150946035553Spatrick } 151046035553Spatrick return __r; 151146035553Spatrick} 151246035553Spatrick 151346035553Spatricktemplate <class _Tp, class _Alloc> 151446035553Spatrickvoid 151546035553Spatricklist<_Tp, _Alloc>::push_front(const value_type& __x) 151646035553Spatrick{ 151746035553Spatrick __node_allocator& __na = base::__node_alloc(); 151846035553Spatrick __hold_pointer __hold = __allocate_node(__na); 151946035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); 152046035553Spatrick __link_pointer __nl = __hold->__as_link(); 152146035553Spatrick __link_nodes_at_front(__nl, __nl); 152246035553Spatrick ++base::__sz(); 152346035553Spatrick __hold.release(); 152446035553Spatrick} 152546035553Spatrick 152646035553Spatricktemplate <class _Tp, class _Alloc> 152746035553Spatrickvoid 152846035553Spatricklist<_Tp, _Alloc>::push_back(const value_type& __x) 152946035553Spatrick{ 153046035553Spatrick __node_allocator& __na = base::__node_alloc(); 153146035553Spatrick __hold_pointer __hold = __allocate_node(__na); 153246035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); 153346035553Spatrick __link_nodes_at_back(__hold.get()->__as_link(), __hold.get()->__as_link()); 153446035553Spatrick ++base::__sz(); 153546035553Spatrick __hold.release(); 153646035553Spatrick} 153746035553Spatrick 153846035553Spatrick#ifndef _LIBCPP_CXX03_LANG 153946035553Spatrick 154046035553Spatricktemplate <class _Tp, class _Alloc> 154146035553Spatrickvoid 154246035553Spatricklist<_Tp, _Alloc>::push_front(value_type&& __x) 154346035553Spatrick{ 154446035553Spatrick __node_allocator& __na = base::__node_alloc(); 154546035553Spatrick __hold_pointer __hold = __allocate_node(__na); 154646035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x)); 154746035553Spatrick __link_nodes_at_front(__hold.get()->__as_link(), __hold.get()->__as_link()); 154846035553Spatrick ++base::__sz(); 154946035553Spatrick __hold.release(); 155046035553Spatrick} 155146035553Spatrick 155246035553Spatricktemplate <class _Tp, class _Alloc> 155346035553Spatrickvoid 155446035553Spatricklist<_Tp, _Alloc>::push_back(value_type&& __x) 155546035553Spatrick{ 155646035553Spatrick __node_allocator& __na = base::__node_alloc(); 155746035553Spatrick __hold_pointer __hold = __allocate_node(__na); 155846035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x)); 155946035553Spatrick __link_nodes_at_back(__hold.get()->__as_link(), __hold.get()->__as_link()); 156046035553Spatrick ++base::__sz(); 156146035553Spatrick __hold.release(); 156246035553Spatrick} 156346035553Spatrick 156446035553Spatricktemplate <class _Tp, class _Alloc> 156546035553Spatricktemplate <class... _Args> 156646035553Spatrick#if _LIBCPP_STD_VER > 14 156746035553Spatricktypename list<_Tp, _Alloc>::reference 156846035553Spatrick#else 156946035553Spatrickvoid 157046035553Spatrick#endif 157146035553Spatricklist<_Tp, _Alloc>::emplace_front(_Args&&... __args) 157246035553Spatrick{ 157346035553Spatrick __node_allocator& __na = base::__node_alloc(); 157446035553Spatrick __hold_pointer __hold = __allocate_node(__na); 157546035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...); 157646035553Spatrick __link_nodes_at_front(__hold.get()->__as_link(), __hold.get()->__as_link()); 157746035553Spatrick ++base::__sz(); 157846035553Spatrick#if _LIBCPP_STD_VER > 14 157946035553Spatrick return __hold.release()->__value_; 158046035553Spatrick#else 158146035553Spatrick __hold.release(); 158246035553Spatrick#endif 158346035553Spatrick} 158446035553Spatrick 158546035553Spatricktemplate <class _Tp, class _Alloc> 158646035553Spatricktemplate <class... _Args> 158746035553Spatrick#if _LIBCPP_STD_VER > 14 158846035553Spatricktypename list<_Tp, _Alloc>::reference 158946035553Spatrick#else 159046035553Spatrickvoid 159146035553Spatrick#endif 159246035553Spatricklist<_Tp, _Alloc>::emplace_back(_Args&&... __args) 159346035553Spatrick{ 159446035553Spatrick __node_allocator& __na = base::__node_alloc(); 159546035553Spatrick __hold_pointer __hold = __allocate_node(__na); 159646035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...); 159746035553Spatrick __link_pointer __nl = __hold->__as_link(); 159846035553Spatrick __link_nodes_at_back(__nl, __nl); 159946035553Spatrick ++base::__sz(); 160046035553Spatrick#if _LIBCPP_STD_VER > 14 160146035553Spatrick return __hold.release()->__value_; 160246035553Spatrick#else 160346035553Spatrick __hold.release(); 160446035553Spatrick#endif 160546035553Spatrick} 160646035553Spatrick 160746035553Spatricktemplate <class _Tp, class _Alloc> 160846035553Spatricktemplate <class... _Args> 160946035553Spatricktypename list<_Tp, _Alloc>::iterator 161046035553Spatricklist<_Tp, _Alloc>::emplace(const_iterator __p, _Args&&... __args) 161146035553Spatrick{ 1612*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, 1613*4bdff4beSrobert "list::emplace(iterator, args...) called with an iterator not referring to this list"); 161446035553Spatrick __node_allocator& __na = base::__node_alloc(); 161546035553Spatrick __hold_pointer __hold = __allocate_node(__na); 161646035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::forward<_Args>(__args)...); 161746035553Spatrick __link_pointer __nl = __hold.get()->__as_link(); 161846035553Spatrick __link_nodes(__p.__ptr_, __nl, __nl); 161946035553Spatrick ++base::__sz(); 162046035553Spatrick __hold.release(); 162146035553Spatrick return iterator(__nl, this); 162246035553Spatrick} 162346035553Spatrick 162446035553Spatricktemplate <class _Tp, class _Alloc> 162546035553Spatricktypename list<_Tp, _Alloc>::iterator 162646035553Spatricklist<_Tp, _Alloc>::insert(const_iterator __p, value_type&& __x) 162746035553Spatrick{ 1628*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, 1629*4bdff4beSrobert "list::insert(iterator, x) called with an iterator not referring to this list"); 163046035553Spatrick __node_allocator& __na = base::__node_alloc(); 163146035553Spatrick __hold_pointer __hold = __allocate_node(__na); 163246035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), _VSTD::move(__x)); 163346035553Spatrick __link_pointer __nl = __hold->__as_link(); 163446035553Spatrick __link_nodes(__p.__ptr_, __nl, __nl); 163546035553Spatrick ++base::__sz(); 163646035553Spatrick __hold.release(); 163746035553Spatrick return iterator(__nl, this); 163846035553Spatrick} 163946035553Spatrick 164046035553Spatrick#endif // _LIBCPP_CXX03_LANG 164146035553Spatrick 164246035553Spatricktemplate <class _Tp, class _Alloc> 164346035553Spatrickvoid 164446035553Spatricklist<_Tp, _Alloc>::pop_front() 164546035553Spatrick{ 164646035553Spatrick _LIBCPP_ASSERT(!empty(), "list::pop_front() called with empty list"); 164746035553Spatrick __node_allocator& __na = base::__node_alloc(); 164846035553Spatrick __link_pointer __n = base::__end_.__next_; 164946035553Spatrick base::__unlink_nodes(__n, __n); 165046035553Spatrick --base::__sz(); 1651*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 165246035553Spatrick __c_node* __c = __get_db()->__find_c_and_lock(this); 165346035553Spatrick for (__i_node** __p = __c->end_; __p != __c->beg_; ) 165446035553Spatrick { 165546035553Spatrick --__p; 165646035553Spatrick iterator* __i = static_cast<iterator*>((*__p)->__i_); 165746035553Spatrick if (__i->__ptr_ == __n) 165846035553Spatrick { 165946035553Spatrick (*__p)->__c_ = nullptr; 166046035553Spatrick if (--__c->end_ != __p) 166176d0caaeSpatrick _VSTD::memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*)); 166246035553Spatrick } 166346035553Spatrick } 166446035553Spatrick __get_db()->unlock(); 166546035553Spatrick#endif 166646035553Spatrick __node_pointer __np = __n->__as_node(); 166746035553Spatrick __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_)); 166846035553Spatrick __node_alloc_traits::deallocate(__na, __np, 1); 166946035553Spatrick} 167046035553Spatrick 167146035553Spatricktemplate <class _Tp, class _Alloc> 167246035553Spatrickvoid 167346035553Spatricklist<_Tp, _Alloc>::pop_back() 167446035553Spatrick{ 167576d0caaeSpatrick _LIBCPP_ASSERT(!empty(), "list::pop_back() called on an empty list"); 167646035553Spatrick __node_allocator& __na = base::__node_alloc(); 167746035553Spatrick __link_pointer __n = base::__end_.__prev_; 167846035553Spatrick base::__unlink_nodes(__n, __n); 167946035553Spatrick --base::__sz(); 1680*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 168146035553Spatrick __c_node* __c = __get_db()->__find_c_and_lock(this); 168246035553Spatrick for (__i_node** __p = __c->end_; __p != __c->beg_; ) 168346035553Spatrick { 168446035553Spatrick --__p; 168546035553Spatrick iterator* __i = static_cast<iterator*>((*__p)->__i_); 168646035553Spatrick if (__i->__ptr_ == __n) 168746035553Spatrick { 168846035553Spatrick (*__p)->__c_ = nullptr; 168946035553Spatrick if (--__c->end_ != __p) 169076d0caaeSpatrick _VSTD::memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*)); 169146035553Spatrick } 169246035553Spatrick } 169346035553Spatrick __get_db()->unlock(); 169446035553Spatrick#endif 169546035553Spatrick __node_pointer __np = __n->__as_node(); 169646035553Spatrick __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_)); 169746035553Spatrick __node_alloc_traits::deallocate(__na, __np, 1); 169846035553Spatrick} 169946035553Spatrick 170046035553Spatricktemplate <class _Tp, class _Alloc> 170146035553Spatricktypename list<_Tp, _Alloc>::iterator 170246035553Spatricklist<_Tp, _Alloc>::erase(const_iterator __p) 170346035553Spatrick{ 1704*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, 1705*4bdff4beSrobert "list::erase(iterator) called with an iterator not referring to this list"); 170646035553Spatrick _LIBCPP_ASSERT(__p != end(), 170746035553Spatrick "list::erase(iterator) called with a non-dereferenceable iterator"); 170846035553Spatrick __node_allocator& __na = base::__node_alloc(); 170946035553Spatrick __link_pointer __n = __p.__ptr_; 171046035553Spatrick __link_pointer __r = __n->__next_; 171146035553Spatrick base::__unlink_nodes(__n, __n); 171246035553Spatrick --base::__sz(); 1713*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 171446035553Spatrick __c_node* __c = __get_db()->__find_c_and_lock(this); 171546035553Spatrick for (__i_node** __ip = __c->end_; __ip != __c->beg_; ) 171646035553Spatrick { 171746035553Spatrick --__ip; 171846035553Spatrick iterator* __i = static_cast<iterator*>((*__ip)->__i_); 171946035553Spatrick if (__i->__ptr_ == __n) 172046035553Spatrick { 172146035553Spatrick (*__ip)->__c_ = nullptr; 172246035553Spatrick if (--__c->end_ != __ip) 172376d0caaeSpatrick _VSTD::memmove(__ip, __ip+1, (__c->end_ - __ip)*sizeof(__i_node*)); 172446035553Spatrick } 172546035553Spatrick } 172646035553Spatrick __get_db()->unlock(); 172746035553Spatrick#endif 172846035553Spatrick __node_pointer __np = __n->__as_node(); 172946035553Spatrick __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_)); 173046035553Spatrick __node_alloc_traits::deallocate(__na, __np, 1); 173146035553Spatrick return iterator(__r, this); 173246035553Spatrick} 173346035553Spatrick 173446035553Spatricktemplate <class _Tp, class _Alloc> 173546035553Spatricktypename list<_Tp, _Alloc>::iterator 173646035553Spatricklist<_Tp, _Alloc>::erase(const_iterator __f, const_iterator __l) 173746035553Spatrick{ 1738*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__f)) == this, 1739*4bdff4beSrobert "list::erase(iterator, iterator) called with an iterator not referring to this list"); 1740*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__l)) == this, 1741*4bdff4beSrobert "list::erase(iterator, iterator) called with an iterator not referring to this list"); 174246035553Spatrick if (__f != __l) 174346035553Spatrick { 174446035553Spatrick __node_allocator& __na = base::__node_alloc(); 174546035553Spatrick base::__unlink_nodes(__f.__ptr_, __l.__ptr_->__prev_); 174646035553Spatrick while (__f != __l) 174746035553Spatrick { 174846035553Spatrick __link_pointer __n = __f.__ptr_; 174946035553Spatrick ++__f; 175046035553Spatrick --base::__sz(); 1751*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 175246035553Spatrick __c_node* __c = __get_db()->__find_c_and_lock(this); 175346035553Spatrick for (__i_node** __p = __c->end_; __p != __c->beg_; ) 175446035553Spatrick { 175546035553Spatrick --__p; 175646035553Spatrick iterator* __i = static_cast<iterator*>((*__p)->__i_); 175746035553Spatrick if (__i->__ptr_ == __n) 175846035553Spatrick { 175946035553Spatrick (*__p)->__c_ = nullptr; 176046035553Spatrick if (--__c->end_ != __p) 176176d0caaeSpatrick _VSTD::memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*)); 176246035553Spatrick } 176346035553Spatrick } 176446035553Spatrick __get_db()->unlock(); 176546035553Spatrick#endif 176646035553Spatrick __node_pointer __np = __n->__as_node(); 176746035553Spatrick __node_alloc_traits::destroy(__na, _VSTD::addressof(__np->__value_)); 176846035553Spatrick __node_alloc_traits::deallocate(__na, __np, 1); 176946035553Spatrick } 177046035553Spatrick } 177146035553Spatrick return iterator(__l.__ptr_, this); 177246035553Spatrick} 177346035553Spatrick 177446035553Spatricktemplate <class _Tp, class _Alloc> 177546035553Spatrickvoid 177646035553Spatricklist<_Tp, _Alloc>::resize(size_type __n) 177746035553Spatrick{ 177846035553Spatrick if (__n < base::__sz()) 177946035553Spatrick erase(__iterator(__n), end()); 178046035553Spatrick else if (__n > base::__sz()) 178146035553Spatrick { 178246035553Spatrick __n -= base::__sz(); 178346035553Spatrick size_type __ds = 0; 178446035553Spatrick __node_allocator& __na = base::__node_alloc(); 178546035553Spatrick __hold_pointer __hold = __allocate_node(__na); 178646035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_)); 178746035553Spatrick ++__ds; 178846035553Spatrick iterator __r = iterator(__hold.release()->__as_link(), this); 178946035553Spatrick iterator __e = __r; 179046035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 179146035553Spatrick try 179246035553Spatrick { 179346035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 1794*4bdff4beSrobert for (--__n; __n != 0; --__n, (void) ++__e, ++__ds) 179546035553Spatrick { 179646035553Spatrick __hold.reset(__node_alloc_traits::allocate(__na, 1)); 179746035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_)); 179846035553Spatrick __e.__ptr_->__next_ = __hold.get()->__as_link(); 179946035553Spatrick __hold->__prev_ = __e.__ptr_; 180046035553Spatrick __hold.release(); 180146035553Spatrick } 180246035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 180346035553Spatrick } 180446035553Spatrick catch (...) 180546035553Spatrick { 180646035553Spatrick while (true) 180746035553Spatrick { 180846035553Spatrick __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e)); 180946035553Spatrick __link_pointer __prev = __e.__ptr_->__prev_; 181046035553Spatrick __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1); 181146035553Spatrick if (__prev == 0) 181246035553Spatrick break; 181346035553Spatrick __e = iterator(__prev, this); 181446035553Spatrick } 181546035553Spatrick throw; 181646035553Spatrick } 181746035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 181846035553Spatrick __link_nodes_at_back(__r.__ptr_, __e.__ptr_); 181946035553Spatrick base::__sz() += __ds; 182046035553Spatrick } 182146035553Spatrick} 182246035553Spatrick 182346035553Spatricktemplate <class _Tp, class _Alloc> 182446035553Spatrickvoid 182546035553Spatricklist<_Tp, _Alloc>::resize(size_type __n, const value_type& __x) 182646035553Spatrick{ 182746035553Spatrick if (__n < base::__sz()) 182846035553Spatrick erase(__iterator(__n), end()); 182946035553Spatrick else if (__n > base::__sz()) 183046035553Spatrick { 183146035553Spatrick __n -= base::__sz(); 183246035553Spatrick size_type __ds = 0; 183346035553Spatrick __node_allocator& __na = base::__node_alloc(); 183446035553Spatrick __hold_pointer __hold = __allocate_node(__na); 183546035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); 183646035553Spatrick ++__ds; 183746035553Spatrick __link_pointer __nl = __hold.release()->__as_link(); 183846035553Spatrick iterator __r = iterator(__nl, this); 183946035553Spatrick iterator __e = __r; 184046035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 184146035553Spatrick try 184246035553Spatrick { 184346035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 1844*4bdff4beSrobert for (--__n; __n != 0; --__n, (void) ++__e, ++__ds) 184546035553Spatrick { 184646035553Spatrick __hold.reset(__node_alloc_traits::allocate(__na, 1)); 184746035553Spatrick __node_alloc_traits::construct(__na, _VSTD::addressof(__hold->__value_), __x); 184846035553Spatrick __e.__ptr_->__next_ = __hold.get()->__as_link(); 184946035553Spatrick __hold->__prev_ = __e.__ptr_; 185046035553Spatrick __hold.release(); 185146035553Spatrick } 185246035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS 185346035553Spatrick } 185446035553Spatrick catch (...) 185546035553Spatrick { 185646035553Spatrick while (true) 185746035553Spatrick { 185846035553Spatrick __node_alloc_traits::destroy(__na, _VSTD::addressof(*__e)); 185946035553Spatrick __link_pointer __prev = __e.__ptr_->__prev_; 186046035553Spatrick __node_alloc_traits::deallocate(__na, __e.__ptr_->__as_node(), 1); 186146035553Spatrick if (__prev == 0) 186246035553Spatrick break; 186346035553Spatrick __e = iterator(__prev, this); 186446035553Spatrick } 186546035553Spatrick throw; 186646035553Spatrick } 186746035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS 186846035553Spatrick __link_nodes(base::__end_as_link(), __r.__ptr_, __e.__ptr_); 186946035553Spatrick base::__sz() += __ds; 187046035553Spatrick } 187146035553Spatrick} 187246035553Spatrick 187346035553Spatricktemplate <class _Tp, class _Alloc> 187446035553Spatrickvoid 187546035553Spatricklist<_Tp, _Alloc>::splice(const_iterator __p, list& __c) 187646035553Spatrick{ 1877*4bdff4beSrobert _LIBCPP_ASSERT(this != _VSTD::addressof(__c), 187846035553Spatrick "list::splice(iterator, list) called with this == &list"); 1879*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, 1880*4bdff4beSrobert "list::splice(iterator, list) called with an iterator not referring to this list"); 188146035553Spatrick if (!__c.empty()) 188246035553Spatrick { 188346035553Spatrick __link_pointer __f = __c.__end_.__next_; 188446035553Spatrick __link_pointer __l = __c.__end_.__prev_; 188546035553Spatrick base::__unlink_nodes(__f, __l); 188646035553Spatrick __link_nodes(__p.__ptr_, __f, __l); 188746035553Spatrick base::__sz() += __c.__sz(); 188846035553Spatrick __c.__sz() = 0; 1889*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 1890*4bdff4beSrobert if (_VSTD::addressof(__c) != this) { 189146035553Spatrick __libcpp_db* __db = __get_db(); 189246035553Spatrick __c_node* __cn1 = __db->__find_c_and_lock(this); 1893*4bdff4beSrobert __c_node* __cn2 = __db->__find_c(_VSTD::addressof(__c)); 189446035553Spatrick for (__i_node** __ip = __cn2->end_; __ip != __cn2->beg_;) 189546035553Spatrick { 189646035553Spatrick --__ip; 189746035553Spatrick iterator* __i = static_cast<iterator*>((*__ip)->__i_); 189846035553Spatrick if (__i->__ptr_ != __c.__end_as_link()) 189946035553Spatrick { 190046035553Spatrick __cn1->__add(*__ip); 190146035553Spatrick (*__ip)->__c_ = __cn1; 190246035553Spatrick if (--__cn2->end_ != __ip) 190376d0caaeSpatrick _VSTD::memmove(__ip, __ip+1, (__cn2->end_ - __ip)*sizeof(__i_node*)); 190446035553Spatrick } 190546035553Spatrick } 190646035553Spatrick __db->unlock(); 190746035553Spatrick } 190846035553Spatrick#endif 190946035553Spatrick } 191046035553Spatrick} 191146035553Spatrick 191246035553Spatricktemplate <class _Tp, class _Alloc> 191346035553Spatrickvoid 191446035553Spatricklist<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __i) 191546035553Spatrick{ 1916*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, 1917*4bdff4beSrobert "list::splice(iterator, list, iterator) called with the first iterator not referring to this list"); 1918*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__i)) == _VSTD::addressof(__c), 1919*4bdff4beSrobert "list::splice(iterator, list, iterator) called with the second iterator not referring to the list argument"); 1920*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(_VSTD::addressof(__i)), 1921*4bdff4beSrobert "list::splice(iterator, list, iterator) called with the second iterator not dereferenceable"); 1922*4bdff4beSrobert 192346035553Spatrick if (__p.__ptr_ != __i.__ptr_ && __p.__ptr_ != __i.__ptr_->__next_) 192446035553Spatrick { 192546035553Spatrick __link_pointer __f = __i.__ptr_; 192646035553Spatrick base::__unlink_nodes(__f, __f); 192746035553Spatrick __link_nodes(__p.__ptr_, __f, __f); 192846035553Spatrick --__c.__sz(); 192946035553Spatrick ++base::__sz(); 1930*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 1931*4bdff4beSrobert if (_VSTD::addressof(__c) != this) { 193246035553Spatrick __libcpp_db* __db = __get_db(); 193346035553Spatrick __c_node* __cn1 = __db->__find_c_and_lock(this); 1934*4bdff4beSrobert __c_node* __cn2 = __db->__find_c(_VSTD::addressof(__c)); 193546035553Spatrick for (__i_node** __ip = __cn2->end_; __ip != __cn2->beg_;) 193646035553Spatrick { 193746035553Spatrick --__ip; 193846035553Spatrick iterator* __j = static_cast<iterator*>((*__ip)->__i_); 193946035553Spatrick if (__j->__ptr_ == __f) 194046035553Spatrick { 194146035553Spatrick __cn1->__add(*__ip); 194246035553Spatrick (*__ip)->__c_ = __cn1; 194346035553Spatrick if (--__cn2->end_ != __ip) 194476d0caaeSpatrick _VSTD::memmove(__ip, __ip+1, (__cn2->end_ - __ip)*sizeof(__i_node*)); 194546035553Spatrick } 194646035553Spatrick } 194746035553Spatrick __db->unlock(); 194846035553Spatrick } 194946035553Spatrick#endif 195046035553Spatrick } 195146035553Spatrick} 195246035553Spatrick 1953*4bdff4beSroberttemplate <class _Iterator> 1954*4bdff4beSrobert_LIBCPP_HIDE_FROM_ABI 1955*4bdff4beSrobertbool __iterator_in_range(_Iterator __first, _Iterator __last, _Iterator __it) { 1956*4bdff4beSrobert for (_Iterator __p = __first; __p != __last; ++__p) { 1957*4bdff4beSrobert if (__p == __it) { 1958*4bdff4beSrobert return true; 1959*4bdff4beSrobert } 1960*4bdff4beSrobert } 1961*4bdff4beSrobert return false; 1962*4bdff4beSrobert} 1963*4bdff4beSrobert 196446035553Spatricktemplate <class _Tp, class _Alloc> 196546035553Spatrickvoid 196646035553Spatricklist<_Tp, _Alloc>::splice(const_iterator __p, list& __c, const_iterator __f, const_iterator __l) 196746035553Spatrick{ 1968*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__p)) == this, 1969*4bdff4beSrobert "list::splice(iterator, list, iterator, iterator) called with first iterator not referring to this list"); 1970*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__f)) == _VSTD::addressof(__c), 1971*4bdff4beSrobert "list::splice(iterator, list, iterator, iterator) called with second iterator not referring to the list argument"); 1972*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(__get_const_db()->__find_c_from_i(_VSTD::addressof(__l)) == _VSTD::addressof(__c), 1973*4bdff4beSrobert "list::splice(iterator, list, iterator, iterator) called with third iterator not referring to the list argument"); 1974*4bdff4beSrobert _LIBCPP_DEBUG_ASSERT(this != std::addressof(__c) || !std::__iterator_in_range(__f, __l, __p), 197546035553Spatrick "list::splice(iterator, list, iterator, iterator)" 1976*4bdff4beSrobert " called with the first iterator within the range of the second and third iterators"); 1977*4bdff4beSrobert 197846035553Spatrick if (__f != __l) 197946035553Spatrick { 198046035553Spatrick __link_pointer __first = __f.__ptr_; 198146035553Spatrick --__l; 198246035553Spatrick __link_pointer __last = __l.__ptr_; 1983*4bdff4beSrobert if (this != _VSTD::addressof(__c)) 198446035553Spatrick { 198546035553Spatrick size_type __s = _VSTD::distance(__f, __l) + 1; 198646035553Spatrick __c.__sz() -= __s; 198746035553Spatrick base::__sz() += __s; 198846035553Spatrick } 198946035553Spatrick base::__unlink_nodes(__first, __last); 199046035553Spatrick __link_nodes(__p.__ptr_, __first, __last); 1991*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 1992*4bdff4beSrobert if (_VSTD::addressof(__c) != this) { 199346035553Spatrick __libcpp_db* __db = __get_db(); 199446035553Spatrick __c_node* __cn1 = __db->__find_c_and_lock(this); 1995*4bdff4beSrobert __c_node* __cn2 = __db->__find_c(_VSTD::addressof(__c)); 199646035553Spatrick for (__i_node** __ip = __cn2->end_; __ip != __cn2->beg_;) 199746035553Spatrick { 199846035553Spatrick --__ip; 199946035553Spatrick iterator* __j = static_cast<iterator*>((*__ip)->__i_); 200046035553Spatrick for (__link_pointer __k = __f.__ptr_; 200146035553Spatrick __k != __l.__ptr_; __k = __k->__next_) 200246035553Spatrick { 200346035553Spatrick if (__j->__ptr_ == __k) 200446035553Spatrick { 200546035553Spatrick __cn1->__add(*__ip); 200646035553Spatrick (*__ip)->__c_ = __cn1; 200746035553Spatrick if (--__cn2->end_ != __ip) 200876d0caaeSpatrick _VSTD::memmove(__ip, __ip+1, (__cn2->end_ - __ip)*sizeof(__i_node*)); 200946035553Spatrick } 201046035553Spatrick } 201146035553Spatrick } 201246035553Spatrick __db->unlock(); 201346035553Spatrick } 201446035553Spatrick#endif 201546035553Spatrick } 201646035553Spatrick} 201746035553Spatrick 201846035553Spatricktemplate <class _Tp, class _Alloc> 201946035553Spatricktypename list<_Tp, _Alloc>::__remove_return_type 202046035553Spatricklist<_Tp, _Alloc>::remove(const value_type& __x) 202146035553Spatrick{ 202246035553Spatrick list<_Tp, _Alloc> __deleted_nodes(get_allocator()); // collect the nodes we're removing 202346035553Spatrick for (const_iterator __i = begin(), __e = end(); __i != __e;) 202446035553Spatrick { 202546035553Spatrick if (*__i == __x) 202646035553Spatrick { 202746035553Spatrick const_iterator __j = _VSTD::next(__i); 202846035553Spatrick for (; __j != __e && *__j == __x; ++__j) 202946035553Spatrick ; 203046035553Spatrick __deleted_nodes.splice(__deleted_nodes.end(), *this, __i, __j); 203146035553Spatrick __i = __j; 203246035553Spatrick if (__i != __e) 203346035553Spatrick ++__i; 203446035553Spatrick } 203546035553Spatrick else 203646035553Spatrick ++__i; 203746035553Spatrick } 203846035553Spatrick 203946035553Spatrick return (__remove_return_type) __deleted_nodes.size(); 204046035553Spatrick} 204146035553Spatrick 204246035553Spatricktemplate <class _Tp, class _Alloc> 204346035553Spatricktemplate <class _Pred> 204446035553Spatricktypename list<_Tp, _Alloc>::__remove_return_type 204546035553Spatricklist<_Tp, _Alloc>::remove_if(_Pred __pred) 204646035553Spatrick{ 204746035553Spatrick list<_Tp, _Alloc> __deleted_nodes(get_allocator()); // collect the nodes we're removing 204846035553Spatrick for (iterator __i = begin(), __e = end(); __i != __e;) 204946035553Spatrick { 205046035553Spatrick if (__pred(*__i)) 205146035553Spatrick { 205246035553Spatrick iterator __j = _VSTD::next(__i); 205346035553Spatrick for (; __j != __e && __pred(*__j); ++__j) 205446035553Spatrick ; 205546035553Spatrick __deleted_nodes.splice(__deleted_nodes.end(), *this, __i, __j); 205646035553Spatrick __i = __j; 205746035553Spatrick if (__i != __e) 205846035553Spatrick ++__i; 205946035553Spatrick } 206046035553Spatrick else 206146035553Spatrick ++__i; 206246035553Spatrick } 206346035553Spatrick 206446035553Spatrick return (__remove_return_type) __deleted_nodes.size(); 206546035553Spatrick} 206646035553Spatrick 206746035553Spatricktemplate <class _Tp, class _Alloc> 206846035553Spatricktemplate <class _BinaryPred> 206946035553Spatricktypename list<_Tp, _Alloc>::__remove_return_type 207046035553Spatricklist<_Tp, _Alloc>::unique(_BinaryPred __binary_pred) 207146035553Spatrick{ 207246035553Spatrick list<_Tp, _Alloc> __deleted_nodes(get_allocator()); // collect the nodes we're removing 207346035553Spatrick for (iterator __i = begin(), __e = end(); __i != __e;) 207446035553Spatrick { 207546035553Spatrick iterator __j = _VSTD::next(__i); 207646035553Spatrick for (; __j != __e && __binary_pred(*__i, *__j); ++__j) 207746035553Spatrick ; 207846035553Spatrick if (++__i != __j) { 207946035553Spatrick __deleted_nodes.splice(__deleted_nodes.end(), *this, __i, __j); 208046035553Spatrick __i = __j; 208146035553Spatrick } 208246035553Spatrick } 208346035553Spatrick 208446035553Spatrick return (__remove_return_type) __deleted_nodes.size(); 208546035553Spatrick} 208646035553Spatrick 208746035553Spatricktemplate <class _Tp, class _Alloc> 208846035553Spatrickinline 208946035553Spatrickvoid 209046035553Spatricklist<_Tp, _Alloc>::merge(list& __c) 209146035553Spatrick{ 209246035553Spatrick merge(__c, __less<value_type>()); 209346035553Spatrick} 209446035553Spatrick 209546035553Spatricktemplate <class _Tp, class _Alloc> 209646035553Spatricktemplate <class _Comp> 209746035553Spatrickvoid 209846035553Spatricklist<_Tp, _Alloc>::merge(list& __c, _Comp __comp) 209946035553Spatrick{ 210046035553Spatrick if (this != _VSTD::addressof(__c)) 210146035553Spatrick { 210246035553Spatrick iterator __f1 = begin(); 210346035553Spatrick iterator __e1 = end(); 210446035553Spatrick iterator __f2 = __c.begin(); 210546035553Spatrick iterator __e2 = __c.end(); 210646035553Spatrick while (__f1 != __e1 && __f2 != __e2) 210746035553Spatrick { 210846035553Spatrick if (__comp(*__f2, *__f1)) 210946035553Spatrick { 211046035553Spatrick size_type __ds = 1; 211146035553Spatrick iterator __m2 = _VSTD::next(__f2); 2112*4bdff4beSrobert for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2, (void) ++__ds) 211346035553Spatrick ; 211446035553Spatrick base::__sz() += __ds; 211546035553Spatrick __c.__sz() -= __ds; 211646035553Spatrick __link_pointer __f = __f2.__ptr_; 211746035553Spatrick __link_pointer __l = __m2.__ptr_->__prev_; 211846035553Spatrick __f2 = __m2; 211946035553Spatrick base::__unlink_nodes(__f, __l); 212046035553Spatrick __m2 = _VSTD::next(__f1); 212146035553Spatrick __link_nodes(__f1.__ptr_, __f, __l); 212246035553Spatrick __f1 = __m2; 212346035553Spatrick } 212446035553Spatrick else 212546035553Spatrick ++__f1; 212646035553Spatrick } 212746035553Spatrick splice(__e1, __c); 2128*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 212946035553Spatrick __libcpp_db* __db = __get_db(); 213046035553Spatrick __c_node* __cn1 = __db->__find_c_and_lock(this); 2131*4bdff4beSrobert __c_node* __cn2 = __db->__find_c(_VSTD::addressof(__c)); 213246035553Spatrick for (__i_node** __p = __cn2->end_; __p != __cn2->beg_;) 213346035553Spatrick { 213446035553Spatrick --__p; 213546035553Spatrick iterator* __i = static_cast<iterator*>((*__p)->__i_); 213646035553Spatrick if (__i->__ptr_ != __c.__end_as_link()) 213746035553Spatrick { 213846035553Spatrick __cn1->__add(*__p); 213946035553Spatrick (*__p)->__c_ = __cn1; 214046035553Spatrick if (--__cn2->end_ != __p) 214176d0caaeSpatrick _VSTD::memmove(__p, __p+1, (__cn2->end_ - __p)*sizeof(__i_node*)); 214246035553Spatrick } 214346035553Spatrick } 214446035553Spatrick __db->unlock(); 214546035553Spatrick#endif 214646035553Spatrick } 214746035553Spatrick} 214846035553Spatrick 214946035553Spatricktemplate <class _Tp, class _Alloc> 215046035553Spatrickinline 215146035553Spatrickvoid 215246035553Spatricklist<_Tp, _Alloc>::sort() 215346035553Spatrick{ 215446035553Spatrick sort(__less<value_type>()); 215546035553Spatrick} 215646035553Spatrick 215746035553Spatricktemplate <class _Tp, class _Alloc> 215846035553Spatricktemplate <class _Comp> 215946035553Spatrickinline 216046035553Spatrickvoid 216146035553Spatricklist<_Tp, _Alloc>::sort(_Comp __comp) 216246035553Spatrick{ 216346035553Spatrick __sort(begin(), end(), base::__sz(), __comp); 216446035553Spatrick} 216546035553Spatrick 216646035553Spatricktemplate <class _Tp, class _Alloc> 216746035553Spatricktemplate <class _Comp> 216846035553Spatricktypename list<_Tp, _Alloc>::iterator 216946035553Spatricklist<_Tp, _Alloc>::__sort(iterator __f1, iterator __e2, size_type __n, _Comp& __comp) 217046035553Spatrick{ 217146035553Spatrick switch (__n) 217246035553Spatrick { 217346035553Spatrick case 0: 217446035553Spatrick case 1: 217546035553Spatrick return __f1; 217646035553Spatrick case 2: 217746035553Spatrick if (__comp(*--__e2, *__f1)) 217846035553Spatrick { 217946035553Spatrick __link_pointer __f = __e2.__ptr_; 218046035553Spatrick base::__unlink_nodes(__f, __f); 218146035553Spatrick __link_nodes(__f1.__ptr_, __f, __f); 218246035553Spatrick return __e2; 218346035553Spatrick } 218446035553Spatrick return __f1; 218546035553Spatrick } 218646035553Spatrick size_type __n2 = __n / 2; 218746035553Spatrick iterator __e1 = _VSTD::next(__f1, __n2); 218846035553Spatrick iterator __r = __f1 = __sort(__f1, __e1, __n2, __comp); 218946035553Spatrick iterator __f2 = __e1 = __sort(__e1, __e2, __n - __n2, __comp); 219046035553Spatrick if (__comp(*__f2, *__f1)) 219146035553Spatrick { 219246035553Spatrick iterator __m2 = _VSTD::next(__f2); 219346035553Spatrick for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2) 219446035553Spatrick ; 219546035553Spatrick __link_pointer __f = __f2.__ptr_; 219646035553Spatrick __link_pointer __l = __m2.__ptr_->__prev_; 219746035553Spatrick __r = __f2; 219846035553Spatrick __e1 = __f2 = __m2; 219946035553Spatrick base::__unlink_nodes(__f, __l); 220046035553Spatrick __m2 = _VSTD::next(__f1); 220146035553Spatrick __link_nodes(__f1.__ptr_, __f, __l); 220246035553Spatrick __f1 = __m2; 220346035553Spatrick } 220446035553Spatrick else 220546035553Spatrick ++__f1; 220646035553Spatrick while (__f1 != __e1 && __f2 != __e2) 220746035553Spatrick { 220846035553Spatrick if (__comp(*__f2, *__f1)) 220946035553Spatrick { 221046035553Spatrick iterator __m2 = _VSTD::next(__f2); 221146035553Spatrick for (; __m2 != __e2 && __comp(*__m2, *__f1); ++__m2) 221246035553Spatrick ; 221346035553Spatrick __link_pointer __f = __f2.__ptr_; 221446035553Spatrick __link_pointer __l = __m2.__ptr_->__prev_; 221546035553Spatrick if (__e1 == __f2) 221646035553Spatrick __e1 = __m2; 221746035553Spatrick __f2 = __m2; 221846035553Spatrick base::__unlink_nodes(__f, __l); 221946035553Spatrick __m2 = _VSTD::next(__f1); 222046035553Spatrick __link_nodes(__f1.__ptr_, __f, __l); 222146035553Spatrick __f1 = __m2; 222246035553Spatrick } 222346035553Spatrick else 222446035553Spatrick ++__f1; 222546035553Spatrick } 222646035553Spatrick return __r; 222746035553Spatrick} 222846035553Spatrick 222946035553Spatricktemplate <class _Tp, class _Alloc> 223046035553Spatrickvoid 223146035553Spatricklist<_Tp, _Alloc>::reverse() _NOEXCEPT 223246035553Spatrick{ 223346035553Spatrick if (base::__sz() > 1) 223446035553Spatrick { 223546035553Spatrick iterator __e = end(); 223646035553Spatrick for (iterator __i = begin(); __i.__ptr_ != __e.__ptr_;) 223746035553Spatrick { 223846035553Spatrick _VSTD::swap(__i.__ptr_->__prev_, __i.__ptr_->__next_); 223946035553Spatrick __i.__ptr_ = __i.__ptr_->__prev_; 224046035553Spatrick } 224146035553Spatrick _VSTD::swap(__e.__ptr_->__prev_, __e.__ptr_->__next_); 224246035553Spatrick } 224346035553Spatrick} 224446035553Spatrick 224546035553Spatricktemplate <class _Tp, class _Alloc> 224646035553Spatrickbool 224746035553Spatricklist<_Tp, _Alloc>::__invariants() const 224846035553Spatrick{ 224946035553Spatrick return size() == _VSTD::distance(begin(), end()); 225046035553Spatrick} 225146035553Spatrick 2252*4bdff4beSrobert#ifdef _LIBCPP_ENABLE_DEBUG_MODE 225346035553Spatrick 225446035553Spatricktemplate <class _Tp, class _Alloc> 225546035553Spatrickbool 225646035553Spatricklist<_Tp, _Alloc>::__dereferenceable(const const_iterator* __i) const 225746035553Spatrick{ 225846035553Spatrick return __i->__ptr_ != this->__end_as_link(); 225946035553Spatrick} 226046035553Spatrick 226146035553Spatricktemplate <class _Tp, class _Alloc> 226246035553Spatrickbool 226346035553Spatricklist<_Tp, _Alloc>::__decrementable(const const_iterator* __i) const 226446035553Spatrick{ 226546035553Spatrick return !empty() && __i->__ptr_ != base::__end_.__next_; 226646035553Spatrick} 226746035553Spatrick 226846035553Spatricktemplate <class _Tp, class _Alloc> 226946035553Spatrickbool 227046035553Spatricklist<_Tp, _Alloc>::__addable(const const_iterator*, ptrdiff_t) const 227146035553Spatrick{ 227246035553Spatrick return false; 227346035553Spatrick} 227446035553Spatrick 227546035553Spatricktemplate <class _Tp, class _Alloc> 227646035553Spatrickbool 227746035553Spatricklist<_Tp, _Alloc>::__subscriptable(const const_iterator*, ptrdiff_t) const 227846035553Spatrick{ 227946035553Spatrick return false; 228046035553Spatrick} 228146035553Spatrick 2282*4bdff4beSrobert#endif // _LIBCPP_ENABLE_DEBUG_MODE 228346035553Spatrick 228446035553Spatricktemplate <class _Tp, class _Alloc> 228546035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 228646035553Spatrickbool 228746035553Spatrickoperator==(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) 228846035553Spatrick{ 228946035553Spatrick return __x.size() == __y.size() && _VSTD::equal(__x.begin(), __x.end(), __y.begin()); 229046035553Spatrick} 229146035553Spatrick 229246035553Spatricktemplate <class _Tp, class _Alloc> 229346035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 229446035553Spatrickbool 229546035553Spatrickoperator< (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) 229646035553Spatrick{ 229746035553Spatrick return _VSTD::lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end()); 229846035553Spatrick} 229946035553Spatrick 230046035553Spatricktemplate <class _Tp, class _Alloc> 230146035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 230246035553Spatrickbool 230346035553Spatrickoperator!=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) 230446035553Spatrick{ 230546035553Spatrick return !(__x == __y); 230646035553Spatrick} 230746035553Spatrick 230846035553Spatricktemplate <class _Tp, class _Alloc> 230946035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 231046035553Spatrickbool 231146035553Spatrickoperator> (const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) 231246035553Spatrick{ 231346035553Spatrick return __y < __x; 231446035553Spatrick} 231546035553Spatrick 231646035553Spatricktemplate <class _Tp, class _Alloc> 231746035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 231846035553Spatrickbool 231946035553Spatrickoperator>=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) 232046035553Spatrick{ 232146035553Spatrick return !(__x < __y); 232246035553Spatrick} 232346035553Spatrick 232446035553Spatricktemplate <class _Tp, class _Alloc> 232546035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 232646035553Spatrickbool 232746035553Spatrickoperator<=(const list<_Tp, _Alloc>& __x, const list<_Tp, _Alloc>& __y) 232846035553Spatrick{ 232946035553Spatrick return !(__y < __x); 233046035553Spatrick} 233146035553Spatrick 233246035553Spatricktemplate <class _Tp, class _Alloc> 233346035553Spatrickinline _LIBCPP_INLINE_VISIBILITY 233446035553Spatrickvoid 233546035553Spatrickswap(list<_Tp, _Alloc>& __x, list<_Tp, _Alloc>& __y) 233646035553Spatrick _NOEXCEPT_(_NOEXCEPT_(__x.swap(__y))) 233746035553Spatrick{ 233846035553Spatrick __x.swap(__y); 233946035553Spatrick} 234046035553Spatrick 234146035553Spatrick#if _LIBCPP_STD_VER > 17 234246035553Spatricktemplate <class _Tp, class _Allocator, class _Predicate> 2343037e7968Spatrickinline _LIBCPP_INLINE_VISIBILITY typename list<_Tp, _Allocator>::size_type 2344037e7968Spatrickerase_if(list<_Tp, _Allocator>& __c, _Predicate __pred) { 2345037e7968Spatrick return __c.remove_if(__pred); 2346037e7968Spatrick} 234746035553Spatrick 234846035553Spatricktemplate <class _Tp, class _Allocator, class _Up> 2349037e7968Spatrickinline _LIBCPP_INLINE_VISIBILITY typename list<_Tp, _Allocator>::size_type 2350037e7968Spatrickerase(list<_Tp, _Allocator>& __c, const _Up& __v) { 2351037e7968Spatrick return _VSTD::erase_if(__c, [&](auto& __elem) { return __elem == __v; }); 2352037e7968Spatrick} 2353*4bdff4beSrobert 2354*4bdff4beSroberttemplate <> 2355*4bdff4beSrobertinline constexpr bool __format::__enable_insertable<std::list<char>> = true; 2356*4bdff4beSrobert#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS 2357*4bdff4beSroberttemplate <> 2358*4bdff4beSrobertinline constexpr bool __format::__enable_insertable<std::list<wchar_t>> = true; 235946035553Spatrick#endif 236046035553Spatrick 2361*4bdff4beSrobert#endif // _LIBCPP_STD_VER > 17 2362*4bdff4beSrobert 236346035553Spatrick_LIBCPP_END_NAMESPACE_STD 236446035553Spatrick 2365*4bdff4beSrobert#if _LIBCPP_STD_VER > 14 2366*4bdff4beSrobert_LIBCPP_BEGIN_NAMESPACE_STD 2367*4bdff4beSrobertnamespace pmr { 2368*4bdff4beSroberttemplate <class _ValueT> 2369*4bdff4beSrobertusing list = std::list<_ValueT, polymorphic_allocator<_ValueT>>; 2370*4bdff4beSrobert} // namespace pmr 2371*4bdff4beSrobert_LIBCPP_END_NAMESPACE_STD 2372*4bdff4beSrobert#endif 2373*4bdff4beSrobert 237446035553Spatrick_LIBCPP_POP_MACROS 237546035553Spatrick 2376*4bdff4beSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 2377*4bdff4beSrobert# include <algorithm> 2378*4bdff4beSrobert# include <atomic> 2379*4bdff4beSrobert# include <concepts> 2380*4bdff4beSrobert# include <functional> 2381*4bdff4beSrobert# include <iosfwd> 2382*4bdff4beSrobert# include <iterator> 2383*4bdff4beSrobert# include <typeinfo> 2384*4bdff4beSrobert#endif 2385*4bdff4beSrobert 238646035553Spatrick#endif // _LIBCPP_LIST 2387