mirror of
				https://github.com/jart/cosmopolitan.git
				synced 2025-10-28 03:44:33 +00:00 
			
		
		
		
	Upgrade to 2022-era LLVM LIBCXX
This commit is contained in:
		
							parent
							
								
									2f4ca71f26
								
							
						
					
					
						commit
						8e68384e15
					
				
					 2078 changed files with 165657 additions and 65010 deletions
				
			
		
							
								
								
									
										447
									
								
								third_party/libcxx/forward_list
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										447
									
								
								third_party/libcxx/forward_list
									
										
									
									
										vendored
									
									
								
							|  | @ -1,5 +1,5 @@ | |||
| // -*- C++ -*- | ||||
| //===----------------------- forward_list ---------------------------------===// | ||||
| //===----------------------------------------------------------------------===// | ||||
| // | ||||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||||
| // See https://llvm.org/LICENSE.txt for license information. | ||||
|  | @ -146,51 +146,95 @@ template <class T, class Allocator> | |||
| 
 | ||||
| template <class T, class Allocator> | ||||
|     bool operator< (const forward_list<T, Allocator>& x, | ||||
|                     const forward_list<T, Allocator>& y); | ||||
|                     const forward_list<T, Allocator>& y); // removed in C++20 | ||||
| 
 | ||||
| template <class T, class Allocator> | ||||
|     bool operator!=(const forward_list<T, Allocator>& x, | ||||
|                     const forward_list<T, Allocator>& y); | ||||
|                     const forward_list<T, Allocator>& y); // removed in C++20 | ||||
| 
 | ||||
| template <class T, class Allocator> | ||||
|     bool operator> (const forward_list<T, Allocator>& x, | ||||
|                     const forward_list<T, Allocator>& y); | ||||
|                     const forward_list<T, Allocator>& y); // removed in C++20 | ||||
| 
 | ||||
| template <class T, class Allocator> | ||||
|     bool operator>=(const forward_list<T, Allocator>& x, | ||||
|                     const forward_list<T, Allocator>& y); | ||||
|                     const forward_list<T, Allocator>& y); // removed in C++20 | ||||
| 
 | ||||
| template <class T, class Allocator> | ||||
|     bool operator<=(const forward_list<T, Allocator>& x, | ||||
|                     const forward_list<T, Allocator>& y); | ||||
|                     const forward_list<T, Allocator>& y); // removed in C++20 | ||||
| 
 | ||||
| template<class T, class Allocator> | ||||
|     synth-three-way-result<T> operator<=>(const forward_list<T, Allocator>& x, | ||||
|                                           const forward_list<T, Allocator>& y); // since C++20 | ||||
| 
 | ||||
| template <class T, class Allocator> | ||||
|     void swap(forward_list<T, Allocator>& x, forward_list<T, Allocator>& y) | ||||
|          noexcept(noexcept(x.swap(y))); | ||||
| 
 | ||||
| template <class T, class Allocator, class U> | ||||
|     void erase(forward_list<T, Allocator>& c, const U& value);       // C++20 | ||||
|     typename forward_list<T, Allocator>::size_type | ||||
|     erase(forward_list<T, Allocator>& c, const U& value);       // C++20 | ||||
| template <class T, class Allocator, class Predicate> | ||||
|     void erase_if(forward_list<T, Allocator>& c, Predicate pred);    // C++20 | ||||
|     typename forward_list<T, Allocator>::size_type | ||||
|     erase_if(forward_list<T, Allocator>& c, Predicate pred);    // C++20 | ||||
| 
 | ||||
| }  // std | ||||
| 
 | ||||
| */ | ||||
| 
 | ||||
| #include "third_party/libcxx/__config" | ||||
| #include "third_party/libcxx/initializer_list" | ||||
| #include "third_party/libcxx/memory" | ||||
| #include "third_party/libcxx/limits" | ||||
| #include "third_party/libcxx/iterator" | ||||
| #include "third_party/libcxx/algorithm" | ||||
| #include "third_party/libcxx/version" | ||||
| #include <__algorithm/comp.h> | ||||
| #include <__algorithm/lexicographical_compare.h> | ||||
| #include <__algorithm/lexicographical_compare_three_way.h> | ||||
| #include <__algorithm/min.h> | ||||
| #include <__assert> // all public C++ headers provide the assertion handler | ||||
| #include <__config> | ||||
| #include <__iterator/distance.h> | ||||
| #include <__iterator/iterator_traits.h> | ||||
| #include <__iterator/move_iterator.h> | ||||
| #include <__iterator/next.h> | ||||
| #include <__memory/addressof.h> | ||||
| #include <__memory/allocator.h> | ||||
| #include <__memory/allocator_destructor.h> | ||||
| #include <__memory/allocator_traits.h> | ||||
| #include <__memory/compressed_pair.h> | ||||
| #include <__memory/pointer_traits.h> | ||||
| #include <__memory/swap_allocator.h> | ||||
| #include <__memory/unique_ptr.h> | ||||
| #include <__memory_resource/polymorphic_allocator.h> | ||||
| #include <__type_traits/conditional.h> | ||||
| #include <__type_traits/is_allocator.h> | ||||
| #include <__type_traits/is_const.h> | ||||
| #include <__type_traits/is_nothrow_default_constructible.h> | ||||
| #include <__type_traits/is_nothrow_move_assignable.h> | ||||
| #include <__type_traits/is_nothrow_move_constructible.h> | ||||
| #include <__type_traits/is_pointer.h> | ||||
| #include <__type_traits/is_same.h> | ||||
| #include <__type_traits/type_identity.h> | ||||
| #include <__utility/forward.h> | ||||
| #include <__utility/move.h> | ||||
| #include <limits> | ||||
| #include <version> | ||||
| 
 | ||||
| // standard-mandated includes | ||||
| 
 | ||||
| // [iterator.range] | ||||
| #include <__iterator/access.h> | ||||
| #include <__iterator/data.h> | ||||
| #include <__iterator/empty.h> | ||||
| #include <__iterator/reverse_access.h> | ||||
| #include <__iterator/size.h> | ||||
| 
 | ||||
| // [forward.list.syn] | ||||
| #include <compare> | ||||
| #include <initializer_list> | ||||
| 
 | ||||
| #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) | ||||
| #pragma GCC system_header | ||||
| #  pragma GCC system_header | ||||
| #endif | ||||
| 
 | ||||
| _LIBCPP_PUSH_MACROS | ||||
| #include "third_party/libcxx/__undef_macros" | ||||
| #include <__undef_macros> | ||||
| 
 | ||||
| 
 | ||||
