xref: /llvm-project/libcxx/include/__vector/vector.h (revision 733a98db4a264f474564cc2064b8862dedd8458f)
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