12e43a304SNikolas Klauser //===----------------------------------------------------------------------===// 22e43a304SNikolas Klauser // 32e43a304SNikolas Klauser // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42e43a304SNikolas Klauser // See https://llvm.org/LICENSE.txt for license information. 52e43a304SNikolas Klauser // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 62e43a304SNikolas Klauser // 72e43a304SNikolas Klauser //===----------------------------------------------------------------------===// 82e43a304SNikolas Klauser 92e43a304SNikolas Klauser #ifndef _LIBCPP___VECTOR_VECTOR_H 102e43a304SNikolas Klauser #define _LIBCPP___VECTOR_VECTOR_H 112e43a304SNikolas Klauser 122e43a304SNikolas Klauser #include <__algorithm/copy.h> 13*733a98dbSA. Jiang #include <__algorithm/copy_n.h> 142e43a304SNikolas Klauser #include <__algorithm/fill_n.h> 152e43a304SNikolas Klauser #include <__algorithm/max.h> 162e43a304SNikolas Klauser #include <__algorithm/min.h> 172e43a304SNikolas Klauser #include <__algorithm/move.h> 182e43a304SNikolas Klauser #include <__algorithm/move_backward.h> 19*733a98dbSA. Jiang #include <__algorithm/ranges_copy_n.h> 202e43a304SNikolas Klauser #include <__algorithm/rotate.h> 212e43a304SNikolas Klauser #include <__assert> 222e43a304SNikolas Klauser #include <__config> 232e43a304SNikolas Klauser #include <__debug_utils/sanitizers.h> 242e43a304SNikolas Klauser #include <__format/enable_insertable.h> 252e43a304SNikolas Klauser #include <__fwd/vector.h> 26a2042521SNikolas Klauser #include <__iterator/advance.h> 272e43a304SNikolas Klauser #include <__iterator/bounded_iter.h> 28*733a98dbSA. Jiang #include <__iterator/concepts.h> 292e43a304SNikolas Klauser #include <__iterator/distance.h> 302e43a304SNikolas Klauser #include <__iterator/iterator_traits.h> 312e43a304SNikolas Klauser #include <__iterator/move_iterator.h> 322e43a304SNikolas Klauser #include <__iterator/next.h> 332e43a304SNikolas Klauser #include <__iterator/reverse_iterator.h> 342e43a304SNikolas Klauser #include <__iterator/wrap_iter.h> 352e43a304SNikolas Klauser #include <__memory/addressof.h> 362e43a304SNikolas Klauser #include <__memory/allocate_at_least.h> 372e43a304SNikolas Klauser #include <__memory/allocator.h> 382e43a304SNikolas Klauser #include <__memory/allocator_traits.h> 392e43a304SNikolas Klauser #include <__memory/compressed_pair.h> 402e43a304SNikolas Klauser #include <__memory/noexcept_move_assign_container.h> 412e43a304SNikolas Klauser #include <__memory/pointer_traits.h> 422e43a304SNikolas Klauser #include <__memory/swap_allocator.h> 432e43a304SNikolas Klauser #include <__memory/temp_value.h> 442e43a304SNikolas Klauser #include <__memory/uninitialized_algorithms.h> 452e43a304SNikolas Klauser #include <__ranges/access.h> 462e43a304SNikolas Klauser #include <__ranges/concepts.h> 472e43a304SNikolas Klauser #include <__ranges/container_compatible_range.h> 482e43a304SNikolas Klauser #include <__ranges/from_range.h> 492e43a304SNikolas Klauser #include <__split_buffer> 502e43a304SNikolas Klauser #include <__type_traits/conditional.h> 512e43a304SNikolas Klauser #include <__type_traits/enable_if.h> 522e43a304SNikolas Klauser #include <__type_traits/is_allocator.h> 532e43a304SNikolas Klauser #include <__type_traits/is_constant_evaluated.h> 542e43a304SNikolas Klauser #include <__type_traits/is_constructible.h> 552e43a304SNikolas Klauser #include <__type_traits/is_nothrow_assignable.h> 562e43a304SNikolas Klauser #include <__type_traits/is_nothrow_constructible.h> 57eac23a5bSFlorian Hahn #include <__type_traits/is_pointer.h> 582e43a304SNikolas Klauser #include <__type_traits/is_same.h> 592e43a304SNikolas Klauser #include <__type_traits/is_trivially_relocatable.h> 602e43a304SNikolas Klauser #include <__type_traits/type_identity.h> 612e43a304SNikolas Klauser #include <__utility/exception_guard.h> 622e43a304SNikolas Klauser #include <__utility/forward.h> 632e43a304SNikolas Klauser #include <__utility/is_pointer_in_range.h> 642e43a304SNikolas Klauser #include <__utility/move.h> 652e43a304SNikolas Klauser #include <__utility/pair.h> 662e43a304SNikolas Klauser #include <__utility/swap.h> 672e43a304SNikolas Klauser #include <initializer_list> 682e43a304SNikolas Klauser #include <limits> 692e43a304SNikolas Klauser #include <stdexcept> 702e43a304SNikolas Klauser 712e43a304SNikolas Klauser // These headers define parts of vectors definition, since they define ADL functions or class specializations. 722e43a304SNikolas Klauser #include <__vector/comparison.h> 732e43a304SNikolas Klauser #include <__vector/container_traits.h> 742e43a304SNikolas Klauser #include <__vector/swap.h> 752e43a304SNikolas Klauser 762e43a304SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 772e43a304SNikolas Klauser # pragma GCC system_header 782e43a304SNikolas Klauser #endif 792e43a304SNikolas Klauser 802e43a304SNikolas Klauser _LIBCPP_PUSH_MACROS 812e43a304SNikolas Klauser #include <__undef_macros> 822e43a304SNikolas Klauser 832e43a304SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 842e43a304SNikolas Klauser 852e43a304SNikolas Klauser template <class _Tp, class _Allocator /* = allocator<_Tp> */> 862e43a304SNikolas Klauser class _LIBCPP_TEMPLATE_VIS vector { 872e43a304SNikolas Klauser private: 882e43a304SNikolas Klauser typedef allocator<_Tp> __default_allocator_type; 892e43a304SNikolas Klauser 902e43a304SNikolas Klauser public: 910713bf9cSLouis Dionne // 920713bf9cSLouis Dionne // Types 930713bf9cSLouis Dionne // 942e43a304SNikolas Klauser typedef vector __self; 952e43a304SNikolas Klauser typedef _Tp value_type; 962e43a304SNikolas Klauser typedef _Allocator allocator_type; 972e43a304SNikolas Klauser typedef allocator_traits<allocator_type> __alloc_traits; 982e43a304SNikolas Klauser typedef value_type& reference; 992e43a304SNikolas Klauser typedef const value_type& const_reference; 1002e43a304SNikolas Klauser typedef typename __alloc_traits::size_type size_type; 1012e43a304SNikolas Klauser typedef typename __alloc_traits::difference_type difference_type; 1022e43a304SNikolas Klauser typedef typename __alloc_traits::pointer pointer; 1032e43a304SNikolas Klauser typedef typename __alloc_traits::const_pointer const_pointer; 1042e43a304SNikolas Klauser #ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_VECTOR 1052e43a304SNikolas Klauser // Users might provide custom allocators, and prior to C++20 we have no existing way to detect whether the allocator's 1062e43a304SNikolas Klauser // pointer type is contiguous (though it has to be by the Standard). Using the wrapper type ensures the iterator is 1072e43a304SNikolas Klauser // considered contiguous. 1082e43a304SNikolas Klauser typedef __bounded_iter<__wrap_iter<pointer> > iterator; 1092e43a304SNikolas Klauser typedef __bounded_iter<__wrap_iter<const_pointer> > const_iterator; 1102e43a304SNikolas Klauser #else 1112e43a304SNikolas Klauser typedef __wrap_iter<pointer> iterator; 1122e43a304SNikolas Klauser typedef __wrap_iter<const_pointer> const_iterator; 1132e43a304SNikolas Klauser #endif 1142e43a304SNikolas Klauser typedef std::reverse_iterator<iterator> reverse_iterator; 1152e43a304SNikolas Klauser typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 1162e43a304SNikolas Klauser 1172e43a304SNikolas Klauser // A vector containers the following members which may be trivially relocatable: 1182e43a304SNikolas Klauser // - pointer: may be trivially relocatable, so it's checked 1192e43a304SNikolas Klauser // - allocator_type: may be trivially relocatable, so it's checked 1202e43a304SNikolas Klauser // vector doesn't contain any self-references, so it's trivially relocatable if its members are. 121f6958523SNikolas Klauser using __trivially_relocatable _LIBCPP_NODEBUG = __conditional_t< 1222e43a304SNikolas Klauser __libcpp_is_trivially_relocatable<pointer>::value && __libcpp_is_trivially_relocatable<allocator_type>::value, 1232e43a304SNikolas Klauser vector, 1242e43a304SNikolas Klauser void>; 1252e43a304SNikolas Klauser 1262e43a304SNikolas Klauser static_assert(__check_valid_allocator<allocator_type>::value, ""); 1272e43a304SNikolas Klauser static_assert(is_same<typename allocator_type::value_type, value_type>::value, 1282e43a304SNikolas Klauser "Allocator::value_type must be same type as value_type"); 1292e43a304SNikolas Klauser 1300713bf9cSLouis Dionne // 1310713bf9cSLouis Dionne // [vector.cons], construct/copy/destroy 1320713bf9cSLouis Dionne // 1332e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector() 1342e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) {} 1352e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit vector(const allocator_type& __a) 1362e43a304SNikolas Klauser #if _LIBCPP_STD_VER <= 14 1372e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value) 1382e43a304SNikolas Klauser #else 1392e43a304SNikolas Klauser noexcept 1402e43a304SNikolas Klauser #endif 1412e43a304SNikolas Klauser : __alloc_(__a) { 1422e43a304SNikolas Klauser } 1432e43a304SNikolas Klauser 1442e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit vector(size_type __n) { 1452e43a304SNikolas Klauser auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1462e43a304SNikolas Klauser if (__n > 0) { 1472e43a304SNikolas Klauser __vallocate(__n); 1482e43a304SNikolas Klauser __construct_at_end(__n); 1492e43a304SNikolas Klauser } 1502e43a304SNikolas Klauser __guard.__complete(); 1512e43a304SNikolas Klauser } 1522e43a304SNikolas Klauser 1532e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 14 1542e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit vector(size_type __n, const allocator_type& __a) 1552e43a304SNikolas Klauser : __alloc_(__a) { 1562e43a304SNikolas Klauser auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1572e43a304SNikolas Klauser if (__n > 0) { 1582e43a304SNikolas Klauser __vallocate(__n); 1592e43a304SNikolas Klauser __construct_at_end(__n); 1602e43a304SNikolas Klauser } 1612e43a304SNikolas Klauser __guard.__complete(); 1622e43a304SNikolas Klauser } 1632e43a304SNikolas Klauser #endif 1642e43a304SNikolas Klauser 1652e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(size_type __n, const value_type& __x) { 1662e43a304SNikolas Klauser auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1672e43a304SNikolas Klauser if (__n > 0) { 1682e43a304SNikolas Klauser __vallocate(__n); 1692e43a304SNikolas Klauser __construct_at_end(__n, __x); 1702e43a304SNikolas Klauser } 1712e43a304SNikolas Klauser __guard.__complete(); 1722e43a304SNikolas Klauser } 1732e43a304SNikolas Klauser 1742e43a304SNikolas Klauser template <__enable_if_t<__is_allocator<_Allocator>::value, int> = 0> 1752e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 1762e43a304SNikolas Klauser vector(size_type __n, const value_type& __x, const allocator_type& __a) 1772e43a304SNikolas Klauser : __alloc_(__a) { 178d3b98559SPeng Liu auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 1792e43a304SNikolas Klauser if (__n > 0) { 1802e43a304SNikolas Klauser __vallocate(__n); 1812e43a304SNikolas Klauser __construct_at_end(__n, __x); 1822e43a304SNikolas Klauser } 183d3b98559SPeng Liu __guard.__complete(); 1842e43a304SNikolas Klauser } 1852e43a304SNikolas Klauser 1862e43a304SNikolas Klauser template <class _InputIterator, 1872e43a304SNikolas Klauser __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value && 1882e43a304SNikolas Klauser is_constructible<value_type, typename iterator_traits<_InputIterator>::reference>::value, 1892e43a304SNikolas Klauser int> = 0> 1900713bf9cSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(_InputIterator __first, _InputIterator __last) { 1910713bf9cSLouis Dionne __init_with_sentinel(__first, __last); 1920713bf9cSLouis Dionne } 1930713bf9cSLouis Dionne 1942e43a304SNikolas Klauser template <class _InputIterator, 1952e43a304SNikolas Klauser __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value && 1962e43a304SNikolas Klauser is_constructible<value_type, typename iterator_traits<_InputIterator>::reference>::value, 1972e43a304SNikolas Klauser int> = 0> 1982e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 1990713bf9cSLouis Dionne vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a) 2000713bf9cSLouis Dionne : __alloc_(__a) { 2010713bf9cSLouis Dionne __init_with_sentinel(__first, __last); 2020713bf9cSLouis Dionne } 2032e43a304SNikolas Klauser 2042e43a304SNikolas Klauser template < 2052e43a304SNikolas Klauser class _ForwardIterator, 2062e43a304SNikolas Klauser __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value && 2072e43a304SNikolas Klauser is_constructible<value_type, typename iterator_traits<_ForwardIterator>::reference>::value, 2082e43a304SNikolas Klauser int> = 0> 2090713bf9cSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(_ForwardIterator __first, _ForwardIterator __last) { 2100713bf9cSLouis Dionne size_type __n = static_cast<size_type>(std::distance(__first, __last)); 2110713bf9cSLouis Dionne __init_with_size(__first, __last, __n); 2120713bf9cSLouis Dionne } 2132e43a304SNikolas Klauser 2142e43a304SNikolas Klauser template < 2152e43a304SNikolas Klauser class _ForwardIterator, 2162e43a304SNikolas Klauser __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value && 2172e43a304SNikolas Klauser is_constructible<value_type, typename iterator_traits<_ForwardIterator>::reference>::value, 2182e43a304SNikolas Klauser int> = 0> 2192e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 2200713bf9cSLouis Dionne vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a) 2210713bf9cSLouis Dionne : __alloc_(__a) { 2220713bf9cSLouis Dionne size_type __n = static_cast<size_type>(std::distance(__first, __last)); 2230713bf9cSLouis Dionne __init_with_size(__first, __last, __n); 2240713bf9cSLouis Dionne } 2252e43a304SNikolas Klauser 2262e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 23 2272e43a304SNikolas Klauser template <_ContainerCompatibleRange<_Tp> _Range> 2282e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr vector( 2292e43a304SNikolas Klauser from_range_t, _Range&& __range, const allocator_type& __alloc = allocator_type()) 2302e43a304SNikolas Klauser : __alloc_(__alloc) { 2312e43a304SNikolas Klauser if constexpr (ranges::forward_range<_Range> || ranges::sized_range<_Range>) { 2322e43a304SNikolas Klauser auto __n = static_cast<size_type>(ranges::distance(__range)); 2332e43a304SNikolas Klauser __init_with_size(ranges::begin(__range), ranges::end(__range), __n); 2342e43a304SNikolas Klauser 2352e43a304SNikolas Klauser } else { 2362e43a304SNikolas Klauser __init_with_sentinel(ranges::begin(__range), ranges::end(__range)); 2372e43a304SNikolas Klauser } 2382e43a304SNikolas Klauser } 2392e43a304SNikolas Klauser #endif 2402e43a304SNikolas Klauser 2412e43a304SNikolas Klauser private: 2422e43a304SNikolas Klauser class __destroy_vector { 2432e43a304SNikolas Klauser public: 2442e43a304SNikolas Klauser _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI __destroy_vector(vector& __vec) : __vec_(__vec) {} 2452e43a304SNikolas Klauser 2462e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void operator()() { 2472e43a304SNikolas Klauser if (__vec_.__begin_ != nullptr) { 2489b853f63SDominic Chen __vec_.clear(); 2492e43a304SNikolas Klauser __vec_.__annotate_delete(); 2505a48162dSLouis Dionne __alloc_traits::deallocate(__vec_.__alloc_, __vec_.__begin_, __vec_.capacity()); 2512e43a304SNikolas Klauser } 2522e43a304SNikolas Klauser } 2532e43a304SNikolas Klauser 2542e43a304SNikolas Klauser private: 2552e43a304SNikolas Klauser vector& __vec_; 2562e43a304SNikolas Klauser }; 2572e43a304SNikolas Klauser 2582e43a304SNikolas Klauser public: 2592e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI ~vector() { __destroy_vector (*this)(); } 2602e43a304SNikolas Klauser 2610713bf9cSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(const vector& __x) 2625a48162dSLouis Dionne : __alloc_(__alloc_traits::select_on_container_copy_construction(__x.__alloc_)) { 2630713bf9cSLouis Dionne __init_with_size(__x.__begin_, __x.__end_, __x.size()); 2640713bf9cSLouis Dionne } 2652e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 2660713bf9cSLouis Dionne vector(const vector& __x, const __type_identity_t<allocator_type>& __a) 2670713bf9cSLouis Dionne : __alloc_(__a) { 2680713bf9cSLouis Dionne __init_with_size(__x.__begin_, __x.__end_, __x.size()); 2690713bf9cSLouis Dionne } 2702e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector& operator=(const vector& __x); 2712e43a304SNikolas Klauser 2722e43a304SNikolas Klauser #ifndef _LIBCPP_CXX03_LANG 2730713bf9cSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(initializer_list<value_type> __il) { 2740713bf9cSLouis Dionne __init_with_size(__il.begin(), __il.end(), __il.size()); 2750713bf9cSLouis Dionne } 2762e43a304SNikolas Klauser 2772e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 2780713bf9cSLouis Dionne vector(initializer_list<value_type> __il, const allocator_type& __a) 2790713bf9cSLouis Dionne : __alloc_(__a) { 2800713bf9cSLouis Dionne __init_with_size(__il.begin(), __il.end(), __il.size()); 2810713bf9cSLouis Dionne } 2822e43a304SNikolas Klauser 2832e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector& operator=(initializer_list<value_type> __il) { 2842e43a304SNikolas Klauser assign(__il.begin(), __il.end()); 2852e43a304SNikolas Klauser return *this; 2862e43a304SNikolas Klauser } 2872e43a304SNikolas Klauser #endif // !_LIBCPP_CXX03_LANG 2882e43a304SNikolas Klauser 2892e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector(vector&& __x) 2902e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 17 2912e43a304SNikolas Klauser noexcept; 2922e43a304SNikolas Klauser #else 2932e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); 2942e43a304SNikolas Klauser #endif 2952e43a304SNikolas Klauser 2962e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 2972e43a304SNikolas Klauser vector(vector&& __x, const __type_identity_t<allocator_type>& __a); 2982e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI vector& operator=(vector&& __x) 2990713bf9cSLouis Dionne _NOEXCEPT_(__noexcept_move_assign_container<_Allocator, __alloc_traits>::value) { 3000713bf9cSLouis Dionne __move_assign(__x, integral_constant<bool, __alloc_traits::propagate_on_container_move_assignment::value>()); 3010713bf9cSLouis Dionne return *this; 3020713bf9cSLouis Dionne } 3032e43a304SNikolas Klauser 3042e43a304SNikolas Klauser template <class _InputIterator, 3052e43a304SNikolas Klauser __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value && 3062e43a304SNikolas Klauser is_constructible<value_type, typename iterator_traits<_InputIterator>::reference>::value, 3072e43a304SNikolas Klauser int> = 0> 3080713bf9cSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void assign(_InputIterator __first, _InputIterator __last) { 3090713bf9cSLouis Dionne __assign_with_sentinel(__first, __last); 3100713bf9cSLouis Dionne } 3112e43a304SNikolas Klauser template < 3122e43a304SNikolas Klauser class _ForwardIterator, 3132e43a304SNikolas Klauser __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value && 3142e43a304SNikolas Klauser is_constructible<value_type, typename iterator_traits<_ForwardIterator>::reference>::value, 3152e43a304SNikolas Klauser int> = 0> 3160713bf9cSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void assign(_ForwardIterator __first, _ForwardIterator __last) { 3170713bf9cSLouis Dionne __assign_with_size(__first, __last, std::distance(__first, __last)); 3180713bf9cSLouis Dionne } 3192e43a304SNikolas Klauser 3202e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 23 3212e43a304SNikolas Klauser template <_ContainerCompatibleRange<_Tp> _Range> 3222e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr void assign_range(_Range&& __range) { 3232e43a304SNikolas Klauser if constexpr (ranges::forward_range<_Range> || ranges::sized_range<_Range>) { 3242e43a304SNikolas Klauser auto __n = static_cast<size_type>(ranges::distance(__range)); 3252e43a304SNikolas Klauser __assign_with_size(ranges::begin(__range), ranges::end(__range), __n); 3262e43a304SNikolas Klauser 3272e43a304SNikolas Klauser } else { 3282e43a304SNikolas Klauser __assign_with_sentinel(ranges::begin(__range), ranges::end(__range)); 3292e43a304SNikolas Klauser } 3302e43a304SNikolas Klauser } 3312e43a304SNikolas Klauser #endif 3322e43a304SNikolas Klauser 3332e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void assign(size_type __n, const_reference __u); 3342e43a304SNikolas Klauser 3352e43a304SNikolas Klauser #ifndef _LIBCPP_CXX03_LANG 3362e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void assign(initializer_list<value_type> __il) { 3372e43a304SNikolas Klauser assign(__il.begin(), __il.end()); 3382e43a304SNikolas Klauser } 3392e43a304SNikolas Klauser #endif 3402e43a304SNikolas Klauser 3412e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI allocator_type get_allocator() const _NOEXCEPT { 3425a48162dSLouis Dionne return this->__alloc_; 3432e43a304SNikolas Klauser } 3442e43a304SNikolas Klauser 3450713bf9cSLouis Dionne // 3460713bf9cSLouis Dionne // Iterators 3470713bf9cSLouis Dionne // 348eac23a5bSFlorian Hahn _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator begin() _NOEXCEPT { 349eac23a5bSFlorian Hahn return __make_iter(__add_alignment_assumption(this->__begin_)); 3500713bf9cSLouis Dionne } 351eac23a5bSFlorian Hahn _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator begin() const _NOEXCEPT { 352eac23a5bSFlorian Hahn return __make_iter(__add_alignment_assumption(this->__begin_)); 353eac23a5bSFlorian Hahn } 354eac23a5bSFlorian Hahn _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator end() _NOEXCEPT { 355eac23a5bSFlorian Hahn return __make_iter(__add_alignment_assumption(this->__end_)); 356eac23a5bSFlorian Hahn } 3570713bf9cSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator end() const _NOEXCEPT { 358eac23a5bSFlorian Hahn return __make_iter(__add_alignment_assumption(this->__end_)); 3590713bf9cSLouis Dionne } 3602e43a304SNikolas Klauser 3612e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reverse_iterator rbegin() _NOEXCEPT { 3622e43a304SNikolas Klauser return reverse_iterator(end()); 3632e43a304SNikolas Klauser } 3642e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reverse_iterator rbegin() const _NOEXCEPT { 3652e43a304SNikolas Klauser return const_reverse_iterator(end()); 3662e43a304SNikolas Klauser } 3672e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reverse_iterator rend() _NOEXCEPT { 3682e43a304SNikolas Klauser return reverse_iterator(begin()); 3692e43a304SNikolas Klauser } 3702e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reverse_iterator rend() const _NOEXCEPT { 3712e43a304SNikolas Klauser return const_reverse_iterator(begin()); 3722e43a304SNikolas Klauser } 3732e43a304SNikolas Klauser 3742e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator cbegin() const _NOEXCEPT { return begin(); } 3752e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator cend() const _NOEXCEPT { return end(); } 3762e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reverse_iterator crbegin() const _NOEXCEPT { 3772e43a304SNikolas Klauser return rbegin(); 3782e43a304SNikolas Klauser } 3792e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reverse_iterator crend() const _NOEXCEPT { return rend(); } 3802e43a304SNikolas Klauser 3810713bf9cSLouis Dionne // 3820713bf9cSLouis Dionne // [vector.capacity], capacity 3830713bf9cSLouis Dionne // 3842e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type size() const _NOEXCEPT { 3852e43a304SNikolas Klauser return static_cast<size_type>(this->__end_ - this->__begin_); 3862e43a304SNikolas Klauser } 3872e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type capacity() const _NOEXCEPT { 3885a48162dSLouis Dionne return static_cast<size_type>(this->__cap_ - this->__begin_); 3892e43a304SNikolas Klauser } 3902e43a304SNikolas Klauser [[__nodiscard__]] _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool empty() const _NOEXCEPT { 3912e43a304SNikolas Klauser return this->__begin_ == this->__end_; 3922e43a304SNikolas Klauser } 3930713bf9cSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type max_size() const _NOEXCEPT { 3945a48162dSLouis Dionne return std::min<size_type>(__alloc_traits::max_size(this->__alloc_), numeric_limits<difference_type>::max()); 3950713bf9cSLouis Dionne } 3962e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void reserve(size_type __n); 3972e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void shrink_to_fit() _NOEXCEPT; 3982e43a304SNikolas Klauser 3990713bf9cSLouis Dionne // 4000713bf9cSLouis Dionne // element access 4010713bf9cSLouis Dionne // 4020713bf9cSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference operator[](size_type __n) _NOEXCEPT { 4030713bf9cSLouis Dionne _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__n < size(), "vector[] index out of bounds"); 4040713bf9cSLouis Dionne return this->__begin_[__n]; 4050713bf9cSLouis Dionne } 4060713bf9cSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference operator[](size_type __n) const _NOEXCEPT { 4070713bf9cSLouis Dionne _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__n < size(), "vector[] index out of bounds"); 4080713bf9cSLouis Dionne return this->__begin_[__n]; 4090713bf9cSLouis Dionne } 4100713bf9cSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference at(size_type __n) { 4110713bf9cSLouis Dionne if (__n >= size()) 4120713bf9cSLouis Dionne this->__throw_out_of_range(); 4130713bf9cSLouis Dionne return this->__begin_[__n]; 4140713bf9cSLouis Dionne } 4150713bf9cSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference at(size_type __n) const { 4160713bf9cSLouis Dionne if (__n >= size()) 4170713bf9cSLouis Dionne this->__throw_out_of_range(); 4180713bf9cSLouis Dionne return this->__begin_[__n]; 4190713bf9cSLouis Dionne } 4202e43a304SNikolas Klauser 4212e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference front() _NOEXCEPT { 4222e43a304SNikolas Klauser _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "front() called on an empty vector"); 4232e43a304SNikolas Klauser return *this->__begin_; 4242e43a304SNikolas Klauser } 4252e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference front() const _NOEXCEPT { 4262e43a304SNikolas Klauser _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "front() called on an empty vector"); 4272e43a304SNikolas Klauser return *this->__begin_; 4282e43a304SNikolas Klauser } 4292e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI reference back() _NOEXCEPT { 4302e43a304SNikolas Klauser _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "back() called on an empty vector"); 4312e43a304SNikolas Klauser return *(this->__end_ - 1); 4322e43a304SNikolas Klauser } 4332e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_reference back() const _NOEXCEPT { 4342e43a304SNikolas Klauser _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "back() called on an empty vector"); 4352e43a304SNikolas Klauser return *(this->__end_ - 1); 4362e43a304SNikolas Klauser } 4372e43a304SNikolas Klauser 4380713bf9cSLouis Dionne // 4390713bf9cSLouis Dionne // [vector.data], data access 4400713bf9cSLouis Dionne // 4412e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI value_type* data() _NOEXCEPT { 4422e43a304SNikolas Klauser return std::__to_address(this->__begin_); 4432e43a304SNikolas Klauser } 4442e43a304SNikolas Klauser 4452e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const value_type* data() const _NOEXCEPT { 4462e43a304SNikolas Klauser return std::__to_address(this->__begin_); 4472e43a304SNikolas Klauser } 4482e43a304SNikolas Klauser 4490713bf9cSLouis Dionne // 4500713bf9cSLouis Dionne // [vector.modifiers], modifiers 4510713bf9cSLouis Dionne // 4522e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void push_back(const_reference __x) { emplace_back(__x); } 4532e43a304SNikolas Klauser 4542e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void push_back(value_type&& __x) { emplace_back(std::move(__x)); } 4552e43a304SNikolas Klauser 4562e43a304SNikolas Klauser template <class... _Args> 4572e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI 4582e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 17 4592e43a304SNikolas Klauser reference 4602e43a304SNikolas Klauser emplace_back(_Args&&... __args); 4612e43a304SNikolas Klauser #else 4622e43a304SNikolas Klauser void 4632e43a304SNikolas Klauser emplace_back(_Args&&... __args); 4642e43a304SNikolas Klauser #endif 4652e43a304SNikolas Klauser 4662e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 23 4672e43a304SNikolas Klauser template <_ContainerCompatibleRange<_Tp> _Range> 4682e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr void append_range(_Range&& __range) { 4692e43a304SNikolas Klauser insert_range(end(), std::forward<_Range>(__range)); 4702e43a304SNikolas Klauser } 4712e43a304SNikolas Klauser #endif 4722e43a304SNikolas Klauser 4730713bf9cSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void pop_back() { 4740713bf9cSLouis Dionne _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "vector::pop_back called on an empty vector"); 4750713bf9cSLouis Dionne this->__destruct_at_end(this->__end_ - 1); 4760713bf9cSLouis Dionne } 4772e43a304SNikolas Klauser 4782e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __position, const_reference __x); 4792e43a304SNikolas Klauser 4802e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator insert(const_iterator __position, value_type&& __x); 4812e43a304SNikolas Klauser template <class... _Args> 4822e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator emplace(const_iterator __position, _Args&&... __args); 4832e43a304SNikolas Klauser 4842e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 4852e43a304SNikolas Klauser insert(const_iterator __position, size_type __n, const_reference __x); 4862e43a304SNikolas Klauser 4872e43a304SNikolas Klauser template <class _InputIterator, 4882e43a304SNikolas Klauser __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value && 4892e43a304SNikolas Klauser is_constructible< value_type, typename iterator_traits<_InputIterator>::reference>::value, 4902e43a304SNikolas Klauser int> = 0> 4912e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 4920713bf9cSLouis Dionne insert(const_iterator __position, _InputIterator __first, _InputIterator __last) { 4930713bf9cSLouis Dionne return __insert_with_sentinel(__position, __first, __last); 4940713bf9cSLouis Dionne } 4950713bf9cSLouis Dionne 4960713bf9cSLouis Dionne template < 4970713bf9cSLouis Dionne class _ForwardIterator, 4980713bf9cSLouis Dionne __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value && 4990713bf9cSLouis Dionne is_constructible< value_type, typename iterator_traits<_ForwardIterator>::reference>::value, 5000713bf9cSLouis Dionne int> = 0> 5010713bf9cSLouis Dionne _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 5020713bf9cSLouis Dionne insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last) { 5030713bf9cSLouis Dionne return __insert_with_size(__position, __first, __last, std::distance(__first, __last)); 5040713bf9cSLouis Dionne } 5052e43a304SNikolas Klauser 5062e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 23 5072e43a304SNikolas Klauser template <_ContainerCompatibleRange<_Tp> _Range> 5082e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr iterator insert_range(const_iterator __position, _Range&& __range) { 5092e43a304SNikolas Klauser if constexpr (ranges::forward_range<_Range> || ranges::sized_range<_Range>) { 5102e43a304SNikolas Klauser auto __n = static_cast<size_type>(ranges::distance(__range)); 5112e43a304SNikolas Klauser return __insert_with_size(__position, ranges::begin(__range), ranges::end(__range), __n); 5122e43a304SNikolas Klauser 5132e43a304SNikolas Klauser } else { 5142e43a304SNikolas Klauser return __insert_with_sentinel(__position, ranges::begin(__range), ranges::end(__range)); 5152e43a304SNikolas Klauser } 5162e43a304SNikolas Klauser } 5172e43a304SNikolas Klauser #endif 5182e43a304SNikolas Klauser 5192e43a304SNikolas Klauser #ifndef _LIBCPP_CXX03_LANG 5202e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 5212e43a304SNikolas Klauser insert(const_iterator __position, initializer_list<value_type> __il) { 5222e43a304SNikolas Klauser return insert(__position, __il.begin(), __il.end()); 5232e43a304SNikolas Klauser } 5242e43a304SNikolas Klauser #endif 5252e43a304SNikolas Klauser 5262e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator erase(const_iterator __position); 5272e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator erase(const_iterator __first, const_iterator __last); 5282e43a304SNikolas Klauser 5292e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void clear() _NOEXCEPT { 5302e43a304SNikolas Klauser size_type __old_size = size(); 5319b853f63SDominic Chen __base_destruct_at_end(this->__begin_); 5322e43a304SNikolas Klauser __annotate_shrink(__old_size); 5332e43a304SNikolas Klauser } 5342e43a304SNikolas Klauser 5352e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void resize(size_type __sz); 5362e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void resize(size_type __sz, const_reference __x); 5372e43a304SNikolas Klauser 5382e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void swap(vector&) 5392e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 14 5402e43a304SNikolas Klauser _NOEXCEPT; 5412e43a304SNikolas Klauser #else 5422e43a304SNikolas Klauser _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || __is_nothrow_swappable_v<allocator_type>); 5432e43a304SNikolas Klauser #endif 5442e43a304SNikolas Klauser 5452e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI bool __invariants() const; 5462e43a304SNikolas Klauser 5472e43a304SNikolas Klauser private: 5482e43a304SNikolas Klauser pointer __begin_ = nullptr; 5492e43a304SNikolas Klauser pointer __end_ = nullptr; 5502e43a304SNikolas Klauser _LIBCPP_COMPRESSED_PAIR(pointer, __cap_ = nullptr, allocator_type, __alloc_); 5512e43a304SNikolas Klauser 5522e43a304SNikolas Klauser // Allocate space for __n objects 5532e43a304SNikolas Klauser // throws length_error if __n > max_size() 5542e43a304SNikolas Klauser // throws (probably bad_alloc) if memory run out 5555a48162dSLouis Dionne // Precondition: __begin_ == __end_ == __cap_ == nullptr 5562e43a304SNikolas Klauser // Precondition: __n > 0 5572e43a304SNikolas Klauser // Postcondition: capacity() >= __n 5582e43a304SNikolas Klauser // Postcondition: size() == 0 5592e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __vallocate(size_type __n) { 5602e43a304SNikolas Klauser if (__n > max_size()) 5612e43a304SNikolas Klauser __throw_length_error(); 5625a48162dSLouis Dionne auto __allocation = std::__allocate_at_least(this->__alloc_, __n); 5632e43a304SNikolas Klauser __begin_ = __allocation.ptr; 5642e43a304SNikolas Klauser __end_ = __allocation.ptr; 5655a48162dSLouis Dionne __cap_ = __begin_ + __allocation.count; 5662e43a304SNikolas Klauser __annotate_new(0); 5672e43a304SNikolas Klauser } 5682e43a304SNikolas Klauser 5692e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __vdeallocate() _NOEXCEPT; 5702e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI size_type __recommend(size_type __new_size) const; 5712e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __construct_at_end(size_type __n); 5722e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __construct_at_end(size_type __n, const_reference __x); 5732e43a304SNikolas Klauser 5742e43a304SNikolas Klauser template <class _InputIterator, class _Sentinel> 5752e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 5762e43a304SNikolas Klauser __init_with_size(_InputIterator __first, _Sentinel __last, size_type __n) { 5772e43a304SNikolas Klauser auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 5782e43a304SNikolas Klauser 5792e43a304SNikolas Klauser if (__n > 0) { 5802e43a304SNikolas Klauser __vallocate(__n); 581*733a98dbSA. Jiang __construct_at_end(std::move(__first), std::move(__last), __n); 5822e43a304SNikolas Klauser } 5832e43a304SNikolas Klauser 5842e43a304SNikolas Klauser __guard.__complete(); 5852e43a304SNikolas Klauser } 5862e43a304SNikolas Klauser 5872e43a304SNikolas Klauser template <class _InputIterator, class _Sentinel> 5882e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 5892e43a304SNikolas Klauser __init_with_sentinel(_InputIterator __first, _Sentinel __last) { 5902e43a304SNikolas Klauser auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 5912e43a304SNikolas Klauser 5922e43a304SNikolas Klauser for (; __first != __last; ++__first) 5932e43a304SNikolas Klauser emplace_back(*__first); 5942e43a304SNikolas Klauser 5952e43a304SNikolas Klauser __guard.__complete(); 5962e43a304SNikolas Klauser } 5972e43a304SNikolas Klauser 5982e43a304SNikolas Klauser template <class _Iterator, class _Sentinel> 5992e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __assign_with_sentinel(_Iterator __first, _Sentinel __last); 6002e43a304SNikolas Klauser 601*733a98dbSA. Jiang // The `_Iterator` in `*_with_size` functions can be input-only only if called from `*_range` (since C++23). 602*733a98dbSA. Jiang // Otherwise, `_Iterator` is a forward iterator. 603*733a98dbSA. Jiang 604*733a98dbSA. Jiang template <class _Iterator, class _Sentinel> 6052e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 606*733a98dbSA. Jiang __assign_with_size(_Iterator __first, _Sentinel __last, difference_type __n); 6072e43a304SNikolas Klauser 6082e43a304SNikolas Klauser template <class _InputIterator, class _Sentinel> 6092e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 6102e43a304SNikolas Klauser __insert_with_sentinel(const_iterator __position, _InputIterator __first, _Sentinel __last); 6112e43a304SNikolas Klauser 6122e43a304SNikolas Klauser template <class _Iterator, class _Sentinel> 6132e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 6142e43a304SNikolas Klauser __insert_with_size(const_iterator __position, _Iterator __first, _Sentinel __last, difference_type __n); 6152e43a304SNikolas Klauser 6162e43a304SNikolas Klauser template <class _InputIterator, class _Sentinel> 6172e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 6182e43a304SNikolas Klauser __construct_at_end(_InputIterator __first, _Sentinel __last, size_type __n); 6192e43a304SNikolas Klauser 6202e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __append(size_type __n); 6212e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __append(size_type __n, const_reference __x); 6222e43a304SNikolas Klauser 6232e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator __make_iter(pointer __p) _NOEXCEPT { 6242e43a304SNikolas Klauser #ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_VECTOR 6252e43a304SNikolas Klauser // Bound the iterator according to the capacity, rather than the size. 6262e43a304SNikolas Klauser // 6272e43a304SNikolas Klauser // Vector guarantees that iterators stay valid as long as no reallocation occurs even if new elements are inserted 6282e43a304SNikolas Klauser // into the container; for these cases, we need to make sure that the newly-inserted elements can be accessed 6292e43a304SNikolas Klauser // through the bounded iterator without failing checks. The downside is that the bounded iterator won't catch 6302e43a304SNikolas Klauser // access that is logically out-of-bounds, i.e., goes beyond the size, but is still within the capacity. With the 6312e43a304SNikolas Klauser // current implementation, there is no connection between a bounded iterator and its associated container, so we 6322e43a304SNikolas Klauser // don't have a way to update existing valid iterators when the container is resized and thus have to go with 6332e43a304SNikolas Klauser // a laxer approach. 6342e43a304SNikolas Klauser return std::__make_bounded_iter( 6352e43a304SNikolas Klauser std::__wrap_iter<pointer>(__p), 6362e43a304SNikolas Klauser std::__wrap_iter<pointer>(this->__begin_), 6375a48162dSLouis Dionne std::__wrap_iter<pointer>(this->__cap_)); 6382e43a304SNikolas Klauser #else 6392e43a304SNikolas Klauser return iterator(__p); 6402e43a304SNikolas Klauser #endif // _LIBCPP_ABI_BOUNDED_ITERATORS_IN_VECTOR 6412e43a304SNikolas Klauser } 6422e43a304SNikolas Klauser 6432e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI const_iterator __make_iter(const_pointer __p) const _NOEXCEPT { 6442e43a304SNikolas Klauser #ifdef _LIBCPP_ABI_BOUNDED_ITERATORS_IN_VECTOR 6452e43a304SNikolas Klauser // Bound the iterator according to the capacity, rather than the size. 6462e43a304SNikolas Klauser return std::__make_bounded_iter( 6472e43a304SNikolas Klauser std::__wrap_iter<const_pointer>(__p), 6482e43a304SNikolas Klauser std::__wrap_iter<const_pointer>(this->__begin_), 6495a48162dSLouis Dionne std::__wrap_iter<const_pointer>(this->__cap_)); 6502e43a304SNikolas Klauser #else 6512e43a304SNikolas Klauser return const_iterator(__p); 6522e43a304SNikolas Klauser #endif // _LIBCPP_ABI_BOUNDED_ITERATORS_IN_VECTOR 6532e43a304SNikolas Klauser } 6542e43a304SNikolas Klauser 6552e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 6562e43a304SNikolas Klauser __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v); 6572e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pointer 6582e43a304SNikolas Klauser __swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p); 6592e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 6602e43a304SNikolas Klauser __move_range(pointer __from_s, pointer __from_e, pointer __to); 6612e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign(vector& __c, true_type) 6622e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); 6632e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign(vector& __c, false_type) 6642e43a304SNikolas Klauser _NOEXCEPT_(__alloc_traits::is_always_equal::value); 6652e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __destruct_at_end(pointer __new_last) _NOEXCEPT { 6662e43a304SNikolas Klauser size_type __old_size = size(); 6672e43a304SNikolas Klauser __base_destruct_at_end(__new_last); 6682e43a304SNikolas Klauser __annotate_shrink(__old_size); 6692e43a304SNikolas Klauser } 6702e43a304SNikolas Klauser 6712e43a304SNikolas Klauser template <class... _Args> 6722e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI inline pointer __emplace_back_slow_path(_Args&&... __args); 6732e43a304SNikolas Klauser 6742e43a304SNikolas Klauser // The following functions are no-ops outside of AddressSanitizer mode. 6752e43a304SNikolas Klauser // We call annotations for every allocator, unless explicitly disabled. 6762e43a304SNikolas Klauser // 6772e43a304SNikolas Klauser // To disable annotations for a particular allocator, change value of 6782e43a304SNikolas Klauser // __asan_annotate_container_with_allocator to false. 6792e43a304SNikolas Klauser // For more details, see the "Using libc++" documentation page or 6802e43a304SNikolas Klauser // the documentation for __sanitizer_annotate_contiguous_container. 6812e43a304SNikolas Klauser 6822e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 6832e43a304SNikolas Klauser __annotate_contiguous_container(const void* __old_mid, const void* __new_mid) const { 6842e43a304SNikolas Klauser std::__annotate_contiguous_container<_Allocator>(data(), data() + capacity(), __old_mid, __new_mid); 6852e43a304SNikolas Klauser } 6862e43a304SNikolas Klauser 6872e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __annotate_new(size_type __current_size) const _NOEXCEPT { 6882e43a304SNikolas Klauser (void)__current_size; 6892e43a304SNikolas Klauser #if _LIBCPP_HAS_ASAN 6902e43a304SNikolas Klauser __annotate_contiguous_container(data() + capacity(), data() + __current_size); 6912e43a304SNikolas Klauser #endif 6922e43a304SNikolas Klauser } 6932e43a304SNikolas Klauser 6942e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __annotate_delete() const _NOEXCEPT { 6952e43a304SNikolas Klauser #if _LIBCPP_HAS_ASAN 6962e43a304SNikolas Klauser __annotate_contiguous_container(data() + size(), data() + capacity()); 6972e43a304SNikolas Klauser #endif 6982e43a304SNikolas Klauser } 6992e43a304SNikolas Klauser 7002e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __annotate_increase(size_type __n) const _NOEXCEPT { 7012e43a304SNikolas Klauser (void)__n; 7022e43a304SNikolas Klauser #if _LIBCPP_HAS_ASAN 7032e43a304SNikolas Klauser __annotate_contiguous_container(data() + size(), data() + size() + __n); 7042e43a304SNikolas Klauser #endif 7052e43a304SNikolas Klauser } 7062e43a304SNikolas Klauser 7072e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __annotate_shrink(size_type __old_size) const _NOEXCEPT { 7082e43a304SNikolas Klauser (void)__old_size; 7092e43a304SNikolas Klauser #if _LIBCPP_HAS_ASAN 7102e43a304SNikolas Klauser __annotate_contiguous_container(data() + __old_size, data() + size()); 7112e43a304SNikolas Klauser #endif 7122e43a304SNikolas Klauser } 7132e43a304SNikolas Klauser 7142e43a304SNikolas Klauser struct _ConstructTransaction { 7152e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI explicit _ConstructTransaction(vector& __v, size_type __n) 7162e43a304SNikolas Klauser : __v_(__v), __pos_(__v.__end_), __new_end_(__v.__end_ + __n) { 7172e43a304SNikolas Klauser #if _LIBCPP_HAS_ASAN 7182e43a304SNikolas Klauser __v_.__annotate_increase(__n); 7192e43a304SNikolas Klauser #endif 7202e43a304SNikolas Klauser } 7212e43a304SNikolas Klauser 7222e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI ~_ConstructTransaction() { 7232e43a304SNikolas Klauser __v_.__end_ = __pos_; 7242e43a304SNikolas Klauser #if _LIBCPP_HAS_ASAN 7252e43a304SNikolas Klauser if (__pos_ != __new_end_) { 7262e43a304SNikolas Klauser __v_.__annotate_shrink(__new_end_ - __v_.__begin_); 7272e43a304SNikolas Klauser } 7282e43a304SNikolas Klauser #endif 7292e43a304SNikolas Klauser } 7302e43a304SNikolas Klauser 7312e43a304SNikolas Klauser vector& __v_; 7322e43a304SNikolas Klauser pointer __pos_; 7332e43a304SNikolas Klauser const_pointer const __new_end_; 7342e43a304SNikolas Klauser 7352e43a304SNikolas Klauser _ConstructTransaction(_ConstructTransaction const&) = delete; 7362e43a304SNikolas Klauser _ConstructTransaction& operator=(_ConstructTransaction const&) = delete; 7372e43a304SNikolas Klauser }; 7382e43a304SNikolas Klauser 7392e43a304SNikolas Klauser template <class... _Args> 7402e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __construct_one_at_end(_Args&&... __args) { 7412e43a304SNikolas Klauser _ConstructTransaction __tx(*this, 1); 7425a48162dSLouis Dionne __alloc_traits::construct(this->__alloc_, std::__to_address(__tx.__pos_), std::forward<_Args>(__args)...); 7432e43a304SNikolas Klauser ++__tx.__pos_; 7442e43a304SNikolas Klauser } 7452e43a304SNikolas Klauser 7462e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __base_destruct_at_end(pointer __new_last) _NOEXCEPT { 7472e43a304SNikolas Klauser pointer __soon_to_be_end = this->__end_; 7482e43a304SNikolas Klauser while (__new_last != __soon_to_be_end) 7495a48162dSLouis Dionne __alloc_traits::destroy(this->__alloc_, std::__to_address(--__soon_to_be_end)); 7502e43a304SNikolas Klauser this->__end_ = __new_last; 7512e43a304SNikolas Klauser } 7522e43a304SNikolas Klauser 7532e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __copy_assign_alloc(const vector& __c) { 7542e43a304SNikolas Klauser __copy_assign_alloc(__c, integral_constant<bool, __alloc_traits::propagate_on_container_copy_assignment::value>()); 7552e43a304SNikolas Klauser } 7562e43a304SNikolas Klauser 7572e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign_alloc(vector& __c) 7582e43a304SNikolas Klauser _NOEXCEPT_(!__alloc_traits::propagate_on_container_move_assignment::value || 7592e43a304SNikolas Klauser is_nothrow_move_assignable<allocator_type>::value) { 7602e43a304SNikolas Klauser __move_assign_alloc(__c, integral_constant<bool, __alloc_traits::propagate_on_container_move_assignment::value>()); 7612e43a304SNikolas Klauser } 7622e43a304SNikolas Klauser 76346d8aa8dSNikolas Klauser [[__noreturn__]] _LIBCPP_HIDE_FROM_ABI static void __throw_length_error() { std::__throw_length_error("vector"); } 7642e43a304SNikolas Klauser 76546d8aa8dSNikolas Klauser [[__noreturn__]] _LIBCPP_HIDE_FROM_ABI static void __throw_out_of_range() { std::__throw_out_of_range("vector"); } 7662e43a304SNikolas Klauser 7672e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __copy_assign_alloc(const vector& __c, true_type) { 7685a48162dSLouis Dionne if (this->__alloc_ != __c.__alloc_) { 7699b853f63SDominic Chen clear(); 7702e43a304SNikolas Klauser __annotate_delete(); 7715a48162dSLouis Dionne __alloc_traits::deallocate(this->__alloc_, this->__begin_, capacity()); 7725a48162dSLouis Dionne this->__begin_ = this->__end_ = this->__cap_ = nullptr; 7732e43a304SNikolas Klauser } 7745a48162dSLouis Dionne this->__alloc_ = __c.__alloc_; 7752e43a304SNikolas Klauser } 7762e43a304SNikolas Klauser 7772e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __copy_assign_alloc(const vector&, false_type) {} 7782e43a304SNikolas Klauser 7792e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign_alloc(vector& __c, true_type) 7802e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) { 7815a48162dSLouis Dionne this->__alloc_ = std::move(__c.__alloc_); 7822e43a304SNikolas Klauser } 7832e43a304SNikolas Klauser 7842e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __move_assign_alloc(vector&, false_type) _NOEXCEPT {} 785eac23a5bSFlorian Hahn 786eac23a5bSFlorian Hahn static _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI pointer __add_alignment_assumption(pointer __p) _NOEXCEPT { 787eac23a5bSFlorian Hahn #ifndef _LIBCPP_CXX03_LANG 788eac23a5bSFlorian Hahn if constexpr (is_pointer<pointer>::value) { 789eac23a5bSFlorian Hahn if (!__libcpp_is_constant_evaluated()) { 790eac23a5bSFlorian Hahn return static_cast<pointer>(__builtin_assume_aligned(__p, alignof(decltype(*__p)))); 791eac23a5bSFlorian Hahn } 792eac23a5bSFlorian Hahn } 793eac23a5bSFlorian Hahn #endif 794eac23a5bSFlorian Hahn return __p; 795eac23a5bSFlorian Hahn } 7962e43a304SNikolas Klauser }; 7972e43a304SNikolas Klauser 7982e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 17 7992e43a304SNikolas Klauser template <class _InputIterator, 8002e43a304SNikolas Klauser class _Alloc = allocator<__iter_value_type<_InputIterator>>, 8012e43a304SNikolas Klauser class = enable_if_t<__has_input_iterator_category<_InputIterator>::value>, 8022e43a304SNikolas Klauser class = enable_if_t<__is_allocator<_Alloc>::value> > 8032e43a304SNikolas Klauser vector(_InputIterator, _InputIterator) -> vector<__iter_value_type<_InputIterator>, _Alloc>; 8042e43a304SNikolas Klauser 8052e43a304SNikolas Klauser template <class _InputIterator, 8062e43a304SNikolas Klauser class _Alloc, 8072e43a304SNikolas Klauser class = enable_if_t<__has_input_iterator_category<_InputIterator>::value>, 8082e43a304SNikolas Klauser class = enable_if_t<__is_allocator<_Alloc>::value> > 8092e43a304SNikolas Klauser vector(_InputIterator, _InputIterator, _Alloc) -> vector<__iter_value_type<_InputIterator>, _Alloc>; 8102e43a304SNikolas Klauser #endif 8112e43a304SNikolas Klauser 8122e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 23 8132e43a304SNikolas Klauser template <ranges::input_range _Range, 8142e43a304SNikolas Klauser class _Alloc = allocator<ranges::range_value_t<_Range>>, 8152e43a304SNikolas Klauser class = enable_if_t<__is_allocator<_Alloc>::value> > 8162e43a304SNikolas Klauser vector(from_range_t, _Range&&, _Alloc = _Alloc()) -> vector<ranges::range_value_t<_Range>, _Alloc>; 8172e43a304SNikolas Klauser #endif 8182e43a304SNikolas Klauser 8192e43a304SNikolas Klauser // __swap_out_circular_buffer relocates the objects in [__begin_, __end_) into the front of __v and swaps the buffers of 8202e43a304SNikolas Klauser // *this and __v. It is assumed that __v provides space for exactly (__end_ - __begin_) objects in the front. This 8212e43a304SNikolas Klauser // function has a strong exception guarantee. 8222e43a304SNikolas Klauser template <class _Tp, class _Allocator> 8232e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void 8242e43a304SNikolas Klauser vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v) { 8252e43a304SNikolas Klauser __annotate_delete(); 8262e43a304SNikolas Klauser auto __new_begin = __v.__begin_ - (__end_ - __begin_); 8272e43a304SNikolas Klauser std::__uninitialized_allocator_relocate( 8285a48162dSLouis Dionne this->__alloc_, std::__to_address(__begin_), std::__to_address(__end_), std::__to_address(__new_begin)); 8292e43a304SNikolas Klauser __v.__begin_ = __new_begin; 8302e43a304SNikolas Klauser __end_ = __begin_; // All the objects have been destroyed by relocating them. 8312e43a304SNikolas Klauser std::swap(this->__begin_, __v.__begin_); 8322e43a304SNikolas Klauser std::swap(this->__end_, __v.__end_); 8335a48162dSLouis Dionne std::swap(this->__cap_, __v.__cap_); 8342e43a304SNikolas Klauser __v.__first_ = __v.__begin_; 8352e43a304SNikolas Klauser __annotate_new(size()); 8362e43a304SNikolas Klauser } 8372e43a304SNikolas Klauser 8382e43a304SNikolas Klauser // __swap_out_circular_buffer relocates the objects in [__begin_, __p) into the front of __v, the objects in 8392e43a304SNikolas Klauser // [__p, __end_) into the back of __v and swaps the buffers of *this and __v. It is assumed that __v provides space for 8402e43a304SNikolas Klauser // exactly (__p - __begin_) objects in the front and space for at least (__end_ - __p) objects in the back. This 8412e43a304SNikolas Klauser // function has a strong exception guarantee if __begin_ == __p || __end_ == __p. 8422e43a304SNikolas Klauser template <class _Tp, class _Allocator> 8432e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::pointer 8442e43a304SNikolas Klauser vector<_Tp, _Allocator>::__swap_out_circular_buffer(__split_buffer<value_type, allocator_type&>& __v, pointer __p) { 8452e43a304SNikolas Klauser __annotate_delete(); 8462e43a304SNikolas Klauser pointer __ret = __v.__begin_; 8472e43a304SNikolas Klauser 8482e43a304SNikolas Klauser // Relocate [__p, __end_) first to avoid having a hole in [__begin_, __end_) 8492e43a304SNikolas Klauser // in case something in [__begin_, __p) throws. 8502e43a304SNikolas Klauser std::__uninitialized_allocator_relocate( 8515a48162dSLouis Dionne this->__alloc_, std::__to_address(__p), std::__to_address(__end_), std::__to_address(__v.__end_)); 8522e43a304SNikolas Klauser __v.__end_ += (__end_ - __p); 8532e43a304SNikolas Klauser __end_ = __p; // The objects in [__p, __end_) have been destroyed by relocating them. 8542e43a304SNikolas Klauser auto __new_begin = __v.__begin_ - (__p - __begin_); 8552e43a304SNikolas Klauser 8562e43a304SNikolas Klauser std::__uninitialized_allocator_relocate( 8575a48162dSLouis Dionne this->__alloc_, std::__to_address(__begin_), std::__to_address(__p), std::__to_address(__new_begin)); 8582e43a304SNikolas Klauser __v.__begin_ = __new_begin; 8592e43a304SNikolas Klauser __end_ = __begin_; // All the objects have been destroyed by relocating them. 8602e43a304SNikolas Klauser 8612e43a304SNikolas Klauser std::swap(this->__begin_, __v.__begin_); 8622e43a304SNikolas Klauser std::swap(this->__end_, __v.__end_); 8635a48162dSLouis Dionne std::swap(this->__cap_, __v.__cap_); 8642e43a304SNikolas Klauser __v.__first_ = __v.__begin_; 8652e43a304SNikolas Klauser __annotate_new(size()); 8662e43a304SNikolas Klauser return __ret; 8672e43a304SNikolas Klauser } 8682e43a304SNikolas Klauser 8692e43a304SNikolas Klauser template <class _Tp, class _Allocator> 8702e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::__vdeallocate() _NOEXCEPT { 8712e43a304SNikolas Klauser if (this->__begin_ != nullptr) { 8722e43a304SNikolas Klauser clear(); 8732e43a304SNikolas Klauser __annotate_delete(); 8745a48162dSLouis Dionne __alloc_traits::deallocate(this->__alloc_, this->__begin_, capacity()); 8755a48162dSLouis Dionne this->__begin_ = this->__end_ = this->__cap_ = nullptr; 8762e43a304SNikolas Klauser } 8772e43a304SNikolas Klauser } 8782e43a304SNikolas Klauser 8792e43a304SNikolas Klauser // Precondition: __new_size > capacity() 8802e43a304SNikolas Klauser template <class _Tp, class _Allocator> 8812e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::size_type 8822e43a304SNikolas Klauser vector<_Tp, _Allocator>::__recommend(size_type __new_size) const { 8832e43a304SNikolas Klauser const size_type __ms = max_size(); 8842e43a304SNikolas Klauser if (__new_size > __ms) 8852e43a304SNikolas Klauser this->__throw_length_error(); 8862e43a304SNikolas Klauser const size_type __cap = capacity(); 8872e43a304SNikolas Klauser if (__cap >= __ms / 2) 8882e43a304SNikolas Klauser return __ms; 8892e43a304SNikolas Klauser return std::max<size_type>(2 * __cap, __new_size); 8902e43a304SNikolas Klauser } 8912e43a304SNikolas Klauser 8922e43a304SNikolas Klauser // Default constructs __n objects starting at __end_ 8932e43a304SNikolas Klauser // throws if construction throws 8942e43a304SNikolas Klauser // Precondition: __n > 0 8952e43a304SNikolas Klauser // Precondition: size() + __n <= capacity() 8962e43a304SNikolas Klauser // Postcondition: size() == size() + __n 8972e43a304SNikolas Klauser template <class _Tp, class _Allocator> 8982e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::__construct_at_end(size_type __n) { 8992e43a304SNikolas Klauser _ConstructTransaction __tx(*this, __n); 9002e43a304SNikolas Klauser const_pointer __new_end = __tx.__new_end_; 9012e43a304SNikolas Klauser for (pointer __pos = __tx.__pos_; __pos != __new_end; __tx.__pos_ = ++__pos) { 9025a48162dSLouis Dionne __alloc_traits::construct(this->__alloc_, std::__to_address(__pos)); 9032e43a304SNikolas Klauser } 9042e43a304SNikolas Klauser } 9052e43a304SNikolas Klauser 9062e43a304SNikolas Klauser // Copy constructs __n objects starting at __end_ from __x 9072e43a304SNikolas Klauser // throws if construction throws 9082e43a304SNikolas Klauser // Precondition: __n > 0 9092e43a304SNikolas Klauser // Precondition: size() + __n <= capacity() 9102e43a304SNikolas Klauser // Postcondition: size() == old size() + __n 9112e43a304SNikolas Klauser // Postcondition: [i] == __x for all i in [size() - __n, __n) 9122e43a304SNikolas Klauser template <class _Tp, class _Allocator> 9132e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 inline void 9142e43a304SNikolas Klauser vector<_Tp, _Allocator>::__construct_at_end(size_type __n, const_reference __x) { 9152e43a304SNikolas Klauser _ConstructTransaction __tx(*this, __n); 9162e43a304SNikolas Klauser const_pointer __new_end = __tx.__new_end_; 9172e43a304SNikolas Klauser for (pointer __pos = __tx.__pos_; __pos != __new_end; __tx.__pos_ = ++__pos) { 9185a48162dSLouis Dionne __alloc_traits::construct(this->__alloc_, std::__to_address(__pos), __x); 9192e43a304SNikolas Klauser } 9202e43a304SNikolas Klauser } 9212e43a304SNikolas Klauser 9222e43a304SNikolas Klauser template <class _Tp, class _Allocator> 9232e43a304SNikolas Klauser template <class _InputIterator, class _Sentinel> 9242e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void 9252e43a304SNikolas Klauser vector<_Tp, _Allocator>::__construct_at_end(_InputIterator __first, _Sentinel __last, size_type __n) { 9262e43a304SNikolas Klauser _ConstructTransaction __tx(*this, __n); 927*733a98dbSA. Jiang __tx.__pos_ = std::__uninitialized_allocator_copy(this->__alloc_, std::move(__first), std::move(__last), __tx.__pos_); 9282e43a304SNikolas Klauser } 9292e43a304SNikolas Klauser 9302e43a304SNikolas Klauser // Default constructs __n objects starting at __end_ 9312e43a304SNikolas Klauser // throws if construction throws 9322e43a304SNikolas Klauser // Postcondition: size() == size() + __n 9332e43a304SNikolas Klauser // Exception safety: strong. 9342e43a304SNikolas Klauser template <class _Tp, class _Allocator> 9352e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::__append(size_type __n) { 9365a48162dSLouis Dionne if (static_cast<size_type>(this->__cap_ - this->__end_) >= __n) 9372e43a304SNikolas Klauser this->__construct_at_end(__n); 9382e43a304SNikolas Klauser else { 9395a48162dSLouis Dionne __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), this->__alloc_); 9402e43a304SNikolas Klauser __v.__construct_at_end(__n); 9412e43a304SNikolas Klauser __swap_out_circular_buffer(__v); 9422e43a304SNikolas Klauser } 9432e43a304SNikolas Klauser } 9442e43a304SNikolas Klauser 9452e43a304SNikolas Klauser // Default constructs __n objects starting at __end_ 9462e43a304SNikolas Klauser // throws if construction throws 9472e43a304SNikolas Klauser // Postcondition: size() == size() + __n 9482e43a304SNikolas Klauser // Exception safety: strong. 9492e43a304SNikolas Klauser template <class _Tp, class _Allocator> 9502e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::__append(size_type __n, const_reference __x) { 9515a48162dSLouis Dionne if (static_cast<size_type>(this->__cap_ - this->__end_) >= __n) 9522e43a304SNikolas Klauser this->__construct_at_end(__n, __x); 9532e43a304SNikolas Klauser else { 9545a48162dSLouis Dionne __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), size(), this->__alloc_); 9552e43a304SNikolas Klauser __v.__construct_at_end(__n, __x); 9562e43a304SNikolas Klauser __swap_out_circular_buffer(__v); 9572e43a304SNikolas Klauser } 9582e43a304SNikolas Klauser } 9592e43a304SNikolas Klauser 9602e43a304SNikolas Klauser template <class _Tp, class _Allocator> 9612e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI vector<_Tp, _Allocator>::vector(vector&& __x) 9622e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 17 9632e43a304SNikolas Klauser noexcept 9642e43a304SNikolas Klauser #else 9652e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) 9662e43a304SNikolas Klauser #endif 9675a48162dSLouis Dionne : __alloc_(std::move(__x.__alloc_)) { 9682e43a304SNikolas Klauser this->__begin_ = __x.__begin_; 9692e43a304SNikolas Klauser this->__end_ = __x.__end_; 9705a48162dSLouis Dionne this->__cap_ = __x.__cap_; 9715a48162dSLouis Dionne __x.__begin_ = __x.__end_ = __x.__cap_ = nullptr; 9722e43a304SNikolas Klauser } 9732e43a304SNikolas Klauser 9742e43a304SNikolas Klauser template <class _Tp, class _Allocator> 9752e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI 9762e43a304SNikolas Klauser vector<_Tp, _Allocator>::vector(vector&& __x, const __type_identity_t<allocator_type>& __a) 9772e43a304SNikolas Klauser : __alloc_(__a) { 9785a48162dSLouis Dionne if (__a == __x.__alloc_) { 9792e43a304SNikolas Klauser this->__begin_ = __x.__begin_; 9802e43a304SNikolas Klauser this->__end_ = __x.__end_; 9815a48162dSLouis Dionne this->__cap_ = __x.__cap_; 9825a48162dSLouis Dionne __x.__begin_ = __x.__end_ = __x.__cap_ = nullptr; 9832e43a304SNikolas Klauser } else { 9842e43a304SNikolas Klauser typedef move_iterator<iterator> _Ip; 9855ce981e7SPeng Liu __init_with_size(_Ip(__x.begin()), _Ip(__x.end()), __x.size()); 9862e43a304SNikolas Klauser } 9872e43a304SNikolas Klauser } 9882e43a304SNikolas Klauser 9892e43a304SNikolas Klauser template <class _Tp, class _Allocator> 9902e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::__move_assign(vector& __c, false_type) 9912e43a304SNikolas Klauser _NOEXCEPT_(__alloc_traits::is_always_equal::value) { 9925a48162dSLouis Dionne if (this->__alloc_ != __c.__alloc_) { 9932e43a304SNikolas Klauser typedef move_iterator<iterator> _Ip; 9942e43a304SNikolas Klauser assign(_Ip(__c.begin()), _Ip(__c.end())); 9952e43a304SNikolas Klauser } else 9962e43a304SNikolas Klauser __move_assign(__c, true_type()); 9972e43a304SNikolas Klauser } 9982e43a304SNikolas Klauser 9992e43a304SNikolas Klauser template <class _Tp, class _Allocator> 10002e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::__move_assign(vector& __c, true_type) 10012e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) { 10022e43a304SNikolas Klauser __vdeallocate(); 10032e43a304SNikolas Klauser __move_assign_alloc(__c); // this can throw 10042e43a304SNikolas Klauser this->__begin_ = __c.__begin_; 10052e43a304SNikolas Klauser this->__end_ = __c.__end_; 10065a48162dSLouis Dionne this->__cap_ = __c.__cap_; 10075a48162dSLouis Dionne __c.__begin_ = __c.__end_ = __c.__cap_ = nullptr; 10082e43a304SNikolas Klauser } 10092e43a304SNikolas Klauser 10102e43a304SNikolas Klauser template <class _Tp, class _Allocator> 10112e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI vector<_Tp, _Allocator>& 10122e43a304SNikolas Klauser vector<_Tp, _Allocator>::operator=(const vector& __x) { 10132e43a304SNikolas Klauser if (this != std::addressof(__x)) { 10142e43a304SNikolas Klauser __copy_assign_alloc(__x); 10152e43a304SNikolas Klauser assign(__x.__begin_, __x.__end_); 10162e43a304SNikolas Klauser } 10172e43a304SNikolas Klauser return *this; 10182e43a304SNikolas Klauser } 10192e43a304SNikolas Klauser 10202e43a304SNikolas Klauser template <class _Tp, class _Allocator> 10212e43a304SNikolas Klauser template <class _Iterator, class _Sentinel> 10222e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 10232e43a304SNikolas Klauser vector<_Tp, _Allocator>::__assign_with_sentinel(_Iterator __first, _Sentinel __last) { 1024056153f3SPeng Liu pointer __cur = __begin_; 1025056153f3SPeng Liu for (; __first != __last && __cur != __end_; ++__first, (void)++__cur) 1026056153f3SPeng Liu *__cur = *__first; 1027056153f3SPeng Liu if (__cur != __end_) { 1028056153f3SPeng Liu __destruct_at_end(__cur); 1029056153f3SPeng Liu } else { 10302e43a304SNikolas Klauser for (; __first != __last; ++__first) 10312e43a304SNikolas Klauser emplace_back(*__first); 10322e43a304SNikolas Klauser } 1033056153f3SPeng Liu } 10342e43a304SNikolas Klauser 10352e43a304SNikolas Klauser template <class _Tp, class _Allocator> 1036*733a98dbSA. Jiang template <class _Iterator, class _Sentinel> 10372e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 1038*733a98dbSA. Jiang vector<_Tp, _Allocator>::__assign_with_size(_Iterator __first, _Sentinel __last, difference_type __n) { 10392e43a304SNikolas Klauser size_type __new_size = static_cast<size_type>(__n); 10402e43a304SNikolas Klauser if (__new_size <= capacity()) { 10412e43a304SNikolas Klauser if (__new_size > size()) { 1042*733a98dbSA. Jiang #if _LIBCPP_STD_VER >= 23 1043*733a98dbSA. Jiang auto __mid = ranges::copy_n(std::move(__first), size(), this->__begin_).in; 1044*733a98dbSA. Jiang __construct_at_end(std::move(__mid), std::move(__last), __new_size - size()); 1045*733a98dbSA. Jiang #else 1046*733a98dbSA. Jiang _Iterator __mid = std::next(__first, size()); 10472e43a304SNikolas Klauser std::copy(__first, __mid, this->__begin_); 10482e43a304SNikolas Klauser __construct_at_end(__mid, __last, __new_size - size()); 1049*733a98dbSA. Jiang #endif 10502e43a304SNikolas Klauser } else { 1051*733a98dbSA. Jiang pointer __m = std::__copy(std::move(__first), __last, this->__begin_).second; 10522e43a304SNikolas Klauser this->__destruct_at_end(__m); 10532e43a304SNikolas Klauser } 10542e43a304SNikolas Klauser } else { 10552e43a304SNikolas Klauser __vdeallocate(); 10562e43a304SNikolas Klauser __vallocate(__recommend(__new_size)); 1057*733a98dbSA. Jiang __construct_at_end(std::move(__first), std::move(__last), __new_size); 10582e43a304SNikolas Klauser } 10592e43a304SNikolas Klauser } 10602e43a304SNikolas Klauser 10612e43a304SNikolas Klauser template <class _Tp, class _Allocator> 10622e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::assign(size_type __n, const_reference __u) { 10632e43a304SNikolas Klauser if (__n <= capacity()) { 10642e43a304SNikolas Klauser size_type __s = size(); 10652e43a304SNikolas Klauser std::fill_n(this->__begin_, std::min(__n, __s), __u); 10662e43a304SNikolas Klauser if (__n > __s) 10672e43a304SNikolas Klauser __construct_at_end(__n - __s, __u); 10682e43a304SNikolas Klauser else 10692e43a304SNikolas Klauser this->__destruct_at_end(this->__begin_ + __n); 10702e43a304SNikolas Klauser } else { 10712e43a304SNikolas Klauser __vdeallocate(); 10722e43a304SNikolas Klauser __vallocate(__recommend(static_cast<size_type>(__n))); 10732e43a304SNikolas Klauser __construct_at_end(__n, __u); 10742e43a304SNikolas Klauser } 10752e43a304SNikolas Klauser } 10762e43a304SNikolas Klauser 10772e43a304SNikolas Klauser template <class _Tp, class _Allocator> 10782e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::reserve(size_type __n) { 10792e43a304SNikolas Klauser if (__n > capacity()) { 10802e43a304SNikolas Klauser if (__n > max_size()) 10812e43a304SNikolas Klauser this->__throw_length_error(); 10825a48162dSLouis Dionne __split_buffer<value_type, allocator_type&> __v(__n, size(), this->__alloc_); 10832e43a304SNikolas Klauser __swap_out_circular_buffer(__v); 10842e43a304SNikolas Klauser } 10852e43a304SNikolas Klauser } 10862e43a304SNikolas Klauser 10872e43a304SNikolas Klauser template <class _Tp, class _Allocator> 10882e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::shrink_to_fit() _NOEXCEPT { 10892e43a304SNikolas Klauser if (capacity() > size()) { 10902e43a304SNikolas Klauser #if _LIBCPP_HAS_EXCEPTIONS 10912e43a304SNikolas Klauser try { 10922e43a304SNikolas Klauser #endif // _LIBCPP_HAS_EXCEPTIONS 10935a48162dSLouis Dionne __split_buffer<value_type, allocator_type&> __v(size(), size(), this->__alloc_); 10942e43a304SNikolas Klauser // The Standard mandates shrink_to_fit() does not increase the capacity. 10952e43a304SNikolas Klauser // With equal capacity keep the existing buffer. This avoids extra work 10962e43a304SNikolas Klauser // due to swapping the elements. 10972e43a304SNikolas Klauser if (__v.capacity() < capacity()) 10982e43a304SNikolas Klauser __swap_out_circular_buffer(__v); 10992e43a304SNikolas Klauser #if _LIBCPP_HAS_EXCEPTIONS 11002e43a304SNikolas Klauser } catch (...) { 11012e43a304SNikolas Klauser } 11022e43a304SNikolas Klauser #endif // _LIBCPP_HAS_EXCEPTIONS 11032e43a304SNikolas Klauser } 11042e43a304SNikolas Klauser } 11052e43a304SNikolas Klauser 11062e43a304SNikolas Klauser template <class _Tp, class _Allocator> 11072e43a304SNikolas Klauser template <class... _Args> 11082e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::pointer 11092e43a304SNikolas Klauser vector<_Tp, _Allocator>::__emplace_back_slow_path(_Args&&... __args) { 11105a48162dSLouis Dionne __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), size(), this->__alloc_); 11112e43a304SNikolas Klauser // __v.emplace_back(std::forward<_Args>(__args)...); 11125a48162dSLouis Dionne __alloc_traits::construct(this->__alloc_, std::__to_address(__v.__end_), std::forward<_Args>(__args)...); 11132e43a304SNikolas Klauser __v.__end_++; 11142e43a304SNikolas Klauser __swap_out_circular_buffer(__v); 11152e43a304SNikolas Klauser return this->__end_; 11162e43a304SNikolas Klauser } 11172e43a304SNikolas Klauser 11182e43a304SNikolas Klauser template <class _Tp, class _Allocator> 11192e43a304SNikolas Klauser template <class... _Args> 11202e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 inline 11212e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 17 11222e43a304SNikolas Klauser typename vector<_Tp, _Allocator>::reference 11232e43a304SNikolas Klauser #else 11242e43a304SNikolas Klauser void 11252e43a304SNikolas Klauser #endif 11262e43a304SNikolas Klauser vector<_Tp, _Allocator>::emplace_back(_Args&&... __args) { 11272e43a304SNikolas Klauser pointer __end = this->__end_; 11285a48162dSLouis Dionne if (__end < this->__cap_) { 11292e43a304SNikolas Klauser __construct_one_at_end(std::forward<_Args>(__args)...); 11302e43a304SNikolas Klauser ++__end; 11312e43a304SNikolas Klauser } else { 11322e43a304SNikolas Klauser __end = __emplace_back_slow_path(std::forward<_Args>(__args)...); 11332e43a304SNikolas Klauser } 11342e43a304SNikolas Klauser this->__end_ = __end; 11352e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 17 11362e43a304SNikolas Klauser return *(__end - 1); 11372e43a304SNikolas Klauser #endif 11382e43a304SNikolas Klauser } 11392e43a304SNikolas Klauser 11402e43a304SNikolas Klauser template <class _Tp, class _Allocator> 11412e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 inline _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::iterator 11422e43a304SNikolas Klauser vector<_Tp, _Allocator>::erase(const_iterator __position) { 11432e43a304SNikolas Klauser _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS( 11442e43a304SNikolas Klauser __position != end(), "vector::erase(iterator) called with a non-dereferenceable iterator"); 11452e43a304SNikolas Klauser difference_type __ps = __position - cbegin(); 11462e43a304SNikolas Klauser pointer __p = this->__begin_ + __ps; 11472e43a304SNikolas Klauser this->__destruct_at_end(std::move(__p + 1, this->__end_, __p)); 11482e43a304SNikolas Klauser return __make_iter(__p); 11492e43a304SNikolas Klauser } 11502e43a304SNikolas Klauser 11512e43a304SNikolas Klauser template <class _Tp, class _Allocator> 11522e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::iterator 11532e43a304SNikolas Klauser vector<_Tp, _Allocator>::erase(const_iterator __first, const_iterator __last) { 11542e43a304SNikolas Klauser _LIBCPP_ASSERT_VALID_INPUT_RANGE(__first <= __last, "vector::erase(first, last) called with invalid range"); 11552e43a304SNikolas Klauser pointer __p = this->__begin_ + (__first - begin()); 11562e43a304SNikolas Klauser if (__first != __last) { 11572e43a304SNikolas Klauser this->__destruct_at_end(std::move(__p + (__last - __first), this->__end_, __p)); 11582e43a304SNikolas Klauser } 11592e43a304SNikolas Klauser return __make_iter(__p); 11602e43a304SNikolas Klauser } 11612e43a304SNikolas Klauser 11622e43a304SNikolas Klauser template <class _Tp, class _Allocator> 11632e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void 11642e43a304SNikolas Klauser vector<_Tp, _Allocator>::__move_range(pointer __from_s, pointer __from_e, pointer __to) { 11652e43a304SNikolas Klauser pointer __old_last = this->__end_; 11662e43a304SNikolas Klauser difference_type __n = __old_last - __to; 11672e43a304SNikolas Klauser { 11682e43a304SNikolas Klauser pointer __i = __from_s + __n; 11692e43a304SNikolas Klauser _ConstructTransaction __tx(*this, __from_e - __i); 11702e43a304SNikolas Klauser for (pointer __pos = __tx.__pos_; __i < __from_e; ++__i, (void)++__pos, __tx.__pos_ = __pos) { 11715a48162dSLouis Dionne __alloc_traits::construct(this->__alloc_, std::__to_address(__pos), std::move(*__i)); 11722e43a304SNikolas Klauser } 11732e43a304SNikolas Klauser } 11742e43a304SNikolas Klauser std::move_backward(__from_s, __from_s + __n, __old_last); 11752e43a304SNikolas Klauser } 11762e43a304SNikolas Klauser 11772e43a304SNikolas Klauser template <class _Tp, class _Allocator> 11782e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::iterator 11792e43a304SNikolas Klauser vector<_Tp, _Allocator>::insert(const_iterator __position, const_reference __x) { 11802e43a304SNikolas Klauser pointer __p = this->__begin_ + (__position - begin()); 11815a48162dSLouis Dionne if (this->__end_ < this->__cap_) { 11822e43a304SNikolas Klauser if (__p == this->__end_) { 11832e43a304SNikolas Klauser __construct_one_at_end(__x); 11842e43a304SNikolas Klauser } else { 11852e43a304SNikolas Klauser __move_range(__p, this->__end_, __p + 1); 11862e43a304SNikolas Klauser const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x); 11872e43a304SNikolas Klauser if (std::__is_pointer_in_range(std::__to_address(__p), std::__to_address(__end_), std::addressof(__x))) 11882e43a304SNikolas Klauser ++__xr; 11892e43a304SNikolas Klauser *__p = *__xr; 11902e43a304SNikolas Klauser } 11912e43a304SNikolas Klauser } else { 11925a48162dSLouis Dionne __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, this->__alloc_); 1193f1c341c3SPeng Liu __v.emplace_back(__x); 11942e43a304SNikolas Klauser __p = __swap_out_circular_buffer(__v, __p); 11952e43a304SNikolas Klauser } 11962e43a304SNikolas Klauser return __make_iter(__p); 11972e43a304SNikolas Klauser } 11982e43a304SNikolas Klauser 11992e43a304SNikolas Klauser template <class _Tp, class _Allocator> 12002e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::iterator 12012e43a304SNikolas Klauser vector<_Tp, _Allocator>::insert(const_iterator __position, value_type&& __x) { 12022e43a304SNikolas Klauser pointer __p = this->__begin_ + (__position - begin()); 12035a48162dSLouis Dionne if (this->__end_ < this->__cap_) { 12042e43a304SNikolas Klauser if (__p == this->__end_) { 12052e43a304SNikolas Klauser __construct_one_at_end(std::move(__x)); 12062e43a304SNikolas Klauser } else { 12072e43a304SNikolas Klauser __move_range(__p, this->__end_, __p + 1); 12082e43a304SNikolas Klauser *__p = std::move(__x); 12092e43a304SNikolas Klauser } 12102e43a304SNikolas Klauser } else { 12115a48162dSLouis Dionne __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, this->__alloc_); 1212f1c341c3SPeng Liu __v.emplace_back(std::move(__x)); 12132e43a304SNikolas Klauser __p = __swap_out_circular_buffer(__v, __p); 12142e43a304SNikolas Klauser } 12152e43a304SNikolas Klauser return __make_iter(__p); 12162e43a304SNikolas Klauser } 12172e43a304SNikolas Klauser 12182e43a304SNikolas Klauser template <class _Tp, class _Allocator> 12192e43a304SNikolas Klauser template <class... _Args> 12202e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::iterator 12212e43a304SNikolas Klauser vector<_Tp, _Allocator>::emplace(const_iterator __position, _Args&&... __args) { 12222e43a304SNikolas Klauser pointer __p = this->__begin_ + (__position - begin()); 12235a48162dSLouis Dionne if (this->__end_ < this->__cap_) { 12242e43a304SNikolas Klauser if (__p == this->__end_) { 12252e43a304SNikolas Klauser __construct_one_at_end(std::forward<_Args>(__args)...); 12262e43a304SNikolas Klauser } else { 12275a48162dSLouis Dionne __temp_value<value_type, _Allocator> __tmp(this->__alloc_, std::forward<_Args>(__args)...); 12282e43a304SNikolas Klauser __move_range(__p, this->__end_, __p + 1); 12292e43a304SNikolas Klauser *__p = std::move(__tmp.get()); 12302e43a304SNikolas Klauser } 12312e43a304SNikolas Klauser } else { 12325a48162dSLouis Dionne __split_buffer<value_type, allocator_type&> __v(__recommend(size() + 1), __p - this->__begin_, this->__alloc_); 12332e43a304SNikolas Klauser __v.emplace_back(std::forward<_Args>(__args)...); 12342e43a304SNikolas Klauser __p = __swap_out_circular_buffer(__v, __p); 12352e43a304SNikolas Klauser } 12362e43a304SNikolas Klauser return __make_iter(__p); 12372e43a304SNikolas Klauser } 12382e43a304SNikolas Klauser 12392e43a304SNikolas Klauser template <class _Tp, class _Allocator> 12402e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<_Tp, _Allocator>::iterator 12412e43a304SNikolas Klauser vector<_Tp, _Allocator>::insert(const_iterator __position, size_type __n, const_reference __x) { 12422e43a304SNikolas Klauser pointer __p = this->__begin_ + (__position - begin()); 12432e43a304SNikolas Klauser if (__n > 0) { 12442e43a304SNikolas Klauser // We can't compare unrelated pointers inside constant expressions 12455a48162dSLouis Dionne if (!__libcpp_is_constant_evaluated() && __n <= static_cast<size_type>(this->__cap_ - this->__end_)) { 12462e43a304SNikolas Klauser size_type __old_n = __n; 12472e43a304SNikolas Klauser pointer __old_last = this->__end_; 12482e43a304SNikolas Klauser if (__n > static_cast<size_type>(this->__end_ - __p)) { 12492e43a304SNikolas Klauser size_type __cx = __n - (this->__end_ - __p); 12502e43a304SNikolas Klauser __construct_at_end(__cx, __x); 12512e43a304SNikolas Klauser __n -= __cx; 12522e43a304SNikolas Klauser } 12532e43a304SNikolas Klauser if (__n > 0) { 12542e43a304SNikolas Klauser __move_range(__p, __old_last, __p + __old_n); 12552e43a304SNikolas Klauser const_pointer __xr = pointer_traits<const_pointer>::pointer_to(__x); 12562e43a304SNikolas Klauser if (__p <= __xr && __xr < this->__end_) 12572e43a304SNikolas Klauser __xr += __old_n; 12582e43a304SNikolas Klauser std::fill_n(__p, __n, *__xr); 12592e43a304SNikolas Klauser } 12602e43a304SNikolas Klauser } else { 12615a48162dSLouis Dionne __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, this->__alloc_); 12622e43a304SNikolas Klauser __v.__construct_at_end(__n, __x); 12632e43a304SNikolas Klauser __p = __swap_out_circular_buffer(__v, __p); 12642e43a304SNikolas Klauser } 12652e43a304SNikolas Klauser } 12662e43a304SNikolas Klauser return __make_iter(__p); 12672e43a304SNikolas Klauser } 12682e43a304SNikolas Klauser 12692e43a304SNikolas Klauser template <class _Tp, class _Allocator> 12702e43a304SNikolas Klauser template <class _InputIterator, class _Sentinel> 12712e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::iterator 12722e43a304SNikolas Klauser vector<_Tp, _Allocator>::__insert_with_sentinel(const_iterator __position, _InputIterator __first, _Sentinel __last) { 12732e43a304SNikolas Klauser difference_type __off = __position - begin(); 12742e43a304SNikolas Klauser pointer __p = this->__begin_ + __off; 12752e43a304SNikolas Klauser pointer __old_last = this->__end_; 12760298e58cSPeng Liu for (; this->__end_ != this->__cap_ && __first != __last; ++__first) 12772e43a304SNikolas Klauser __construct_one_at_end(*__first); 12780298e58cSPeng Liu 12790298e58cSPeng Liu if (__first == __last) 12800298e58cSPeng Liu (void)std::rotate(__p, __old_last, this->__end_); 12810298e58cSPeng Liu else { 12820298e58cSPeng Liu __split_buffer<value_type, allocator_type&> __v(__alloc_); 12830298e58cSPeng Liu auto __guard = std::__make_exception_guard( 12840298e58cSPeng Liu _AllocatorDestroyRangeReverse<allocator_type, pointer>(__alloc_, __old_last, this->__end_)); 12852e43a304SNikolas Klauser __v.__construct_at_end_with_sentinel(std::move(__first), std::move(__last)); 12860298e58cSPeng Liu __split_buffer<value_type, allocator_type&> __merged( 12870298e58cSPeng Liu __recommend(size() + __v.size()), __off, __alloc_); // has `__off` positions available at the front 12880298e58cSPeng Liu std::__uninitialized_allocator_relocate( 12890298e58cSPeng Liu __alloc_, std::__to_address(__old_last), std::__to_address(this->__end_), std::__to_address(__merged.__end_)); 12900298e58cSPeng Liu __guard.__complete(); // Release the guard once objects in [__old_last_, __end_) have been successfully relocated. 12910298e58cSPeng Liu __merged.__end_ += this->__end_ - __old_last; 12920298e58cSPeng Liu this->__end_ = __old_last; 12930298e58cSPeng Liu std::__uninitialized_allocator_relocate( 12940298e58cSPeng Liu __alloc_, std::__to_address(__v.__begin_), std::__to_address(__v.__end_), std::__to_address(__merged.__end_)); 12950298e58cSPeng Liu __merged.__end_ += __v.size(); 12960298e58cSPeng Liu __v.__end_ = __v.__begin_; 12970298e58cSPeng Liu __p = __swap_out_circular_buffer(__merged, __p); 12982e43a304SNikolas Klauser } 12990298e58cSPeng Liu return __make_iter(__p); 13002e43a304SNikolas Klauser } 13012e43a304SNikolas Klauser 13022e43a304SNikolas Klauser template <class _Tp, class _Allocator> 13032e43a304SNikolas Klauser template <class _Iterator, class _Sentinel> 13042e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI typename vector<_Tp, _Allocator>::iterator 13052e43a304SNikolas Klauser vector<_Tp, _Allocator>::__insert_with_size( 13062e43a304SNikolas Klauser const_iterator __position, _Iterator __first, _Sentinel __last, difference_type __n) { 13072e43a304SNikolas Klauser pointer __p = this->__begin_ + (__position - begin()); 13082e43a304SNikolas Klauser if (__n > 0) { 13095a48162dSLouis Dionne if (__n <= this->__cap_ - this->__end_) { 13102e43a304SNikolas Klauser pointer __old_last = this->__end_; 13112e43a304SNikolas Klauser difference_type __dx = this->__end_ - __p; 13122e43a304SNikolas Klauser if (__n > __dx) { 1313*733a98dbSA. Jiang #if _LIBCPP_STD_VER >= 23 1314*733a98dbSA. Jiang if constexpr (!forward_iterator<_Iterator>) { 1315*733a98dbSA. Jiang __construct_at_end(std::move(__first), std::move(__last), __n); 1316*733a98dbSA. Jiang std::rotate(__p, __old_last, this->__end_); 1317*733a98dbSA. Jiang } else 1318*733a98dbSA. Jiang #endif 1319*733a98dbSA. Jiang { 1320*733a98dbSA. Jiang _Iterator __m = std::next(__first, __dx); 1321*733a98dbSA. Jiang __construct_at_end(__m, __last, __n - __dx); 1322*733a98dbSA. Jiang if (__dx > 0) { 1323*733a98dbSA. Jiang __move_range(__p, __old_last, __p + __n); 13242e43a304SNikolas Klauser std::copy(__first, __m, __p); 13252e43a304SNikolas Klauser } 1326*733a98dbSA. Jiang } 1327*733a98dbSA. Jiang } else { 1328*733a98dbSA. Jiang __move_range(__p, __old_last, __p + __n); 1329*733a98dbSA. Jiang #if _LIBCPP_STD_VER >= 23 1330*733a98dbSA. Jiang if constexpr (!forward_iterator<_Iterator>) { 1331*733a98dbSA. Jiang ranges::copy_n(std::move(__first), __n, __p); 1332*733a98dbSA. Jiang } else 1333*733a98dbSA. Jiang #endif 1334*733a98dbSA. Jiang { 1335*733a98dbSA. Jiang std::copy_n(__first, __n, __p); 1336*733a98dbSA. Jiang } 1337*733a98dbSA. Jiang } 13382e43a304SNikolas Klauser } else { 13395a48162dSLouis Dionne __split_buffer<value_type, allocator_type&> __v(__recommend(size() + __n), __p - this->__begin_, this->__alloc_); 1340*733a98dbSA. Jiang __v.__construct_at_end_with_size(std::move(__first), __n); 13412e43a304SNikolas Klauser __p = __swap_out_circular_buffer(__v, __p); 13422e43a304SNikolas Klauser } 13432e43a304SNikolas Klauser } 13442e43a304SNikolas Klauser return __make_iter(__p); 13452e43a304SNikolas Klauser } 13462e43a304SNikolas Klauser 13472e43a304SNikolas Klauser template <class _Tp, class _Allocator> 13482e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::resize(size_type __sz) { 13492e43a304SNikolas Klauser size_type __cs = size(); 13502e43a304SNikolas Klauser if (__cs < __sz) 13512e43a304SNikolas Klauser this->__append(__sz - __cs); 13522e43a304SNikolas Klauser else if (__cs > __sz) 13532e43a304SNikolas Klauser this->__destruct_at_end(this->__begin_ + __sz); 13542e43a304SNikolas Klauser } 13552e43a304SNikolas Klauser 13562e43a304SNikolas Klauser template <class _Tp, class _Allocator> 13572e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::resize(size_type __sz, const_reference __x) { 13582e43a304SNikolas Klauser size_type __cs = size(); 13592e43a304SNikolas Klauser if (__cs < __sz) 13602e43a304SNikolas Klauser this->__append(__sz - __cs, __x); 13612e43a304SNikolas Klauser else if (__cs > __sz) 13622e43a304SNikolas Klauser this->__destruct_at_end(this->__begin_ + __sz); 13632e43a304SNikolas Klauser } 13642e43a304SNikolas Klauser 13652e43a304SNikolas Klauser template <class _Tp, class _Allocator> 13662e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<_Tp, _Allocator>::swap(vector& __x) 13672e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 14 13682e43a304SNikolas Klauser _NOEXCEPT 13692e43a304SNikolas Klauser #else 13702e43a304SNikolas Klauser _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || __is_nothrow_swappable_v<allocator_type>) 13712e43a304SNikolas Klauser #endif 13722e43a304SNikolas Klauser { 13732e43a304SNikolas Klauser _LIBCPP_ASSERT_COMPATIBLE_ALLOCATOR( 13745a48162dSLouis Dionne __alloc_traits::propagate_on_container_swap::value || this->__alloc_ == __x.__alloc_, 13752e43a304SNikolas Klauser "vector::swap: Either propagate_on_container_swap must be true" 13762e43a304SNikolas Klauser " or the allocators must compare equal"); 13772e43a304SNikolas Klauser std::swap(this->__begin_, __x.__begin_); 13782e43a304SNikolas Klauser std::swap(this->__end_, __x.__end_); 13795a48162dSLouis Dionne std::swap(this->__cap_, __x.__cap_); 13805a48162dSLouis Dionne std::__swap_allocator(this->__alloc_, __x.__alloc_); 13812e43a304SNikolas Klauser } 13822e43a304SNikolas Klauser 13832e43a304SNikolas Klauser template <class _Tp, class _Allocator> 13842e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 bool vector<_Tp, _Allocator>::__invariants() const { 13852e43a304SNikolas Klauser if (this->__begin_ == nullptr) { 13865a48162dSLouis Dionne if (this->__end_ != nullptr || this->__cap_ != nullptr) 13872e43a304SNikolas Klauser return false; 13882e43a304SNikolas Klauser } else { 13892e43a304SNikolas Klauser if (this->__begin_ > this->__end_) 13902e43a304SNikolas Klauser return false; 13915a48162dSLouis Dionne if (this->__begin_ == this->__cap_) 13922e43a304SNikolas Klauser return false; 13935a48162dSLouis Dionne if (this->__end_ > this->__cap_) 13942e43a304SNikolas Klauser return false; 13952e43a304SNikolas Klauser } 13962e43a304SNikolas Klauser return true; 13972e43a304SNikolas Klauser } 13982e43a304SNikolas Klauser 13992e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 20 14002e43a304SNikolas Klauser template <> 14012e43a304SNikolas Klauser inline constexpr bool __format::__enable_insertable<vector<char>> = true; 1402c6f3b7bcSNikolas Klauser # if _LIBCPP_HAS_WIDE_CHARACTERS 14032e43a304SNikolas Klauser template <> 14042e43a304SNikolas Klauser inline constexpr bool __format::__enable_insertable<vector<wchar_t>> = true; 14052e43a304SNikolas Klauser # endif 14062e43a304SNikolas Klauser #endif // _LIBCPP_STD_VER >= 20 14072e43a304SNikolas Klauser 14082e43a304SNikolas Klauser _LIBCPP_END_NAMESPACE_STD 14092e43a304SNikolas Klauser 14102e43a304SNikolas Klauser _LIBCPP_POP_MACROS 14112e43a304SNikolas Klauser 14122e43a304SNikolas Klauser #endif // _LIBCPP___VECTOR_VECTOR_H 1413