| _LIBCPP_BEGIN_NAMESPACE_STD | ||||
|  | @ -210,30 +254,23 @@ struct __forward_list_node_value_type<__forward_list_node<_Tp, _VoidPtr> > { | |||
| template <class _NodePtr> | ||||
| struct __forward_node_traits { | ||||
| 
 | ||||
|   typedef typename remove_cv< | ||||
|         typename pointer_traits<_NodePtr>::element_type>::type  __node; | ||||
|   typedef __remove_cv_t< | ||||
|         typename pointer_traits<_NodePtr>::element_type>        __node; | ||||
|   typedef typename __forward_list_node_value_type<__node>::type __node_value_type; | ||||
|   typedef _NodePtr                                              __node_pointer; | ||||
|   typedef __forward_begin_node<_NodePtr>                        __begin_node; | ||||
|   typedef typename __rebind_pointer<_NodePtr, __begin_node>::type | ||||
|                                                                 __begin_node_pointer; | ||||
|   typedef typename __rebind_pointer<_NodePtr, void>::type       __void_pointer; | ||||
|   typedef __rebind_pointer_t<_NodePtr, __begin_node>            __begin_node_pointer; | ||||
|   typedef __rebind_pointer_t<_NodePtr, void>                    __void_pointer; | ||||
| 
 | ||||
| #if defined(_LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB) | ||||
|   typedef __begin_node_pointer __iter_node_pointer; | ||||
| #else | ||||
|   typedef typename conditional< | ||||
|           is_pointer<__void_pointer>::value, | ||||
|           __begin_node_pointer, | ||||
|           __node_pointer | ||||
|     >::type __iter_node_pointer; | ||||
|   typedef __conditional_t<is_pointer<__void_pointer>::value, __begin_node_pointer, __node_pointer> | ||||
|       __iter_node_pointer; | ||||
| #endif | ||||
| 
 | ||||
|   typedef typename conditional< | ||||
|           is_same<__iter_node_pointer, __node_pointer>::value, | ||||
|           __begin_node_pointer, | ||||
|           __node_pointer | ||||
|     >::type __non_iter_node_pointer; | ||||
|   typedef __conditional_t<is_same<__iter_node_pointer, __node_pointer>::value, __begin_node_pointer, __node_pointer> | ||||
|       __non_iter_node_pointer; | ||||
| 
 | ||||
|   _LIBCPP_INLINE_VISIBILITY | ||||
|   static __iter_node_pointer __as_iter_node(__iter_node_pointer __p) { | ||||
|  | @ -249,7 +286,7 @@ template <class _NodePtr> | |||
| struct __forward_begin_node | ||||
| { | ||||
|     typedef _NodePtr pointer; | ||||
|     typedef typename __rebind_pointer<_NodePtr, __forward_begin_node>::type __begin_node_pointer; | ||||
|     typedef __rebind_pointer_t<_NodePtr, __forward_begin_node> __begin_node_pointer; | ||||
| 
 | ||||
|     pointer __next_; | ||||
| 
 | ||||
|  | @ -262,16 +299,11 @@ struct __forward_begin_node | |||
| }; | ||||
| 
 | ||||
| template <class _Tp, class _VoidPtr> | ||||
| struct _LIBCPP_HIDDEN __begin_node_of | ||||
| { | ||||
|     typedef __forward_begin_node< | ||||
|         typename __rebind_pointer<_VoidPtr, __forward_list_node<_Tp, _VoidPtr> >::type | ||||
|     > type; | ||||
| }; | ||||
| using __begin_node_of = __forward_begin_node<__rebind_pointer_t<_VoidPtr, __forward_list_node<_Tp, _VoidPtr> > >; | ||||
| 
 | ||||
| template <class _Tp, class _VoidPtr> | ||||
| struct __forward_list_node | ||||
|     : public __begin_node_of<_Tp, _VoidPtr>::type | ||||
| struct _LIBCPP_STANDALONE_DEBUG __forward_list_node | ||||
|     : public __begin_node_of<_Tp, _VoidPtr> | ||||
| { | ||||
|     typedef _Tp value_type; | ||||
| 
 | ||||
|  | @ -324,7 +356,7 @@ public: | |||
|     typedef value_type&                                       reference; | ||||
|     typedef typename pointer_traits<__node_pointer>::difference_type | ||||
|                                                               difference_type; | ||||
|     typedef typename __rebind_pointer<__node_pointer, value_type>::type pointer; | ||||
|     typedef __rebind_pointer_t<__node_pointer, value_type> pointer; | ||||
| 
 | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     __forward_list_iterator() _NOEXCEPT : __ptr_(nullptr) {} | ||||
|  | @ -375,11 +407,11 @@ class _LIBCPP_TEMPLATE_VIS __forward_list_const_iterator | |||
| 
 | ||||
|     __iter_node_pointer __ptr_; | ||||
| 
 | ||||
|     __begin_node_pointer __get_begin() const { | ||||
|     _LIBCPP_HIDE_FROM_ABI __begin_node_pointer __get_begin() const { | ||||
|         return static_cast<__begin_node_pointer>( | ||||
|                 static_cast<__void_pointer>(__ptr_)); | ||||
|     } | ||||
|     __node_pointer __get_unsafe_node_pointer() const { | ||||
|     _LIBCPP_HIDE_FROM_ABI __node_pointer __get_unsafe_node_pointer() const { | ||||
|         return static_cast<__node_pointer>( | ||||
|                 static_cast<__void_pointer>(__ptr_)); | ||||
|     } | ||||
|  | @ -405,7 +437,7 @@ public: | |||
|     typedef const value_type&                                 reference; | ||||
|     typedef typename pointer_traits<__node_pointer>::difference_type | ||||
|                                                               difference_type; | ||||
|     typedef typename __rebind_pointer<__node_pointer, const value_type>::type | ||||
|     typedef __rebind_pointer_t<__node_pointer, const value_type> | ||||
|                                                               pointer; | ||||
| 
 | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|  | @ -453,21 +485,15 @@ protected: | |||
| 
 | ||||
|     typedef typename allocator_traits<allocator_type>::void_pointer  void_pointer; | ||||
|     typedef __forward_list_node<value_type, void_pointer>            __node; | ||||
|     typedef typename __begin_node_of<value_type, void_pointer>::type __begin_node; | ||||
|     typedef typename __rebind_alloc_helper<allocator_traits<allocator_type>, __node>::type __node_allocator; | ||||
|     typedef __begin_node_of<value_type, void_pointer>                __begin_node; | ||||
|     typedef __rebind_alloc<allocator_traits<allocator_type>, __node> __node_allocator; | ||||
|     typedef allocator_traits<__node_allocator>        __node_traits; | ||||
|     typedef typename __node_traits::pointer           __node_pointer; | ||||
| 
 | ||||
|     typedef typename __rebind_alloc_helper< | ||||
|         allocator_traits<allocator_type>, __begin_node | ||||
|     >::type                                           __begin_node_allocator; | ||||
|     typedef __rebind_alloc<allocator_traits<allocator_type>, __begin_node> __begin_node_allocator; | ||||
|     typedef typename allocator_traits<__begin_node_allocator>::pointer | ||||
|                                                       __begin_node_pointer; | ||||
| 
 | ||||
|     static_assert((!is_same<allocator_type, __node_allocator>::value), | ||||
|                   "internal allocator type must differ from user-specified " | ||||
|                   "type; otherwise overload resolution breaks"); | ||||
| 
 | ||||
|     __compressed_pair<__begin_node, __node_allocator> __before_begin_; | ||||
| 
 | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|  | @ -490,7 +516,7 @@ protected: | |||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     __forward_list_base() | ||||
|         _NOEXCEPT_(is_nothrow_default_constructible<__node_allocator>::value) | ||||
|         : __before_begin_(__begin_node()) {} | ||||
|         : __before_begin_(__begin_node(), __default_init_tag()) {} | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     explicit __forward_list_base(const allocator_type& __a) | ||||
|         : __before_begin_(__begin_node(), __node_allocator(__a)) {} | ||||
|  | @ -504,14 +530,14 @@ public: | |||
|         _NOEXCEPT_(is_nothrow_move_constructible<__node_allocator>::value); | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     __forward_list_base(__forward_list_base&& __x, const allocator_type& __a); | ||||
| #endif  // _LIBCPP_CXX03_LANG | ||||
| #endif // _LIBCPP_CXX03_LANG | ||||
| 
 | ||||
| private: | ||||
|     __forward_list_base(const __forward_list_base&); | ||||
|     __forward_list_base& operator=(const __forward_list_base&); | ||||
| 
 | ||||
| public: | ||||
|     ~__forward_list_base(); | ||||
|     _LIBCPP_HIDE_FROM_ABI ~__forward_list_base(); | ||||
| 
 | ||||
| protected: | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|  | @ -532,11 +558,11 @@ public: | |||
| #if _LIBCPP_STD_VER >= 14 | ||||
|         _NOEXCEPT; | ||||
| #else | ||||
|         _NOEXCEPT_(!__node_traits::propagate_on_container_move_assignment::value || | ||||
|         _NOEXCEPT_(!__node_traits::propagate_on_container_swap::value || | ||||
|                     __is_nothrow_swappable<__node_allocator>::value); | ||||
| #endif | ||||
| protected: | ||||
|     void clear() _NOEXCEPT; | ||||
|     _LIBCPP_HIDE_FROM_ABI void clear() _NOEXCEPT; | ||||
| 
 | ||||
| private: | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|  | @ -582,7 +608,7 @@ __forward_list_base<_Tp, _Alloc>::__forward_list_base(__forward_list_base&& __x, | |||
|     } | ||||
| } | ||||
| 
 | ||||
| #endif  // _LIBCPP_CXX03_LANG | ||||
| #endif // _LIBCPP_CXX03_LANG | ||||
| 
 | ||||
| template <class _Tp, class _Alloc> | ||||
| __forward_list_base<_Tp, _Alloc>::~__forward_list_base() | ||||
|  | @ -597,11 +623,11 @@ __forward_list_base<_Tp, _Alloc>::swap(__forward_list_base& __x) | |||
| #if _LIBCPP_STD_VER >= 14 | ||||
|         _NOEXCEPT | ||||
| #else | ||||
|         _NOEXCEPT_(!__node_traits::propagate_on_container_move_assignment::value || | ||||
|         _NOEXCEPT_(!__node_traits::propagate_on_container_swap::value || | ||||
|                     __is_nothrow_swappable<__node_allocator>::value) | ||||
| #endif | ||||
| { | ||||
|     __swap_allocator(__alloc(), __x.__alloc(), | ||||
|     _VSTD::__swap_allocator(__alloc(), __x.__alloc(), | ||||
|             integral_constant<bool, __node_traits::propagate_on_container_swap::value>()); | ||||
|     using _VSTD::swap; | ||||
|     swap(__before_begin()->__next_, __x.__before_begin()->__next_); | ||||
|  | @ -637,19 +663,27 @@ public: | |||
|     typedef _Tp    value_type; | ||||
|     typedef _Alloc allocator_type; | ||||
| 
 | ||||
|     static_assert((is_same<typename allocator_type::value_type, value_type>::value), | ||||
|     static_assert(is_same<value_type, typename allocator_type::value_type>::value, | ||||
|                   "Allocator::value_type must be same type as value_type"); | ||||
| 
 | ||||
|     typedef value_type&                                                reference; | ||||
|     typedef const value_type&                                          const_reference; | ||||
|     typedef typename allocator_traits<allocator_type>::pointer         pointer; | ||||
|     typedef typename allocator_traits<allocator_type>::const_pointer   const_pointer; | ||||
|     typedef typename allocator_traits<allocator_type>::size_type       size_type; | ||||
|     typedef typename allocator_traits<allocator_type>::difference_type difference_type; | ||||
|     static_assert(is_same<allocator_type, __rebind_alloc<allocator_traits<allocator_type>, value_type> >::value, | ||||
|                   "[allocator.requirements] states that rebinding an allocator to the same type should result in the " | ||||
|                   "original allocator"); | ||||
| 
 | ||||
|     static_assert((!is_same<allocator_type, __node_allocator>::value), | ||||
|                   "internal allocator type must differ from user-specified " | ||||
|                   "type; otherwise overload resolution breaks"); | ||||
| 
 | ||||
|     typedef value_type&                                                 reference; | ||||
|     typedef const value_type&                                           const_reference; | ||||
|     typedef typename allocator_traits<allocator_type>::pointer          pointer; | ||||
|     typedef typename allocator_traits<allocator_type>::const_pointer    const_pointer; | ||||
|     typedef typename allocator_traits<allocator_type>::size_type        size_type; | ||||
|     typedef typename allocator_traits<allocator_type>::difference_type  difference_type; | ||||
| 
 | ||||
|     typedef typename base::iterator       iterator; | ||||
|     typedef typename base::const_iterator const_iterator; | ||||
| #if _LIBCPP_STD_VER > 17 | ||||
| #if _LIBCPP_STD_VER >= 20 | ||||
|     typedef size_type                                __remove_return_type; | ||||
| #else | ||||
|     typedef void                                     __remove_return_type; | ||||
|  | @ -661,37 +695,39 @@ public: | |||
|         {} // = default; | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     explicit forward_list(const allocator_type& __a); | ||||
|     explicit forward_list(size_type __n); | ||||
| #if _LIBCPP_STD_VER > 11 | ||||
|     explicit forward_list(size_type __n, const allocator_type& __a); | ||||
|     _LIBCPP_HIDE_FROM_ABI explicit forward_list(size_type __n); | ||||
| #if _LIBCPP_STD_VER >= 14 | ||||
|     _LIBCPP_HIDE_FROM_ABI explicit forward_list(size_type __n, const allocator_type& __a); | ||||
| #endif | ||||
|     forward_list(size_type __n, const value_type& __v); | ||||
|     forward_list(size_type __n, const value_type& __v, const allocator_type& __a); | ||||
|     template <class _InputIterator> | ||||
|         forward_list(_InputIterator __f, _InputIterator __l, | ||||
|                      typename enable_if< | ||||
|                        __is_input_iterator<_InputIterator>::value | ||||
|                      >::type* = nullptr); | ||||
|     template <class _InputIterator> | ||||
|         forward_list(_InputIterator __f, _InputIterator __l, | ||||
|                      const allocator_type& __a, | ||||
|                      typename enable_if< | ||||
|                        __is_input_iterator<_InputIterator>::value | ||||
|                      >::type* = nullptr); | ||||
|     forward_list(const forward_list& __x); | ||||
|     forward_list(const forward_list& __x, const allocator_type& __a); | ||||
|     _LIBCPP_HIDE_FROM_ABI forward_list(size_type __n, const value_type& __v); | ||||
| 
 | ||||
|     forward_list& operator=(const forward_list& __x); | ||||
|     template <class = __enable_if_t<__is_allocator<_Alloc>::value> > | ||||
|     _LIBCPP_HIDE_FROM_ABI forward_list(size_type __n, const value_type& __v, const allocator_type& __a) : base(__a) | ||||
|     { | ||||
|         insert_after(cbefore_begin(), __n, __v); | ||||
|     } | ||||
| 
 | ||||
|     template <class _InputIterator> | ||||
|     _LIBCPP_HIDE_FROM_ABI forward_list(_InputIterator __f, _InputIterator __l, | ||||
|                      __enable_if_t<__has_input_iterator_category<_InputIterator>::value>* = nullptr); | ||||
|     template <class _InputIterator> | ||||
|     _LIBCPP_HIDE_FROM_ABI forward_list(_InputIterator __f, _InputIterator __l, | ||||
|                      const allocator_type& __a, | ||||
|                      __enable_if_t<__has_input_iterator_category<_InputIterator>::value>* = nullptr); | ||||
|     _LIBCPP_HIDE_FROM_ABI forward_list(const forward_list& __x); | ||||
|     _LIBCPP_HIDE_FROM_ABI forward_list(const forward_list& __x, const __type_identity_t<allocator_type>& __a); | ||||
| 
 | ||||
|     _LIBCPP_HIDE_FROM_ABI forward_list& operator=(const forward_list& __x); | ||||
| 
 | ||||
| #ifndef _LIBCPP_CXX03_LANG | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     forward_list(forward_list&& __x) | ||||
|         _NOEXCEPT_(is_nothrow_move_constructible<base>::value) | ||||
|         : base(_VSTD::move(__x)) {} | ||||
|     forward_list(forward_list&& __x, const allocator_type& __a); | ||||
|     _LIBCPP_HIDE_FROM_ABI forward_list(forward_list&& __x, const __type_identity_t<allocator_type>& __a); | ||||
| 
 | ||||
|     forward_list(initializer_list<value_type> __il); | ||||
|     forward_list(initializer_list<value_type> __il, const allocator_type& __a); | ||||
|     _LIBCPP_HIDE_FROM_ABI forward_list(initializer_list<value_type> __il); | ||||
|     _LIBCPP_HIDE_FROM_ABI forward_list(initializer_list<value_type> __il, const allocator_type& __a); | ||||
| 
 | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     forward_list& operator=(forward_list&& __x) | ||||
|  | @ -704,18 +740,14 @@ public: | |||
| 
 | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     void assign(initializer_list<value_type> __il); | ||||
| #endif  // _LIBCPP_CXX03_LANG | ||||
| #endif // _LIBCPP_CXX03_LANG | ||||
| 
 | ||||
|     // ~forward_list() = default; | ||||
| 
 | ||||
|     template <class _InputIterator> | ||||
|         typename enable_if | ||||
|         < | ||||
|             __is_input_iterator<_InputIterator>::value, | ||||
|             void | ||||
|         >::type | ||||
|         assign(_InputIterator __f, _InputIterator __l); | ||||
|     void assign(size_type __n, const value_type& __v); | ||||
|     __enable_if_t<__has_input_iterator_category<_InputIterator>::value, void> | ||||
|     _LIBCPP_HIDE_FROM_ABI assign(_InputIterator __f, _InputIterator __l); | ||||
|     _LIBCPP_HIDE_FROM_ABI void assign(size_type __n, const value_type& __v); | ||||
| 
 | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     allocator_type get_allocator() const _NOEXCEPT | ||||
|  | @ -756,7 +788,7 @@ public: | |||
|         {return base::__before_begin()->__next_ == nullptr;} | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     size_type max_size() const _NOEXCEPT { | ||||
|         return std::min<size_type>( | ||||
|         return _VSTD::min<size_type>( | ||||
|             __node_traits::max_size(base::__alloc()), | ||||
|             numeric_limits<difference_type>::max()); | ||||
|     } | ||||
|  | @ -767,38 +799,36 @@ public: | |||
|     const_reference front() const {return base::__before_begin()->__next_->__value_;} | ||||
| 
 | ||||
| #ifndef _LIBCPP_CXX03_LANG | ||||
| #if _LIBCPP_STD_VER > 14 | ||||
|     template <class... _Args> reference emplace_front(_Args&&... __args); | ||||
| #if _LIBCPP_STD_VER >= 17 | ||||
|     template <class... _Args> | ||||
|     _LIBCPP_HIDE_FROM_ABI reference emplace_front(_Args&&... __args); | ||||
| #else | ||||
|     template <class... _Args> void      emplace_front(_Args&&... __args); | ||||
|     template <class... _Args> | ||||
|     _LIBCPP_HIDE_FROM_ABI void      emplace_front(_Args&&... __args); | ||||
| #endif | ||||
|     void push_front(value_type&& __v); | ||||
| #endif  // _LIBCPP_CXX03_LANG | ||||
|     void push_front(const value_type& __v); | ||||
|     _LIBCPP_HIDE_FROM_ABI void push_front(value_type&& __v); | ||||
| #endif // _LIBCPP_CXX03_LANG | ||||
|     _LIBCPP_HIDE_FROM_ABI void push_front(const value_type& __v); | ||||
| 
 | ||||
|     void pop_front(); | ||||
|     _LIBCPP_HIDE_FROM_ABI void pop_front(); | ||||
| 
 | ||||
| #ifndef _LIBCPP_CXX03_LANG | ||||
|     template <class... _Args> | ||||
|         iterator emplace_after(const_iterator __p, _Args&&... __args); | ||||
|     _LIBCPP_HIDE_FROM_ABI iterator emplace_after(const_iterator __p, _Args&&... __args); | ||||
| 
 | ||||
|     iterator insert_after(const_iterator __p, value_type&& __v); | ||||
|     iterator insert_after(const_iterator __p, initializer_list<value_type> __il) | ||||
|     _LIBCPP_HIDE_FROM_ABI iterator insert_after(const_iterator __p, value_type&& __v); | ||||
|     _LIBCPP_HIDE_FROM_ABI iterator insert_after(const_iterator __p, initializer_list<value_type> __il) | ||||
|         {return insert_after(__p, __il.begin(), __il.end());} | ||||
| #endif  // _LIBCPP_CXX03_LANG | ||||
|     iterator insert_after(const_iterator __p, const value_type& __v); | ||||
|     iterator insert_after(const_iterator __p, size_type __n, const value_type& __v); | ||||
| #endif // _LIBCPP_CXX03_LANG | ||||
|     _LIBCPP_HIDE_FROM_ABI iterator insert_after(const_iterator __p, const value_type& __v); | ||||
|     _LIBCPP_HIDE_FROM_ABI iterator insert_after(const_iterator __p, size_type __n, const value_type& __v); | ||||
|     template <class _InputIterator> | ||||
|         _LIBCPP_INLINE_VISIBILITY | ||||
|         typename enable_if | ||||
|         < | ||||
|             __is_input_iterator<_InputIterator>::value, | ||||
|             iterator | ||||
|         >::type | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     __enable_if_t<__has_input_iterator_category<_InputIterator>::value, iterator> | ||||
|         insert_after(const_iterator __p, _InputIterator __f, _InputIterator __l); | ||||
| 
 | ||||
|     iterator erase_after(const_iterator __p); | ||||
|     iterator erase_after(const_iterator __f, const_iterator __l); | ||||
|     _LIBCPP_HIDE_FROM_ABI iterator erase_after(const_iterator __p); | ||||
|     _LIBCPP_HIDE_FROM_ABI iterator erase_after(const_iterator __f, const_iterator __l); | ||||
| 
 | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     void swap(forward_list& __x) | ||||
|  | @ -810,8 +840,8 @@ public: | |||
| #endif | ||||
|         {base::swap(__x);} | ||||
| 
 | ||||
|     void resize(size_type __n); | ||||
|     void resize(size_type __n, const value_type& __v); | ||||
|     _LIBCPP_HIDE_FROM_ABI void resize(size_type __n); | ||||
|     _LIBCPP_HIDE_FROM_ABI void resize(size_type __n, const value_type& __v); | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     void clear() _NOEXCEPT {base::clear();} | ||||
| 
 | ||||
|  | @ -822,15 +852,17 @@ public: | |||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     void splice_after(const_iterator __p, forward_list&& __x, | ||||
|                       const_iterator __f, const_iterator __l); | ||||
|     void splice_after(const_iterator __p, forward_list& __x); | ||||
|     void splice_after(const_iterator __p, forward_list& __x, const_iterator __i); | ||||
|     void splice_after(const_iterator __p, forward_list& __x, | ||||
|     _LIBCPP_HIDE_FROM_ABI void splice_after(const_iterator __p, forward_list& __x); | ||||
|     _LIBCPP_HIDE_FROM_ABI void splice_after(const_iterator __p, forward_list& __x, const_iterator __i); | ||||
|     _LIBCPP_HIDE_FROM_ABI void splice_after(const_iterator __p, forward_list& __x, | ||||
|                       const_iterator __f, const_iterator __l); | ||||
|     __remove_return_type remove(const value_type& __v); | ||||
|     template <class _Predicate> __remove_return_type remove_if(_Predicate __pred); | ||||
|     _LIBCPP_HIDE_FROM_ABI __remove_return_type remove(const value_type& __v); | ||||
|     template <class _Predicate> | ||||
|     _LIBCPP_HIDE_FROM_ABI __remove_return_type remove_if(_Predicate __pred); | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     __remove_return_type unique() {return unique(__equal_to<value_type>());} | ||||
|     template <class _BinaryPredicate> __remove_return_type unique(_BinaryPredicate __binary_pred); | ||||
|     __remove_return_type unique() { return unique(__equal_to()); } | ||||
|     template <class _BinaryPredicate> | ||||
|     _LIBCPP_HIDE_FROM_ABI __remove_return_type unique(_BinaryPredicate __binary_pred); | ||||
| #ifndef _LIBCPP_CXX03_LANG | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     void merge(forward_list&& __x) {merge(__x, __less<value_type>());} | ||||
|  | @ -838,49 +870,53 @@ public: | |||
|         _LIBCPP_INLINE_VISIBILITY | ||||
|         void merge(forward_list&& __x, _Compare __comp) | ||||
|         {merge(__x, _VSTD::move(__comp));} | ||||
| #endif  // _LIBCPP_CXX03_LANG | ||||
| #endif // _LIBCPP_CXX03_LANG | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     void merge(forward_list& __x) {merge(__x, __less<value_type>());} | ||||
|     template <class _Compare> void merge(forward_list& __x, _Compare __comp); | ||||
|     template <class _Compare> | ||||
|     _LIBCPP_HIDE_FROM_ABI void merge(forward_list& __x, _Compare __comp); | ||||
|     _LIBCPP_INLINE_VISIBILITY | ||||
|     void sort() {sort(__less<value_type>());} | ||||
|     template <class _Compare> _LIBCPP_INLINE_VISIBILITY void sort(_Compare __comp); | ||||
|     void reverse() _NOEXCEPT; | ||||
|     _LIBCPP_HIDE_FROM_ABI void reverse() _NOEXCEPT; | ||||
| 
 | ||||
| private: | ||||
| 
 | ||||
| #ifndef _LIBCPP_CXX03_LANG | ||||
|     void __move_assign(forward_list& __x, true_type) | ||||
|     _LIBCPP_HIDE_FROM_ABI void __move_assign(forward_list& __x, true_type) | ||||
|         _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); | ||||
|     void __move_assign(forward_list& __x, false_type); | ||||
| #endif  // _LIBCPP_CXX03_LANG | ||||
|     _LIBCPP_HIDE_FROM_ABI void __move_assign(forward_list& __x, false_type); | ||||
| #endif // _LIBCPP_CXX03_LANG | ||||
| 
 | ||||
|     template <class _Compare> | ||||
|         static | ||||
|     static _LIBCPP_HIDE_FROM_ABI | ||||
|         __node_pointer | ||||
|         __merge(__node_pointer __f1, __node_pointer __f2, _Compare& __comp); | ||||
| 
 | ||||
|     // TODO: Make this _LIBCPP_HIDE_FROM_ABI | ||||
|     template <class _Compare> | ||||
|         static | ||||
|     static _LIBCPP_HIDDEN | ||||
|         __node_pointer | ||||
|         __sort(__node_pointer __f, difference_type __sz, _Compare& __comp); | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| #ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES | ||||
| #if _LIBCPP_STD_VER >= 17 | ||||
| template<class _InputIterator, | ||||
|          class _Alloc = typename std::allocator<typename iterator_traits<_InputIterator>::value_type>, | ||||
|          class = typename enable_if<__is_allocator<_Alloc>::value, void>::type | ||||
|          class _Alloc = allocator<__iter_value_type<_InputIterator>>, | ||||
|          class = enable_if_t<__has_input_iterator_category<_InputIterator>::value>, | ||||
|          class = enable_if_t<__is_allocator<_Alloc>::value> | ||||
|          > | ||||
| forward_list(_InputIterator, _InputIterator) | ||||
|   -> forward_list<typename iterator_traits<_InputIterator>::value_type, _Alloc>; | ||||
|   -> forward_list<__iter_value_type<_InputIterator>, _Alloc>; | ||||
| 
 | ||||
| template<class _InputIterator, | ||||
|          class _Alloc, | ||||
|          class = typename enable_if<__is_allocator<_Alloc>::value, void>::type | ||||
|          class = enable_if_t<__has_input_iterator_category<_InputIterator>::value>, | ||||
|          class = enable_if_t<__is_allocator<_Alloc>::value> | ||||
|          > | ||||
| forward_list(_InputIterator, _InputIterator, _Alloc) | ||||
|   -> forward_list<typename iterator_traits<_InputIterator>::value_type, _Alloc>; | ||||
|   -> forward_list<__iter_value_type<_InputIterator>, _Alloc>; | ||||
| #endif | ||||
| 
 | ||||
| template <class _Tp, class _Alloc> | ||||
|  | @ -909,7 +945,7 @@ forward_list<_Tp, _Alloc>::forward_list(size_type __n) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| #if _LIBCPP_STD_VER > 11 | ||||
| #if _LIBCPP_STD_VER >= 14 | ||||
| template <class _Tp, class _Alloc> | ||||
| forward_list<_Tp, _Alloc>::forward_list(size_type __n, | ||||
|                                         const allocator_type& __base_alloc) | ||||
|  | @ -938,20 +974,10 @@ forward_list<_Tp, _Alloc>::forward_list(size_type __n, const value_type& __v) | |||
|     insert_after(cbefore_begin(), __n, __v); | ||||
| } | ||||
| 
 | ||||
| template <class _Tp, class _Alloc> | ||||
| forward_list<_Tp, _Alloc>::forward_list(size_type __n, const value_type& __v, | ||||
|                                         const allocator_type& __a) | ||||
|     : base(__a) | ||||
| { | ||||
|     insert_after(cbefore_begin(), __n, __v); | ||||
| } | ||||
| 
 | ||||
| template <class _Tp, class _Alloc> | ||||
| template <class _InputIterator> | ||||
| forward_list<_Tp, _Alloc>::forward_list(_InputIterator __f, _InputIterator __l, | ||||
|                                         typename enable_if< | ||||
|                                           __is_input_iterator<_InputIterator>::value | ||||
|                                         >::type*) | ||||
|                                         __enable_if_t<__has_input_iterator_category<_InputIterator>::value>*) | ||||
| { | ||||
|     insert_after(cbefore_begin(), __f, __l); | ||||
| } | ||||
|  | @ -960,9 +986,7 @@ template <class _Tp, class _Alloc> | |||
| template <class _InputIterator> | ||||
| forward_list<_Tp, _Alloc>::forward_list(_InputIterator __f, _InputIterator __l, | ||||
|                                         const allocator_type& __a, | ||||
|                                         typename enable_if< | ||||
|                                           __is_input_iterator<_InputIterator>::value | ||||
|                                         >::type*) | ||||
|                                         __enable_if_t<__has_input_iterator_category<_InputIterator>::value>*) | ||||
|     : base(__a) | ||||
| { | ||||
|     insert_after(cbefore_begin(), __f, __l); | ||||
|  | @ -977,7 +1001,7 @@ forward_list<_Tp, _Alloc>::forward_list(const forward_list& __x) | |||
| 
 | ||||
| template <class _Tp, class _Alloc> | ||||
| forward_list<_Tp, _Alloc>::forward_list(const forward_list& __x, | ||||
|                                         const allocator_type& __a) | ||||
|                                         const __type_identity_t<allocator_type>& __a) | ||||
|     : base(__a) | ||||
| { | ||||
|     insert_after(cbefore_begin(), __x.begin(), __x.end()); | ||||
|  | @ -987,7 +1011,7 @@ template <class _Tp, class _Alloc> | |||
| forward_list<_Tp, _Alloc>& | ||||
| forward_list<_Tp, _Alloc>::operator=(const forward_list& __x) | ||||
| { | ||||
|     if (this != &__x) | ||||
|     if (this != _VSTD::addressof(__x)) | ||||
|     { | ||||
|         base::__copy_assign_alloc(__x); | ||||
|         assign(__x.begin(), __x.end()); | ||||
|  | @ -998,7 +1022,7 @@ forward_list<_Tp, _Alloc>::operator=(const forward_list& __x) | |||
| #ifndef _LIBCPP_CXX03_LANG | ||||
| template <class _Tp, class _Alloc> | ||||
| forward_list<_Tp, _Alloc>::forward_list(forward_list&& __x, | ||||
|                                         const allocator_type& __a) | ||||
|                                         const __type_identity_t<allocator_type>& __a) | ||||
|     : base(_VSTD::move(__x), __a) | ||||
| { | ||||
|     if (base::__alloc() != __x.__alloc()) | ||||
|  | @ -1068,15 +1092,11 @@ forward_list<_Tp, _Alloc>::operator=(initializer_list<value_type> __il) | |||
|     return *this; | ||||
| } | ||||
| 
 | ||||
| #endif  // _LIBCPP_CXX03_LANG | ||||
| #endif // _LIBCPP_CXX03_LANG | ||||
| 
 | ||||
| template <class _Tp, class _Alloc> | ||||
| template <class _InputIterator> | ||||
| typename enable_if | ||||
| < | ||||
|     __is_input_iterator<_InputIterator>::value, | ||||
|     void | ||||
| >::type | ||||
| __enable_if_t<__has_input_iterator_category<_InputIterator>::value, void> | ||||
| forward_list<_Tp, _Alloc>::assign(_InputIterator __f, _InputIterator __l) | ||||
| { | ||||
|     iterator __i = before_begin(); | ||||
|  | @ -1117,7 +1137,7 @@ forward_list<_Tp, _Alloc>::assign(initializer_list<value_type> __il) | |||
| 
 | ||||
| template <class _Tp, class _Alloc> | ||||
| template <class... _Args> | ||||
| #if _LIBCPP_STD_VER > 14 | ||||
| #if _LIBCPP_STD_VER >= 17 | ||||
| typename forward_list<_Tp, _Alloc>::reference | ||||
| #else | ||||
| void | ||||
|  | @ -1131,7 +1151,7 @@ forward_list<_Tp, _Alloc>::emplace_front(_Args&&... __args) | |||
|                                   _VSTD::forward<_Args>(__args)...); | ||||
|     __h->__next_ = base::__before_begin()->__next_; | ||||
|     base::__before_begin()->__next_ = __h.release(); | ||||
| #if _LIBCPP_STD_VER > 14 | ||||
| #if _LIBCPP_STD_VER >= 17 | ||||
|     return base::__before_begin()->__next_->__value_; | ||||
| #endif | ||||
| } | ||||
|  | @ -1148,7 +1168,7 @@ forward_list<_Tp, _Alloc>::push_front(value_type&& __v) | |||
|     base::__before_begin()->__next_ = __h.release(); | ||||
| } | ||||
| 
 | ||||
| #endif  // _LIBCPP_CXX03_LANG | ||||
| #endif // _LIBCPP_CXX03_LANG | ||||
| 
 | ||||
| template <class _Tp, class _Alloc> | ||||
| void | ||||
|  | @ -1205,7 +1225,7 @@ forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, value_type&& __v) | |||
|     return iterator(__r->__next_); | ||||
| } | ||||
| 
 | ||||
| #endif  // _LIBCPP_CXX03_LANG | ||||
| #endif // _LIBCPP_CXX03_LANG | ||||
| 
 | ||||
| template <class _Tp, class _Alloc> | ||||
| typename forward_list<_Tp, _Alloc>::iterator | ||||
|  | @ -1235,17 +1255,17 @@ forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, size_type __n, | |||
|         __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); | ||||
|         __node_pointer __first = __h.release(); | ||||
|         __node_pointer __last = __first; | ||||
| #ifndef _LIBCPP_NO_EXCEPTIONS | ||||
| #ifndef _LIBCPP_HAS_NO_EXCEPTIONS | ||||
|         try | ||||
|         { | ||||
| #endif  // _LIBCPP_NO_EXCEPTIONS | ||||
| #endif // _LIBCPP_HAS_NO_EXCEPTIONS | ||||
|             for (--__n; __n != 0; --__n, __last = __last->__next_) | ||||
|             { | ||||
|                 __h.reset(__node_traits::allocate(__a, 1)); | ||||
|                 __node_traits::construct(__a, _VSTD::addressof(__h->__value_), __v); | ||||
|                 __last->__next_ = __h.release(); | ||||
|             } | ||||
| #ifndef _LIBCPP_NO_EXCEPTIONS | ||||
| #ifndef _LIBCPP_HAS_NO_EXCEPTIONS | ||||
|         } | ||||
|         catch (...) | ||||
|         { | ||||
|  | @ -1258,7 +1278,7 @@ forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, size_type __n, | |||
|             } | ||||
|             throw; | ||||
|         } | ||||
| #endif  // _LIBCPP_NO_EXCEPTIONS | ||||
| #endif // _LIBCPP_HAS_NO_EXCEPTIONS | ||||
|         __last->__next_ = __r->__next_; | ||||
|         __r->__next_ = __first; | ||||
|         __r = static_cast<__begin_node_pointer>(__last); | ||||
|  | @ -1268,11 +1288,7 @@ forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, size_type __n, | |||
| 
 | ||||
| template <class _Tp, class _Alloc> | ||||
| template <class _InputIterator> | ||||
| typename enable_if | ||||
| < | ||||
|     __is_input_iterator<_InputIterator>::value, | ||||
|     typename forward_list<_Tp, _Alloc>::iterator | ||||
| >::type | ||||
| __enable_if_t<__has_input_iterator_category<_InputIterator>::value, typename forward_list<_Tp, _Alloc>::iterator> | ||||
| forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, | ||||
|                                         _InputIterator __f, _InputIterator __l) | ||||
| { | ||||
|  | @ -1285,17 +1301,17 @@ forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, | |||
|         __node_traits::construct(__a, _VSTD::addressof(__h->__value_), *__f); | ||||
|         __node_pointer __first = __h.release(); | ||||
|         __node_pointer __last = __first; | ||||
| #ifndef _LIBCPP_NO_EXCEPTIONS | ||||
| #ifndef _LIBCPP_HAS_NO_EXCEPTIONS | ||||
|         try | ||||
|         { | ||||
| #endif  // _LIBCPP_NO_EXCEPTIONS | ||||
| #endif // _LIBCPP_HAS_NO_EXCEPTIONS | ||||
|             for (++__f; __f != __l; ++__f, ((void)(__last = __last->__next_))) | ||||
|             { | ||||
|                 __h.reset(__node_traits::allocate(__a, 1)); | ||||
|                 __node_traits::construct(__a, _VSTD::addressof(__h->__value_), *__f); | ||||
|                 __last->__next_ = __h.release(); | ||||
|             } | ||||
| #ifndef _LIBCPP_NO_EXCEPTIONS | ||||
| #ifndef _LIBCPP_HAS_NO_EXCEPTIONS | ||||
|         } | ||||
|         catch (...) | ||||
|         { | ||||
|  | @ -1308,7 +1324,7 @@ forward_list<_Tp, _Alloc>::insert_after(const_iterator __p, | |||
|             } | ||||
|             throw; | ||||
|         } | ||||
| #endif  // _LIBCPP_NO_EXCEPTIONS | ||||
| #endif // _LIBCPP_HAS_NO_EXCEPTIONS | ||||
|         __last->__next_ = __r->__next_; | ||||
|         __r->__next_ = __first; | ||||
|         __r = static_cast<__begin_node_pointer>(__last); | ||||
|  | @ -1525,7 +1541,7 @@ forward_list<_Tp, _Alloc>::remove(const value_type& __v) | |||
|         else | ||||
|             ++__i; | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     return (__remove_return_type) __count_removed; | ||||
| } | ||||
| 
 | ||||
|  | @ -1553,7 +1569,7 @@ forward_list<_Tp, _Alloc>::remove_if(_Predicate __pred) | |||
|         else | ||||
|             ++__i; | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     return (__remove_return_type) __count_removed; | ||||
| } | ||||
| 
 | ||||
|  | @ -1573,7 +1589,7 @@ forward_list<_Tp, _Alloc>::unique(_BinaryPredicate __binary_pred) | |||
|             __deleted_nodes.splice_after(__deleted_nodes.before_begin(), *this, __i, __j); | ||||
|         __i = __j; | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     return (__remove_return_type) __count_removed; | ||||
| } | ||||
| 
 | ||||
|  | @ -1582,7 +1598,7 @@ template <class _Compare> | |||
| void | ||||
| forward_list<_Tp, _Alloc>::merge(forward_list& __x, _Compare __comp) | ||||
| { | ||||
|     if (this != &__x) | ||||
|     if (this != _VSTD::addressof(__x)) | ||||
|     { | ||||
|         base::__before_begin()->__next_ = __merge(base::__before_begin()->__next_, | ||||
|                                                     __x.__before_begin()->__next_, | ||||
|  | @ -1697,6 +1713,7 @@ forward_list<_Tp, _Alloc>::reverse() _NOEXCEPT | |||
| } | ||||
| 
 | ||||
| template <class _Tp, class _Alloc> | ||||
| _LIBCPP_HIDE_FROM_ABI | ||||
| bool operator==(const forward_list<_Tp, _Alloc>& __x, | ||||
|                 const forward_list<_Tp, _Alloc>& __y) | ||||
| { | ||||
|  | @ -1712,6 +1729,8 @@ bool operator==(const forward_list<_Tp, _Alloc>& __x, | |||
|     return (__ix == __ex) == (__iy == __ey); | ||||
| } | ||||
| 
 | ||||
| #if _LIBCPP_STD_VER <= 17 | ||||
| 
 | ||||
| template <class _Tp, class _Alloc> | ||||
| inline _LIBCPP_INLINE_VISIBILITY | ||||
| bool operator!=(const forward_list<_Tp, _Alloc>& __x, | ||||
|  | @ -1753,6 +1772,17 @@ bool operator<=(const forward_list<_Tp, _Alloc>& __x, | |||
|     return !(__y < __x); | ||||
| } | ||||
| 
 | ||||
| #else // #if _LIBCPP_STD_VER <= 17 | ||||
| 
 | ||||
| template <class _Tp, class _Allocator> | ||||
| _LIBCPP_HIDE_FROM_ABI __synth_three_way_result<_Tp> | ||||
| operator<=>(const forward_list<_Tp, _Allocator>& __x, const forward_list<_Tp, _Allocator>& __y) { | ||||
|     return std::lexicographical_compare_three_way( | ||||
|         __x.begin(), __x.end(), __y.begin(), __y.end(), std::__synth_three_way<_Tp, _Tp>); | ||||
| } | ||||
| 
 | ||||
| #endif // #if _LIBCPP_STD_VER <= 17 | ||||
| 
 | ||||
| template <class _Tp, class _Alloc> | ||||
| inline _LIBCPP_INLINE_VISIBILITY | ||||
| void | ||||
|  | @ -1762,20 +1792,45 @@ swap(forward_list<_Tp, _Alloc>& __x, forward_list<_Tp, _Alloc>& __y) | |||
|     __x.swap(__y); | ||||
| } | ||||
| 
 | ||||
| #if _LIBCPP_STD_VER > 17 | ||||
| #if _LIBCPP_STD_VER >= 20 | ||||
| template <class _Tp, class _Allocator, class _Predicate> | ||||
| inline _LIBCPP_INLINE_VISIBILITY | ||||
| void erase_if(forward_list<_Tp, _Allocator>& __c, _Predicate __pred) | ||||
| { __c.remove_if(__pred); } | ||||
|     typename forward_list<_Tp, _Allocator>::size_type | ||||
|     erase_if(forward_list<_Tp, _Allocator>& __c, _Predicate __pred) { | ||||
|   return __c.remove_if(__pred); | ||||
| } | ||||
| 
 | ||||
| template <class _Tp, class _Allocator, class _Up> | ||||
| inline _LIBCPP_INLINE_VISIBILITY | ||||
| void erase(forward_list<_Tp, _Allocator>& __c, const _Up& __v) | ||||
| { _VSTD::erase_if(__c, [&](auto& __elem) { return __elem == __v; }); } | ||||
|     typename forward_list<_Tp, _Allocator>::size_type | ||||
|     erase(forward_list<_Tp, _Allocator>& __c, const _Up& __v) { | ||||
|   return _VSTD::erase_if(__c, [&](auto& __elem) { return __elem == __v; }); | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| _LIBCPP_END_NAMESPACE_STD | ||||
| 
 | ||||
| #if _LIBCPP_STD_VER >= 17 | ||||
| _LIBCPP_BEGIN_NAMESPACE_STD | ||||
| namespace pmr { | ||||
| template <class _ValueT> | ||||
| using forward_list = std::forward_list<_ValueT, polymorphic_allocator<_ValueT>>; | ||||
| } // namespace pmr | ||||
| _LIBCPP_END_NAMESPACE_STD | ||||
| #endif | ||||
| 
 | ||||
| _LIBCPP_POP_MACROS | ||||
| 
 | ||||
| #endif  // _LIBCPP_FORWARD_LIST | ||||
| #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20 | ||||
| #  include <algorithm> | ||||
| #  include <atomic> | ||||
| #  include <concepts> | ||||
| #  include <cstdlib> | ||||
| #  include <functional> | ||||
| #  include <iosfwd> | ||||
| #  include <iterator> | ||||
| #  include <type_traits> | ||||
| #  include <typeinfo> | ||||
| #endif | ||||
| 
 | ||||
| #endif // _LIBCPP_FORWARD_LIST | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue