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_BOOL_H 102e43a304SNikolas Klauser #define _LIBCPP___VECTOR_VECTOR_BOOL_H 112e43a304SNikolas Klauser 122e43a304SNikolas Klauser #include <__algorithm/copy.h> 132e43a304SNikolas Klauser #include <__algorithm/fill_n.h> 142e43a304SNikolas Klauser #include <__algorithm/iterator_operations.h> 152e43a304SNikolas Klauser #include <__algorithm/max.h> 162e43a304SNikolas Klauser #include <__assert> 172e43a304SNikolas Klauser #include <__bit_reference> 182e43a304SNikolas Klauser #include <__config> 192e43a304SNikolas Klauser #include <__functional/unary_function.h> 202e43a304SNikolas Klauser #include <__fwd/functional.h> 212e43a304SNikolas Klauser #include <__fwd/vector.h> 222e43a304SNikolas Klauser #include <__iterator/distance.h> 232e43a304SNikolas Klauser #include <__iterator/iterator_traits.h> 242e43a304SNikolas Klauser #include <__iterator/reverse_iterator.h> 252e43a304SNikolas Klauser #include <__memory/addressof.h> 262e43a304SNikolas Klauser #include <__memory/allocate_at_least.h> 272e43a304SNikolas Klauser #include <__memory/allocator.h> 282e43a304SNikolas Klauser #include <__memory/allocator_traits.h> 292e43a304SNikolas Klauser #include <__memory/compressed_pair.h> 302e43a304SNikolas Klauser #include <__memory/construct_at.h> 312e43a304SNikolas Klauser #include <__memory/noexcept_move_assign_container.h> 322e43a304SNikolas Klauser #include <__memory/pointer_traits.h> 332e43a304SNikolas Klauser #include <__memory/swap_allocator.h> 342e43a304SNikolas Klauser #include <__ranges/access.h> 352e43a304SNikolas Klauser #include <__ranges/concepts.h> 362e43a304SNikolas Klauser #include <__ranges/container_compatible_range.h> 372e43a304SNikolas Klauser #include <__ranges/from_range.h> 382e43a304SNikolas Klauser #include <__type_traits/enable_if.h> 392e43a304SNikolas Klauser #include <__type_traits/is_constant_evaluated.h> 402e43a304SNikolas Klauser #include <__type_traits/is_nothrow_assignable.h> 412e43a304SNikolas Klauser #include <__type_traits/is_nothrow_constructible.h> 422e43a304SNikolas Klauser #include <__type_traits/type_identity.h> 432e43a304SNikolas Klauser #include <__utility/exception_guard.h> 442e43a304SNikolas Klauser #include <__utility/forward.h> 452e43a304SNikolas Klauser #include <__utility/move.h> 462e43a304SNikolas Klauser #include <__utility/swap.h> 472e43a304SNikolas Klauser #include <climits> 482e43a304SNikolas Klauser #include <initializer_list> 492e43a304SNikolas Klauser #include <limits> 502e43a304SNikolas Klauser #include <stdexcept> 512e43a304SNikolas Klauser 522e43a304SNikolas Klauser // These headers define parts of vectors definition, since they define ADL functions or class specializations. 532e43a304SNikolas Klauser #include <__vector/comparison.h> 542e43a304SNikolas Klauser #include <__vector/container_traits.h> 552e43a304SNikolas Klauser #include <__vector/swap.h> 562e43a304SNikolas Klauser 572e43a304SNikolas Klauser #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 582e43a304SNikolas Klauser # pragma GCC system_header 592e43a304SNikolas Klauser #endif 602e43a304SNikolas Klauser 612e43a304SNikolas Klauser _LIBCPP_PUSH_MACROS 622e43a304SNikolas Klauser #include <__undef_macros> 632e43a304SNikolas Klauser 642e43a304SNikolas Klauser _LIBCPP_BEGIN_NAMESPACE_STD 652e43a304SNikolas Klauser 662e43a304SNikolas Klauser template <class _Allocator> 672e43a304SNikolas Klauser struct hash<vector<bool, _Allocator> >; 682e43a304SNikolas Klauser 692e43a304SNikolas Klauser template <class _Allocator> 702e43a304SNikolas Klauser struct __has_storage_type<vector<bool, _Allocator> > { 712e43a304SNikolas Klauser static const bool value = true; 722e43a304SNikolas Klauser }; 732e43a304SNikolas Klauser 742e43a304SNikolas Klauser template <class _Allocator> 752e43a304SNikolas Klauser class _LIBCPP_TEMPLATE_VIS vector<bool, _Allocator> { 762e43a304SNikolas Klauser public: 772e43a304SNikolas Klauser typedef vector __self; 782e43a304SNikolas Klauser typedef bool value_type; 792e43a304SNikolas Klauser typedef _Allocator allocator_type; 802e43a304SNikolas Klauser typedef allocator_traits<allocator_type> __alloc_traits; 812e43a304SNikolas Klauser typedef typename __alloc_traits::size_type size_type; 822e43a304SNikolas Klauser typedef typename __alloc_traits::difference_type difference_type; 832e43a304SNikolas Klauser typedef size_type __storage_type; 842e43a304SNikolas Klauser typedef __bit_iterator<vector, false> pointer; 852e43a304SNikolas Klauser typedef __bit_iterator<vector, true> const_pointer; 862e43a304SNikolas Klauser typedef pointer iterator; 872e43a304SNikolas Klauser typedef const_pointer const_iterator; 882e43a304SNikolas Klauser typedef std::reverse_iterator<iterator> reverse_iterator; 892e43a304SNikolas Klauser typedef std::reverse_iterator<const_iterator> const_reverse_iterator; 902e43a304SNikolas Klauser 912e43a304SNikolas Klauser private: 922e43a304SNikolas Klauser typedef __rebind_alloc<__alloc_traits, __storage_type> __storage_allocator; 932e43a304SNikolas Klauser typedef allocator_traits<__storage_allocator> __storage_traits; 942e43a304SNikolas Klauser typedef typename __storage_traits::pointer __storage_pointer; 952e43a304SNikolas Klauser typedef typename __storage_traits::const_pointer __const_storage_pointer; 962e43a304SNikolas Klauser 972e43a304SNikolas Klauser __storage_pointer __begin_; 982e43a304SNikolas Klauser size_type __size_; 992e43a304SNikolas Klauser _LIBCPP_COMPRESSED_PAIR(size_type, __cap_, __storage_allocator, __alloc_); 1002e43a304SNikolas Klauser 1012e43a304SNikolas Klauser public: 1022e43a304SNikolas Klauser typedef __bit_reference<vector> reference; 1032e43a304SNikolas Klauser #ifdef _LIBCPP_ABI_BITSET_VECTOR_BOOL_CONST_SUBSCRIPT_RETURN_BOOL 1042e43a304SNikolas Klauser using const_reference = bool; 1052e43a304SNikolas Klauser #else 1062e43a304SNikolas Klauser typedef __bit_const_reference<vector> const_reference; 1072e43a304SNikolas Klauser #endif 1082e43a304SNikolas Klauser 1092e43a304SNikolas Klauser private: 1102e43a304SNikolas Klauser static const unsigned __bits_per_word = static_cast<unsigned>(sizeof(__storage_type) * CHAR_BIT); 1112e43a304SNikolas Klauser 1122e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static size_type 1132e43a304SNikolas Klauser __internal_cap_to_external(size_type __n) _NOEXCEPT { 1142e43a304SNikolas Klauser return __n * __bits_per_word; 1152e43a304SNikolas Klauser } 1162e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static size_type 1172e43a304SNikolas Klauser __external_cap_to_internal(size_type __n) _NOEXCEPT { 1186c06253bSPeng Liu return __n > 0 ? (__n - 1) / __bits_per_word + 1 : size_type(0); 1192e43a304SNikolas Klauser } 1202e43a304SNikolas Klauser 1212e43a304SNikolas Klauser public: 1222e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector() 1232e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value); 1242e43a304SNikolas Klauser 1252e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit vector(const allocator_type& __a) 1262e43a304SNikolas Klauser #if _LIBCPP_STD_VER <= 14 1272e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value); 1282e43a304SNikolas Klauser #else 1292e43a304SNikolas Klauser _NOEXCEPT; 1302e43a304SNikolas Klauser #endif 1312e43a304SNikolas Klauser 1322e43a304SNikolas Klauser private: 1332e43a304SNikolas Klauser class __destroy_vector { 1342e43a304SNikolas Klauser public: 1352e43a304SNikolas Klauser _LIBCPP_CONSTEXPR _LIBCPP_HIDE_FROM_ABI __destroy_vector(vector& __vec) : __vec_(__vec) {} 1362e43a304SNikolas Klauser 1372e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void operator()() { 1382e43a304SNikolas Klauser if (__vec_.__begin_ != nullptr) 1395a48162dSLouis Dionne __storage_traits::deallocate(__vec_.__alloc_, __vec_.__begin_, __vec_.__cap_); 1402e43a304SNikolas Klauser } 1412e43a304SNikolas Klauser 1422e43a304SNikolas Klauser private: 1432e43a304SNikolas Klauser vector& __vec_; 1442e43a304SNikolas Klauser }; 1452e43a304SNikolas Klauser 1462e43a304SNikolas Klauser public: 1472e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 ~vector() { __destroy_vector (*this)(); } 1482e43a304SNikolas Klauser 1492e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit vector(size_type __n); 1502e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 14 1512e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 explicit vector(size_type __n, const allocator_type& __a); 1522e43a304SNikolas Klauser #endif 1532e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(size_type __n, const value_type& __v); 1542e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 1552e43a304SNikolas Klauser vector(size_type __n, const value_type& __v, const allocator_type& __a); 1562e43a304SNikolas Klauser template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> = 0> 1572e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(_InputIterator __first, _InputIterator __last); 1582e43a304SNikolas Klauser template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> = 0> 1592e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 1602e43a304SNikolas Klauser vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a); 1612e43a304SNikolas Klauser template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> = 0> 1622e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(_ForwardIterator __first, _ForwardIterator __last); 1632e43a304SNikolas Klauser template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> = 0> 1642e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 1652e43a304SNikolas Klauser vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a); 1662e43a304SNikolas Klauser 1672e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 23 1682e43a304SNikolas Klauser template <_ContainerCompatibleRange<bool> _Range> 1692e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr vector(from_range_t, _Range&& __range, const allocator_type& __a = allocator_type()) 1702e43a304SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_(0), __alloc_(static_cast<__storage_allocator>(__a)) { 1712e43a304SNikolas Klauser if constexpr (ranges::forward_range<_Range> || ranges::sized_range<_Range>) { 1722e43a304SNikolas Klauser auto __n = static_cast<size_type>(ranges::distance(__range)); 1732e43a304SNikolas Klauser __init_with_size(ranges::begin(__range), ranges::end(__range), __n); 1742e43a304SNikolas Klauser 1752e43a304SNikolas Klauser } else { 1762e43a304SNikolas Klauser __init_with_sentinel(ranges::begin(__range), ranges::end(__range)); 1772e43a304SNikolas Klauser } 1782e43a304SNikolas Klauser } 1792e43a304SNikolas Klauser #endif 1802e43a304SNikolas Klauser 1812e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(const vector& __v); 1822e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(const vector& __v, const allocator_type& __a); 1832e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector& operator=(const vector& __v); 1842e43a304SNikolas Klauser 1852e43a304SNikolas Klauser #ifndef _LIBCPP_CXX03_LANG 1862e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(initializer_list<value_type> __il); 1872e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 1882e43a304SNikolas Klauser vector(initializer_list<value_type> __il, const allocator_type& __a); 1892e43a304SNikolas Klauser 1902e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector& operator=(initializer_list<value_type> __il) { 1912e43a304SNikolas Klauser assign(__il.begin(), __il.end()); 1922e43a304SNikolas Klauser return *this; 1932e43a304SNikolas Klauser } 1942e43a304SNikolas Klauser 1952e43a304SNikolas Klauser #endif // !_LIBCPP_CXX03_LANG 1962e43a304SNikolas Klauser 1972e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector(vector&& __v) 1982e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 17 1992e43a304SNikolas Klauser noexcept; 2002e43a304SNikolas Klauser #else 2012e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value); 2022e43a304SNikolas Klauser #endif 2032e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 2042e43a304SNikolas Klauser vector(vector&& __v, const __type_identity_t<allocator_type>& __a); 2052e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector& operator=(vector&& __v) 2062e43a304SNikolas Klauser _NOEXCEPT_(__noexcept_move_assign_container<_Allocator, __alloc_traits>::value); 2072e43a304SNikolas Klauser 2082e43a304SNikolas Klauser template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> = 0> 2092e43a304SNikolas Klauser void _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 assign(_InputIterator __first, _InputIterator __last); 2102e43a304SNikolas Klauser template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> = 0> 2112e43a304SNikolas Klauser void _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 assign(_ForwardIterator __first, _ForwardIterator __last); 2122e43a304SNikolas Klauser 2132e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 23 2142e43a304SNikolas Klauser template <_ContainerCompatibleRange<bool> _Range> 2152e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr void assign_range(_Range&& __range) { 2162e43a304SNikolas Klauser if constexpr (ranges::forward_range<_Range> || ranges::sized_range<_Range>) { 2172e43a304SNikolas Klauser auto __n = static_cast<size_type>(ranges::distance(__range)); 2182e43a304SNikolas Klauser __assign_with_size(ranges::begin(__range), ranges::end(__range), __n); 2192e43a304SNikolas Klauser 2202e43a304SNikolas Klauser } else { 2212e43a304SNikolas Klauser __assign_with_sentinel(ranges::begin(__range), ranges::end(__range)); 2222e43a304SNikolas Klauser } 2232e43a304SNikolas Klauser } 2242e43a304SNikolas Klauser #endif 2252e43a304SNikolas Klauser 2262e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void assign(size_type __n, const value_type& __x); 2272e43a304SNikolas Klauser 2282e43a304SNikolas Klauser #ifndef _LIBCPP_CXX03_LANG 2292e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void assign(initializer_list<value_type> __il) { 2302e43a304SNikolas Klauser assign(__il.begin(), __il.end()); 2312e43a304SNikolas Klauser } 2322e43a304SNikolas Klauser #endif 2332e43a304SNikolas Klauser 2342e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 allocator_type get_allocator() const _NOEXCEPT { 2355a48162dSLouis Dionne return allocator_type(this->__alloc_); 2362e43a304SNikolas Klauser } 2372e43a304SNikolas Klauser 2382e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type max_size() const _NOEXCEPT; 2392e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type capacity() const _NOEXCEPT { 2405a48162dSLouis Dionne return __internal_cap_to_external(__cap_); 2412e43a304SNikolas Klauser } 2422e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type size() const _NOEXCEPT { return __size_; } 2432e43a304SNikolas Klauser [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool empty() const _NOEXCEPT { 2442e43a304SNikolas Klauser return __size_ == 0; 2452e43a304SNikolas Klauser } 2462e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void reserve(size_type __n); 2472e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void shrink_to_fit() _NOEXCEPT; 2482e43a304SNikolas Klauser 2492e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator begin() _NOEXCEPT { return __make_iter(0); } 2502e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_iterator begin() const _NOEXCEPT { return __make_iter(0); } 2512e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator end() _NOEXCEPT { return __make_iter(__size_); } 2522e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_iterator end() const _NOEXCEPT { 2532e43a304SNikolas Klauser return __make_iter(__size_); 2542e43a304SNikolas Klauser } 2552e43a304SNikolas Klauser 2562e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reverse_iterator rbegin() _NOEXCEPT { 2572e43a304SNikolas Klauser return reverse_iterator(end()); 2582e43a304SNikolas Klauser } 2592e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reverse_iterator rbegin() const _NOEXCEPT { 2602e43a304SNikolas Klauser return const_reverse_iterator(end()); 2612e43a304SNikolas Klauser } 2622e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reverse_iterator rend() _NOEXCEPT { 2632e43a304SNikolas Klauser return reverse_iterator(begin()); 2642e43a304SNikolas Klauser } 2652e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reverse_iterator rend() const _NOEXCEPT { 2662e43a304SNikolas Klauser return const_reverse_iterator(begin()); 2672e43a304SNikolas Klauser } 2682e43a304SNikolas Klauser 2692e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_iterator cbegin() const _NOEXCEPT { return __make_iter(0); } 2702e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_iterator cend() const _NOEXCEPT { 2712e43a304SNikolas Klauser return __make_iter(__size_); 2722e43a304SNikolas Klauser } 2732e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reverse_iterator crbegin() const _NOEXCEPT { 2742e43a304SNikolas Klauser return rbegin(); 2752e43a304SNikolas Klauser } 2762e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reverse_iterator crend() const _NOEXCEPT { return rend(); } 2772e43a304SNikolas Klauser 278b0542898SPeng Liu _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference operator[](size_type __n) { 279b0542898SPeng Liu _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__n < size(), "vector<bool>::operator[] index out of bounds"); 280b0542898SPeng Liu return __make_ref(__n); 281b0542898SPeng Liu } 2822e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference operator[](size_type __n) const { 283b0542898SPeng Liu _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__n < size(), "vector<bool>::operator[] index out of bounds"); 2842e43a304SNikolas Klauser return __make_ref(__n); 2852e43a304SNikolas Klauser } 28671e9a482SPeng Liu _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference at(size_type __n); 28771e9a482SPeng Liu _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference at(size_type __n) const; 2882e43a304SNikolas Klauser 289b0542898SPeng Liu _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference front() { 290b0542898SPeng Liu _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "vector<bool>::front() called on an empty vector"); 291b0542898SPeng Liu return __make_ref(0); 292b0542898SPeng Liu } 293b0542898SPeng Liu _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference front() const { 294b0542898SPeng Liu _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "vector<bool>::front() called on an empty vector"); 295b0542898SPeng Liu return __make_ref(0); 296b0542898SPeng Liu } 297b0542898SPeng Liu _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference back() { 298b0542898SPeng Liu _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "vector<bool>::back() called on an empty vector"); 299b0542898SPeng Liu return __make_ref(__size_ - 1); 300b0542898SPeng Liu } 301b0542898SPeng Liu _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference back() const { 302b0542898SPeng Liu _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "vector<bool>::back() called on an empty vector"); 303b0542898SPeng Liu return __make_ref(__size_ - 1); 304b0542898SPeng Liu } 3052e43a304SNikolas Klauser 3062e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void push_back(const value_type& __x); 3072e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 14 3082e43a304SNikolas Klauser template <class... _Args> 3092e43a304SNikolas Klauser # if _LIBCPP_STD_VER >= 17 3102e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference emplace_back(_Args&&... __args) 3112e43a304SNikolas Klauser # else 3122e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI void emplace_back(_Args&&... __args) 3132e43a304SNikolas Klauser # endif 3142e43a304SNikolas Klauser { 3152e43a304SNikolas Klauser push_back(value_type(std::forward<_Args>(__args)...)); 3162e43a304SNikolas Klauser # if _LIBCPP_STD_VER >= 17 3172e43a304SNikolas Klauser return this->back(); 3182e43a304SNikolas Klauser # endif 3192e43a304SNikolas Klauser } 3202e43a304SNikolas Klauser #endif 3212e43a304SNikolas Klauser 3222e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 23 3232e43a304SNikolas Klauser template <_ContainerCompatibleRange<bool> _Range> 3242e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr void append_range(_Range&& __range) { 3252e43a304SNikolas Klauser insert_range(end(), std::forward<_Range>(__range)); 3262e43a304SNikolas Klauser } 3272e43a304SNikolas Klauser #endif 3282e43a304SNikolas Klauser 329b0542898SPeng Liu _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void pop_back() { 330b0542898SPeng Liu _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(!empty(), "vector<bool>::pop_back called on an empty vector"); 331b0542898SPeng Liu --__size_; 332b0542898SPeng Liu } 3332e43a304SNikolas Klauser 3342e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 14 3352e43a304SNikolas Klauser template <class... _Args> 3362e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator emplace(const_iterator __position, _Args&&... __args) { 3372e43a304SNikolas Klauser return insert(__position, value_type(std::forward<_Args>(__args)...)); 3382e43a304SNikolas Klauser } 3392e43a304SNikolas Klauser #endif 3402e43a304SNikolas Klauser 3412e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator insert(const_iterator __position, const value_type& __x); 3422e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator 3432e43a304SNikolas Klauser insert(const_iterator __position, size_type __n, const value_type& __x); 3442e43a304SNikolas Klauser template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> = 0> 3452e43a304SNikolas Klauser iterator _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 3462e43a304SNikolas Klauser insert(const_iterator __position, _InputIterator __first, _InputIterator __last); 3472e43a304SNikolas Klauser template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> = 0> 3482e43a304SNikolas Klauser iterator _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 3492e43a304SNikolas Klauser insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last); 3502e43a304SNikolas Klauser 3512e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 23 3522e43a304SNikolas Klauser template <_ContainerCompatibleRange<bool> _Range> 3532e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI constexpr iterator insert_range(const_iterator __position, _Range&& __range) { 3542e43a304SNikolas Klauser if constexpr (ranges::forward_range<_Range> || ranges::sized_range<_Range>) { 3552e43a304SNikolas Klauser auto __n = static_cast<size_type>(ranges::distance(__range)); 3562e43a304SNikolas Klauser return __insert_with_size(__position, ranges::begin(__range), ranges::end(__range), __n); 3572e43a304SNikolas Klauser 3582e43a304SNikolas Klauser } else { 3592e43a304SNikolas Klauser return __insert_with_sentinel(__position, ranges::begin(__range), ranges::end(__range)); 3602e43a304SNikolas Klauser } 3612e43a304SNikolas Klauser } 3622e43a304SNikolas Klauser #endif 3632e43a304SNikolas Klauser 3642e43a304SNikolas Klauser #ifndef _LIBCPP_CXX03_LANG 3652e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator 3662e43a304SNikolas Klauser insert(const_iterator __position, initializer_list<value_type> __il) { 3672e43a304SNikolas Klauser return insert(__position, __il.begin(), __il.end()); 3682e43a304SNikolas Klauser } 3692e43a304SNikolas Klauser #endif 3702e43a304SNikolas Klauser 3712e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator erase(const_iterator __position); 3722e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator erase(const_iterator __first, const_iterator __last); 3732e43a304SNikolas Klauser 3742e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void clear() _NOEXCEPT { __size_ = 0; } 3752e43a304SNikolas Klauser 3762e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void swap(vector&) 3772e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 14 3782e43a304SNikolas Klauser _NOEXCEPT; 3792e43a304SNikolas Klauser #else 3802e43a304SNikolas Klauser _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || __is_nothrow_swappable_v<allocator_type>); 3812e43a304SNikolas Klauser #endif 3822e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static void swap(reference __x, reference __y) _NOEXCEPT { 3832e43a304SNikolas Klauser std::swap(__x, __y); 3842e43a304SNikolas Klauser } 3852e43a304SNikolas Klauser 3862e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void resize(size_type __sz, value_type __x = false); 3872e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void flip() _NOEXCEPT; 3882e43a304SNikolas Klauser 3892e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 bool __invariants() const; 3902e43a304SNikolas Klauser 3912e43a304SNikolas Klauser private: 39246d8aa8dSNikolas Klauser [[__noreturn__]] _LIBCPP_HIDE_FROM_ABI static void __throw_length_error() { std::__throw_length_error("vector"); } 3932e43a304SNikolas Klauser 39446d8aa8dSNikolas Klauser [[__noreturn__]] _LIBCPP_HIDE_FROM_ABI static void __throw_out_of_range() { std::__throw_out_of_range("vector"); } 3952e43a304SNikolas Klauser 3962e43a304SNikolas Klauser template <class _InputIterator, class _Sentinel> 3972e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void 3982e43a304SNikolas Klauser __init_with_size(_InputIterator __first, _Sentinel __last, size_type __n) { 3992e43a304SNikolas Klauser auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 4002e43a304SNikolas Klauser 4012e43a304SNikolas Klauser if (__n > 0) { 4022e43a304SNikolas Klauser __vallocate(__n); 4032e43a304SNikolas Klauser __construct_at_end(std::move(__first), std::move(__last), __n); 4042e43a304SNikolas Klauser } 4052e43a304SNikolas Klauser 4062e43a304SNikolas Klauser __guard.__complete(); 4072e43a304SNikolas Klauser } 4082e43a304SNikolas Klauser 4092e43a304SNikolas Klauser template <class _InputIterator, class _Sentinel> 4102e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void 4112e43a304SNikolas Klauser __init_with_sentinel(_InputIterator __first, _Sentinel __last) { 412c5cd1e95SPeng Liu auto __guard = std::__make_exception_guard(__destroy_vector(*this)); 413c5cd1e95SPeng Liu 4142e43a304SNikolas Klauser for (; __first != __last; ++__first) 4152e43a304SNikolas Klauser push_back(*__first); 416c5cd1e95SPeng Liu 417c5cd1e95SPeng Liu __guard.__complete(); 4182e43a304SNikolas Klauser } 4192e43a304SNikolas Klauser 4202e43a304SNikolas Klauser template <class _Iterator, class _Sentinel> 4212e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void __assign_with_sentinel(_Iterator __first, _Sentinel __last); 4222e43a304SNikolas Klauser 423733a98dbSA. Jiang // The `_Iterator` in `*_with_size` functions can be input-only only if called from `*_range` (since C++23). 424733a98dbSA. Jiang // Otherwise, `_Iterator` is a forward iterator. 425733a98dbSA. Jiang 426733a98dbSA. Jiang template <class _Iterator, class _Sentinel> 4272e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 428733a98dbSA. Jiang __assign_with_size(_Iterator __first, _Sentinel __last, difference_type __ns); 4292e43a304SNikolas Klauser 4302e43a304SNikolas Klauser template <class _InputIterator, class _Sentinel> 4312e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 4322e43a304SNikolas Klauser __insert_with_sentinel(const_iterator __position, _InputIterator __first, _Sentinel __last); 4332e43a304SNikolas Klauser 4342e43a304SNikolas Klauser template <class _Iterator, class _Sentinel> 4352e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI iterator 4362e43a304SNikolas Klauser __insert_with_size(const_iterator __position, _Iterator __first, _Sentinel __last, difference_type __n); 4372e43a304SNikolas Klauser 4382e43a304SNikolas Klauser // Allocate space for __n objects 4392e43a304SNikolas Klauser // throws length_error if __n > max_size() 4402e43a304SNikolas Klauser // throws (probably bad_alloc) if memory run out 4415a48162dSLouis Dionne // Precondition: __begin_ == __end_ == __cap_ == nullptr 4422e43a304SNikolas Klauser // Precondition: __n > 0 4432e43a304SNikolas Klauser // Postcondition: capacity() >= __n 4442e43a304SNikolas Klauser // Postcondition: size() == 0 4452e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __vallocate(size_type __n) { 4462e43a304SNikolas Klauser if (__n > max_size()) 4472e43a304SNikolas Klauser __throw_length_error(); 4485a48162dSLouis Dionne auto __allocation = std::__allocate_at_least(__alloc_, __external_cap_to_internal(__n)); 4492e43a304SNikolas Klauser __begin_ = __allocation.ptr; 4502e43a304SNikolas Klauser __size_ = 0; 4515a48162dSLouis Dionne __cap_ = __allocation.count; 4522e43a304SNikolas Klauser if (__libcpp_is_constant_evaluated()) { 4535a48162dSLouis Dionne for (size_type __i = 0; __i != __cap_; ++__i) 4542e43a304SNikolas Klauser std::__construct_at(std::__to_address(__begin_) + __i); 4552e43a304SNikolas Klauser } 4562e43a304SNikolas Klauser } 4572e43a304SNikolas Klauser 4582e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __vdeallocate() _NOEXCEPT; 4592e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 static size_type __align_it(size_type __new_size) _NOEXCEPT { 4602e43a304SNikolas Klauser return (__new_size + (__bits_per_word - 1)) & ~((size_type)__bits_per_word - 1); 4612e43a304SNikolas Klauser } 4622e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_type __recommend(size_type __new_size) const; 4632e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __construct_at_end(size_type __n, bool __x); 4642e43a304SNikolas Klauser template <class _InputIterator, class _Sentinel> 4652e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void 4662e43a304SNikolas Klauser __construct_at_end(_InputIterator __first, _Sentinel __last, size_type __n); 4672e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 reference __make_ref(size_type __pos) _NOEXCEPT { 4682e43a304SNikolas Klauser return reference(__begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word); 4692e43a304SNikolas Klauser } 4702e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_reference __make_ref(size_type __pos) const _NOEXCEPT { 4712e43a304SNikolas Klauser return __bit_const_reference<vector>( 4722e43a304SNikolas Klauser __begin_ + __pos / __bits_per_word, __storage_type(1) << __pos % __bits_per_word); 4732e43a304SNikolas Klauser } 4742e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator __make_iter(size_type __pos) _NOEXCEPT { 4752e43a304SNikolas Klauser return iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word)); 4762e43a304SNikolas Klauser } 4772e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 const_iterator __make_iter(size_type __pos) const _NOEXCEPT { 4782e43a304SNikolas Klauser return const_iterator(__begin_ + __pos / __bits_per_word, static_cast<unsigned>(__pos % __bits_per_word)); 4792e43a304SNikolas Klauser } 4802e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 iterator __const_iterator_cast(const_iterator __p) _NOEXCEPT { 4812e43a304SNikolas Klauser return begin() + (__p - cbegin()); 4822e43a304SNikolas Klauser } 4832e43a304SNikolas Klauser 4842e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __copy_assign_alloc(const vector& __v) { 4852e43a304SNikolas Klauser __copy_assign_alloc( 4862e43a304SNikolas Klauser __v, integral_constant<bool, __storage_traits::propagate_on_container_copy_assignment::value>()); 4872e43a304SNikolas Klauser } 4882e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __copy_assign_alloc(const vector& __c, true_type) { 4895a48162dSLouis Dionne if (__alloc_ != __c.__alloc_) 4902e43a304SNikolas Klauser __vdeallocate(); 4915a48162dSLouis Dionne __alloc_ = __c.__alloc_; 4922e43a304SNikolas Klauser } 4932e43a304SNikolas Klauser 4942e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __copy_assign_alloc(const vector&, false_type) {} 4952e43a304SNikolas Klauser 4962e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __move_assign(vector& __c, false_type); 4972e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __move_assign(vector& __c, true_type) 4982e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value); 4992e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __move_assign_alloc(vector& __c) 5002e43a304SNikolas Klauser _NOEXCEPT_(!__storage_traits::propagate_on_container_move_assignment::value || 5012e43a304SNikolas Klauser is_nothrow_move_assignable<allocator_type>::value) { 5022e43a304SNikolas Klauser __move_assign_alloc( 5032e43a304SNikolas Klauser __c, integral_constant<bool, __storage_traits::propagate_on_container_move_assignment::value>()); 5042e43a304SNikolas Klauser } 5052e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __move_assign_alloc(vector& __c, true_type) 5062e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) { 5075a48162dSLouis Dionne __alloc_ = std::move(__c.__alloc_); 5082e43a304SNikolas Klauser } 5092e43a304SNikolas Klauser 5102e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void __move_assign_alloc(vector&, false_type) _NOEXCEPT {} 5112e43a304SNikolas Klauser 5122e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_t __hash_code() const _NOEXCEPT; 5132e43a304SNikolas Klauser 5142e43a304SNikolas Klauser friend class __bit_reference<vector>; 5152e43a304SNikolas Klauser friend class __bit_const_reference<vector>; 5162e43a304SNikolas Klauser friend class __bit_iterator<vector, false>; 5172e43a304SNikolas Klauser friend class __bit_iterator<vector, true>; 5182e43a304SNikolas Klauser friend struct __bit_array<vector>; 5192e43a304SNikolas Klauser friend struct _LIBCPP_TEMPLATE_VIS hash<vector>; 5202e43a304SNikolas Klauser }; 5212e43a304SNikolas Klauser 5222e43a304SNikolas Klauser template <class _Allocator> 5232e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::__vdeallocate() _NOEXCEPT { 5242e43a304SNikolas Klauser if (this->__begin_ != nullptr) { 5255a48162dSLouis Dionne __storage_traits::deallocate(this->__alloc_, this->__begin_, __cap_); 5262e43a304SNikolas Klauser this->__begin_ = nullptr; 5275a48162dSLouis Dionne this->__size_ = this->__cap_ = 0; 5282e43a304SNikolas Klauser } 5292e43a304SNikolas Klauser } 5302e43a304SNikolas Klauser 5312e43a304SNikolas Klauser template <class _Allocator> 5322e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::size_type 5332e43a304SNikolas Klauser vector<bool, _Allocator>::max_size() const _NOEXCEPT { 5345a48162dSLouis Dionne size_type __amax = __storage_traits::max_size(__alloc_); 5352e43a304SNikolas Klauser size_type __nmax = numeric_limits<size_type>::max() / 2; // end() >= begin(), always 5362e43a304SNikolas Klauser if (__nmax / __bits_per_word <= __amax) 5372e43a304SNikolas Klauser return __nmax; 5382e43a304SNikolas Klauser return __internal_cap_to_external(__amax); 5392e43a304SNikolas Klauser } 5402e43a304SNikolas Klauser 5412e43a304SNikolas Klauser // Precondition: __new_size > capacity() 5422e43a304SNikolas Klauser template <class _Allocator> 5432e43a304SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::size_type 5442e43a304SNikolas Klauser vector<bool, _Allocator>::__recommend(size_type __new_size) const { 5452e43a304SNikolas Klauser const size_type __ms = max_size(); 5462e43a304SNikolas Klauser if (__new_size > __ms) 5472e43a304SNikolas Klauser this->__throw_length_error(); 5482e43a304SNikolas Klauser const size_type __cap = capacity(); 5492e43a304SNikolas Klauser if (__cap >= __ms / 2) 5502e43a304SNikolas Klauser return __ms; 5512e43a304SNikolas Klauser return std::max(2 * __cap, __align_it(__new_size)); 5522e43a304SNikolas Klauser } 5532e43a304SNikolas Klauser 5542e43a304SNikolas Klauser // Default constructs __n objects starting at __end_ 5552e43a304SNikolas Klauser // Precondition: size() + __n <= capacity() 5562e43a304SNikolas Klauser // Postcondition: size() == size() + __n 5572e43a304SNikolas Klauser template <class _Allocator> 5582e43a304SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 void 5592e43a304SNikolas Klauser vector<bool, _Allocator>::__construct_at_end(size_type __n, bool __x) { 560*67752f61SPeng Liu _LIBCPP_ASSERT_INTERNAL( 561*67752f61SPeng Liu capacity() >= size() + __n, "vector<bool>::__construct_at_end called with insufficient capacity"); 562*67752f61SPeng Liu std::fill_n(end(), __n, __x); 5632e43a304SNikolas Klauser this->__size_ += __n; 564*67752f61SPeng Liu if (end().__ctz_ != 0) // Ensure uninitialized leading bits in the last word are set to zero 565*67752f61SPeng Liu std::fill_n(end(), __bits_per_word - end().__ctz_, 0); 5662e43a304SNikolas Klauser } 5672e43a304SNikolas Klauser 5682e43a304SNikolas Klauser template <class _Allocator> 5692e43a304SNikolas Klauser template <class _InputIterator, class _Sentinel> 5702e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void 5712e43a304SNikolas Klauser vector<bool, _Allocator>::__construct_at_end(_InputIterator __first, _Sentinel __last, size_type __n) { 572*67752f61SPeng Liu _LIBCPP_ASSERT_INTERNAL( 573*67752f61SPeng Liu capacity() >= size() + __n, "vector<bool>::__construct_at_end called with insufficient capacity"); 574*67752f61SPeng Liu std::__copy(std::move(__first), std::move(__last), end()); 5752e43a304SNikolas Klauser this->__size_ += __n; 576*67752f61SPeng Liu if (end().__ctz_ != 0) // Ensure uninitialized leading bits in the last word are set to zero 577*67752f61SPeng Liu std::fill_n(end(), __bits_per_word - end().__ctz_, 0); 5782e43a304SNikolas Klauser } 5792e43a304SNikolas Klauser 5802e43a304SNikolas Klauser template <class _Allocator> 5812e43a304SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector() 5822e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value) 5832e43a304SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_(0) {} 5842e43a304SNikolas Klauser 5852e43a304SNikolas Klauser template <class _Allocator> 5862e43a304SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(const allocator_type& __a) 5872e43a304SNikolas Klauser #if _LIBCPP_STD_VER <= 14 5882e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value) 5892e43a304SNikolas Klauser #else 5902e43a304SNikolas Klauser _NOEXCEPT 5912e43a304SNikolas Klauser #endif 5922e43a304SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_(0), __alloc_(static_cast<__storage_allocator>(__a)) { 5932e43a304SNikolas Klauser } 5942e43a304SNikolas Klauser 5952e43a304SNikolas Klauser template <class _Allocator> 5962e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(size_type __n) 5972e43a304SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_(0) { 5982e43a304SNikolas Klauser if (__n > 0) { 5992e43a304SNikolas Klauser __vallocate(__n); 6002e43a304SNikolas Klauser __construct_at_end(__n, false); 6012e43a304SNikolas Klauser } 6022e43a304SNikolas Klauser } 6032e43a304SNikolas Klauser 6042e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 14 6052e43a304SNikolas Klauser template <class _Allocator> 6062e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(size_type __n, const allocator_type& __a) 6072e43a304SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_(0), __alloc_(static_cast<__storage_allocator>(__a)) { 6082e43a304SNikolas Klauser if (__n > 0) { 6092e43a304SNikolas Klauser __vallocate(__n); 6102e43a304SNikolas Klauser __construct_at_end(__n, false); 6112e43a304SNikolas Klauser } 6122e43a304SNikolas Klauser } 6132e43a304SNikolas Klauser #endif 6142e43a304SNikolas Klauser 6152e43a304SNikolas Klauser template <class _Allocator> 6162e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(size_type __n, const value_type& __x) 6172e43a304SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_(0) { 6182e43a304SNikolas Klauser if (__n > 0) { 6192e43a304SNikolas Klauser __vallocate(__n); 6202e43a304SNikolas Klauser __construct_at_end(__n, __x); 6212e43a304SNikolas Klauser } 6222e43a304SNikolas Klauser } 6232e43a304SNikolas Klauser 6242e43a304SNikolas Klauser template <class _Allocator> 6252e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 6262e43a304SNikolas Klauser vector<bool, _Allocator>::vector(size_type __n, const value_type& __x, const allocator_type& __a) 6272e43a304SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_(0), __alloc_(static_cast<__storage_allocator>(__a)) { 6282e43a304SNikolas Klauser if (__n > 0) { 6292e43a304SNikolas Klauser __vallocate(__n); 6302e43a304SNikolas Klauser __construct_at_end(__n, __x); 6312e43a304SNikolas Klauser } 6322e43a304SNikolas Klauser } 6332e43a304SNikolas Klauser 6342e43a304SNikolas Klauser template <class _Allocator> 6352e43a304SNikolas Klauser template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> > 6362e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last) 6372e43a304SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_(0) { 6382e43a304SNikolas Klauser __init_with_sentinel(__first, __last); 6392e43a304SNikolas Klauser } 6402e43a304SNikolas Klauser 6412e43a304SNikolas Klauser template <class _Allocator> 6422e43a304SNikolas Klauser template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> > 6432e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 6442e43a304SNikolas Klauser vector<bool, _Allocator>::vector(_InputIterator __first, _InputIterator __last, const allocator_type& __a) 6452e43a304SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_(0), __alloc_(static_cast<__storage_allocator>(__a)) { 6462e43a304SNikolas Klauser __init_with_sentinel(__first, __last); 6472e43a304SNikolas Klauser } 6482e43a304SNikolas Klauser 6492e43a304SNikolas Klauser template <class _Allocator> 6502e43a304SNikolas Klauser template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> > 6512e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last) 6522e43a304SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_(0) { 6532e43a304SNikolas Klauser auto __n = static_cast<size_type>(std::distance(__first, __last)); 6542e43a304SNikolas Klauser __init_with_size(__first, __last, __n); 6552e43a304SNikolas Klauser } 6562e43a304SNikolas Klauser 6572e43a304SNikolas Klauser template <class _Allocator> 6582e43a304SNikolas Klauser template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> > 6592e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 6602e43a304SNikolas Klauser vector<bool, _Allocator>::vector(_ForwardIterator __first, _ForwardIterator __last, const allocator_type& __a) 6612e43a304SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_(0), __alloc_(static_cast<__storage_allocator>(__a)) { 6622e43a304SNikolas Klauser auto __n = static_cast<size_type>(std::distance(__first, __last)); 6632e43a304SNikolas Klauser __init_with_size(__first, __last, __n); 6642e43a304SNikolas Klauser } 6652e43a304SNikolas Klauser 6662e43a304SNikolas Klauser #ifndef _LIBCPP_CXX03_LANG 6672e43a304SNikolas Klauser 6682e43a304SNikolas Klauser template <class _Allocator> 6692e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(initializer_list<value_type> __il) 6702e43a304SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_(0) { 6712e43a304SNikolas Klauser size_type __n = static_cast<size_type>(__il.size()); 6722e43a304SNikolas Klauser if (__n > 0) { 6732e43a304SNikolas Klauser __vallocate(__n); 6742e43a304SNikolas Klauser __construct_at_end(__il.begin(), __il.end(), __n); 6752e43a304SNikolas Klauser } 6762e43a304SNikolas Klauser } 6772e43a304SNikolas Klauser 6782e43a304SNikolas Klauser template <class _Allocator> 6792e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 6802e43a304SNikolas Klauser vector<bool, _Allocator>::vector(initializer_list<value_type> __il, const allocator_type& __a) 6812e43a304SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_(0), __alloc_(static_cast<__storage_allocator>(__a)) { 6822e43a304SNikolas Klauser size_type __n = static_cast<size_type>(__il.size()); 6832e43a304SNikolas Klauser if (__n > 0) { 6842e43a304SNikolas Klauser __vallocate(__n); 6852e43a304SNikolas Klauser __construct_at_end(__il.begin(), __il.end(), __n); 6862e43a304SNikolas Klauser } 6872e43a304SNikolas Klauser } 6882e43a304SNikolas Klauser 6892e43a304SNikolas Klauser #endif // _LIBCPP_CXX03_LANG 6902e43a304SNikolas Klauser 6912e43a304SNikolas Klauser template <class _Allocator> 6922e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(const vector& __v) 6932e43a304SNikolas Klauser : __begin_(nullptr), 6942e43a304SNikolas Klauser __size_(0), 6952e43a304SNikolas Klauser __cap_(0), 6965a48162dSLouis Dionne __alloc_(__storage_traits::select_on_container_copy_construction(__v.__alloc_)) { 6972e43a304SNikolas Klauser if (__v.size() > 0) { 6982e43a304SNikolas Klauser __vallocate(__v.size()); 6992e43a304SNikolas Klauser __construct_at_end(__v.begin(), __v.end(), __v.size()); 7002e43a304SNikolas Klauser } 7012e43a304SNikolas Klauser } 7022e43a304SNikolas Klauser 7032e43a304SNikolas Klauser template <class _Allocator> 7042e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(const vector& __v, const allocator_type& __a) 7052e43a304SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_(0), __alloc_(__a) { 7062e43a304SNikolas Klauser if (__v.size() > 0) { 7072e43a304SNikolas Klauser __vallocate(__v.size()); 7082e43a304SNikolas Klauser __construct_at_end(__v.begin(), __v.end(), __v.size()); 7092e43a304SNikolas Klauser } 7102e43a304SNikolas Klauser } 7112e43a304SNikolas Klauser 7122e43a304SNikolas Klauser template <class _Allocator> 7132e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>& vector<bool, _Allocator>::operator=(const vector& __v) { 7142e43a304SNikolas Klauser if (this != std::addressof(__v)) { 7152e43a304SNikolas Klauser __copy_assign_alloc(__v); 7162e43a304SNikolas Klauser if (__v.__size_) { 7172e43a304SNikolas Klauser if (__v.__size_ > capacity()) { 7182e43a304SNikolas Klauser __vdeallocate(); 7192e43a304SNikolas Klauser __vallocate(__v.__size_); 7202e43a304SNikolas Klauser } 7212e43a304SNikolas Klauser std::copy(__v.__begin_, __v.__begin_ + __external_cap_to_internal(__v.__size_), __begin_); 7222e43a304SNikolas Klauser } 7232e43a304SNikolas Klauser __size_ = __v.__size_; 7242e43a304SNikolas Klauser } 7252e43a304SNikolas Klauser return *this; 7262e43a304SNikolas Klauser } 7272e43a304SNikolas Klauser 7282e43a304SNikolas Klauser template <class _Allocator> 7292e43a304SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>::vector(vector&& __v) 7302e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 17 7312e43a304SNikolas Klauser _NOEXCEPT 7322e43a304SNikolas Klauser #else 7332e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value) 7342e43a304SNikolas Klauser #endif 7352e43a304SNikolas Klauser : __begin_(__v.__begin_), 7362e43a304SNikolas Klauser __size_(__v.__size_), 7372e43a304SNikolas Klauser __cap_(__v.__cap_), 7382e43a304SNikolas Klauser __alloc_(std::move(__v.__alloc_)) { 7392e43a304SNikolas Klauser __v.__begin_ = nullptr; 7402e43a304SNikolas Klauser __v.__size_ = 0; 7415a48162dSLouis Dionne __v.__cap_ = 0; 7422e43a304SNikolas Klauser } 7432e43a304SNikolas Klauser 7442e43a304SNikolas Klauser template <class _Allocator> 7452e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 7462e43a304SNikolas Klauser vector<bool, _Allocator>::vector(vector&& __v, const __type_identity_t<allocator_type>& __a) 7472e43a304SNikolas Klauser : __begin_(nullptr), __size_(0), __cap_(0), __alloc_(__a) { 7485a48162dSLouis Dionne if (__a == allocator_type(__v.__alloc_)) { 7492e43a304SNikolas Klauser this->__begin_ = __v.__begin_; 7502e43a304SNikolas Klauser this->__size_ = __v.__size_; 7515a48162dSLouis Dionne this->__cap_ = __v.__cap_; 7522e43a304SNikolas Klauser __v.__begin_ = nullptr; 7535a48162dSLouis Dionne __v.__cap_ = __v.__size_ = 0; 7542e43a304SNikolas Klauser } else if (__v.size() > 0) { 7552e43a304SNikolas Klauser __vallocate(__v.size()); 7562e43a304SNikolas Klauser __construct_at_end(__v.begin(), __v.end(), __v.size()); 7572e43a304SNikolas Klauser } 7582e43a304SNikolas Klauser } 7592e43a304SNikolas Klauser 7602e43a304SNikolas Klauser template <class _Allocator> 7612e43a304SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 vector<bool, _Allocator>& 7622e43a304SNikolas Klauser vector<bool, _Allocator>::operator=(vector&& __v) 7632e43a304SNikolas Klauser _NOEXCEPT_(__noexcept_move_assign_container<_Allocator, __alloc_traits>::value) { 7642e43a304SNikolas Klauser __move_assign(__v, integral_constant<bool, __storage_traits::propagate_on_container_move_assignment::value>()); 7652e43a304SNikolas Klauser return *this; 7662e43a304SNikolas Klauser } 7672e43a304SNikolas Klauser 7682e43a304SNikolas Klauser template <class _Allocator> 7692e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::__move_assign(vector& __c, false_type) { 7705a48162dSLouis Dionne if (__alloc_ != __c.__alloc_) 7712e43a304SNikolas Klauser assign(__c.begin(), __c.end()); 7722e43a304SNikolas Klauser else 7732e43a304SNikolas Klauser __move_assign(__c, true_type()); 7742e43a304SNikolas Klauser } 7752e43a304SNikolas Klauser 7762e43a304SNikolas Klauser template <class _Allocator> 7772e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::__move_assign(vector& __c, true_type) 7782e43a304SNikolas Klauser _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value) { 7792e43a304SNikolas Klauser __vdeallocate(); 7802e43a304SNikolas Klauser __move_assign_alloc(__c); 7812e43a304SNikolas Klauser this->__begin_ = __c.__begin_; 7822e43a304SNikolas Klauser this->__size_ = __c.__size_; 7835a48162dSLouis Dionne this->__cap_ = __c.__cap_; 7842e43a304SNikolas Klauser __c.__begin_ = nullptr; 7855a48162dSLouis Dionne __c.__cap_ = __c.__size_ = 0; 7862e43a304SNikolas Klauser } 7872e43a304SNikolas Klauser 7882e43a304SNikolas Klauser template <class _Allocator> 7892e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::assign(size_type __n, const value_type& __x) { 7902e43a304SNikolas Klauser __size_ = 0; 7912e43a304SNikolas Klauser if (__n > 0) { 7922e43a304SNikolas Klauser size_type __c = capacity(); 7932e43a304SNikolas Klauser if (__n <= __c) 7942e43a304SNikolas Klauser __size_ = __n; 7952e43a304SNikolas Klauser else { 7962e43a304SNikolas Klauser vector __v(get_allocator()); 7972e43a304SNikolas Klauser __v.reserve(__recommend(__n)); 7982e43a304SNikolas Klauser __v.__size_ = __n; 7992e43a304SNikolas Klauser swap(__v); 8002e43a304SNikolas Klauser } 8012e43a304SNikolas Klauser std::fill_n(begin(), __n, __x); 8022e43a304SNikolas Klauser } 8032e43a304SNikolas Klauser } 8042e43a304SNikolas Klauser 8052e43a304SNikolas Klauser template <class _Allocator> 8062e43a304SNikolas Klauser template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> > 8072e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::assign(_InputIterator __first, _InputIterator __last) { 8082e43a304SNikolas Klauser __assign_with_sentinel(__first, __last); 8092e43a304SNikolas Klauser } 8102e43a304SNikolas Klauser 8112e43a304SNikolas Klauser template <class _Allocator> 8122e43a304SNikolas Klauser template <class _Iterator, class _Sentinel> 8132e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 8142e43a304SNikolas Klauser vector<bool, _Allocator>::__assign_with_sentinel(_Iterator __first, _Sentinel __last) { 8152e43a304SNikolas Klauser clear(); 8162e43a304SNikolas Klauser for (; __first != __last; ++__first) 8172e43a304SNikolas Klauser push_back(*__first); 8182e43a304SNikolas Klauser } 8192e43a304SNikolas Klauser 8202e43a304SNikolas Klauser template <class _Allocator> 8212e43a304SNikolas Klauser template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> > 8222e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::assign(_ForwardIterator __first, _ForwardIterator __last) { 8232e43a304SNikolas Klauser __assign_with_size(__first, __last, std::distance(__first, __last)); 8242e43a304SNikolas Klauser } 8252e43a304SNikolas Klauser 8262e43a304SNikolas Klauser template <class _Allocator> 827733a98dbSA. Jiang template <class _Iterator, class _Sentinel> 8282e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI void 829733a98dbSA. Jiang vector<bool, _Allocator>::__assign_with_size(_Iterator __first, _Sentinel __last, difference_type __ns) { 8302e43a304SNikolas Klauser _LIBCPP_ASSERT_VALID_INPUT_RANGE(__ns >= 0, "invalid range specified"); 8312e43a304SNikolas Klauser 8322e43a304SNikolas Klauser clear(); 8332e43a304SNikolas Klauser 8342e43a304SNikolas Klauser const size_t __n = static_cast<size_type>(__ns); 8352e43a304SNikolas Klauser if (__n) { 8362e43a304SNikolas Klauser if (__n > capacity()) { 8372e43a304SNikolas Klauser __vdeallocate(); 8382e43a304SNikolas Klauser __vallocate(__n); 8392e43a304SNikolas Klauser } 840733a98dbSA. Jiang __construct_at_end(std::move(__first), std::move(__last), __n); 8412e43a304SNikolas Klauser } 8422e43a304SNikolas Klauser } 8432e43a304SNikolas Klauser 8442e43a304SNikolas Klauser template <class _Allocator> 8452e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::reserve(size_type __n) { 8462e43a304SNikolas Klauser if (__n > capacity()) { 8472e43a304SNikolas Klauser if (__n > max_size()) 8482e43a304SNikolas Klauser this->__throw_length_error(); 8492e43a304SNikolas Klauser vector __v(this->get_allocator()); 8502e43a304SNikolas Klauser __v.__vallocate(__n); 8512e43a304SNikolas Klauser __v.__construct_at_end(this->begin(), this->end(), this->size()); 8522e43a304SNikolas Klauser swap(__v); 8532e43a304SNikolas Klauser } 8542e43a304SNikolas Klauser } 8552e43a304SNikolas Klauser 8562e43a304SNikolas Klauser template <class _Allocator> 8572e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::shrink_to_fit() _NOEXCEPT { 8582d317d90SPeng Liu if (__external_cap_to_internal(size()) < __cap_) { 8592e43a304SNikolas Klauser #if _LIBCPP_HAS_EXCEPTIONS 8602e43a304SNikolas Klauser try { 8612e43a304SNikolas Klauser #endif // _LIBCPP_HAS_EXCEPTIONS 8622d317d90SPeng Liu vector __v(*this, allocator_type(__alloc_)); 8632d317d90SPeng Liu if (__v.__cap_ < __cap_) 8642d317d90SPeng Liu __v.swap(*this); 8652e43a304SNikolas Klauser #if _LIBCPP_HAS_EXCEPTIONS 8662e43a304SNikolas Klauser } catch (...) { 8672e43a304SNikolas Klauser } 8682e43a304SNikolas Klauser #endif // _LIBCPP_HAS_EXCEPTIONS 8692e43a304SNikolas Klauser } 8702e43a304SNikolas Klauser } 8712e43a304SNikolas Klauser 8722e43a304SNikolas Klauser template <class _Allocator> 87371e9a482SPeng Liu _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::reference vector<bool, _Allocator>::at(size_type __n) { 8742e43a304SNikolas Klauser if (__n >= size()) 8752e43a304SNikolas Klauser this->__throw_out_of_range(); 8762e43a304SNikolas Klauser return (*this)[__n]; 8772e43a304SNikolas Klauser } 8782e43a304SNikolas Klauser 8792e43a304SNikolas Klauser template <class _Allocator> 88071e9a482SPeng Liu _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::const_reference 88171e9a482SPeng Liu vector<bool, _Allocator>::at(size_type __n) const { 8822e43a304SNikolas Klauser if (__n >= size()) 8832e43a304SNikolas Klauser this->__throw_out_of_range(); 8842e43a304SNikolas Klauser return (*this)[__n]; 8852e43a304SNikolas Klauser } 8862e43a304SNikolas Klauser 8872e43a304SNikolas Klauser template <class _Allocator> 8882e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::push_back(const value_type& __x) { 8892e43a304SNikolas Klauser if (this->__size_ == this->capacity()) 8902e43a304SNikolas Klauser reserve(__recommend(this->__size_ + 1)); 8912e43a304SNikolas Klauser ++this->__size_; 8922e43a304SNikolas Klauser back() = __x; 8932e43a304SNikolas Klauser } 8942e43a304SNikolas Klauser 8952e43a304SNikolas Klauser template <class _Allocator> 8962e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::iterator 8972e43a304SNikolas Klauser vector<bool, _Allocator>::insert(const_iterator __position, const value_type& __x) { 8982e43a304SNikolas Klauser iterator __r; 8992e43a304SNikolas Klauser if (size() < capacity()) { 9002e43a304SNikolas Klauser const_iterator __old_end = end(); 9012e43a304SNikolas Klauser ++__size_; 9022e43a304SNikolas Klauser std::copy_backward(__position, __old_end, end()); 9032e43a304SNikolas Klauser __r = __const_iterator_cast(__position); 9042e43a304SNikolas Klauser } else { 9052e43a304SNikolas Klauser vector __v(get_allocator()); 9062e43a304SNikolas Klauser __v.reserve(__recommend(__size_ + 1)); 9072e43a304SNikolas Klauser __v.__size_ = __size_ + 1; 9082e43a304SNikolas Klauser __r = std::copy(cbegin(), __position, __v.begin()); 9092e43a304SNikolas Klauser std::copy_backward(__position, cend(), __v.end()); 9102e43a304SNikolas Klauser swap(__v); 9112e43a304SNikolas Klauser } 9122e43a304SNikolas Klauser *__r = __x; 9132e43a304SNikolas Klauser return __r; 9142e43a304SNikolas Klauser } 9152e43a304SNikolas Klauser 9162e43a304SNikolas Klauser template <class _Allocator> 9172e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::iterator 9182e43a304SNikolas Klauser vector<bool, _Allocator>::insert(const_iterator __position, size_type __n, const value_type& __x) { 9192e43a304SNikolas Klauser iterator __r; 9202e43a304SNikolas Klauser size_type __c = capacity(); 9212e43a304SNikolas Klauser if (__n <= __c && size() <= __c - __n) { 9222e43a304SNikolas Klauser const_iterator __old_end = end(); 9232e43a304SNikolas Klauser __size_ += __n; 9242e43a304SNikolas Klauser std::copy_backward(__position, __old_end, end()); 9252e43a304SNikolas Klauser __r = __const_iterator_cast(__position); 9262e43a304SNikolas Klauser } else { 9272e43a304SNikolas Klauser vector __v(get_allocator()); 9282e43a304SNikolas Klauser __v.reserve(__recommend(__size_ + __n)); 9292e43a304SNikolas Klauser __v.__size_ = __size_ + __n; 9302e43a304SNikolas Klauser __r = std::copy(cbegin(), __position, __v.begin()); 9312e43a304SNikolas Klauser std::copy_backward(__position, cend(), __v.end()); 9322e43a304SNikolas Klauser swap(__v); 9332e43a304SNikolas Klauser } 9342e43a304SNikolas Klauser std::fill_n(__r, __n, __x); 9352e43a304SNikolas Klauser return __r; 9362e43a304SNikolas Klauser } 9372e43a304SNikolas Klauser 9382e43a304SNikolas Klauser template <class _Allocator> 9392e43a304SNikolas Klauser template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> > 9402e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::iterator 9412e43a304SNikolas Klauser vector<bool, _Allocator>::insert(const_iterator __position, _InputIterator __first, _InputIterator __last) { 9422e43a304SNikolas Klauser return __insert_with_sentinel(__position, __first, __last); 9432e43a304SNikolas Klauser } 9442e43a304SNikolas Klauser 9452e43a304SNikolas Klauser template <class _Allocator> 9462e43a304SNikolas Klauser template <class _InputIterator, class _Sentinel> 9472e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI typename vector<bool, _Allocator>::iterator 9482e43a304SNikolas Klauser vector<bool, _Allocator>::__insert_with_sentinel(const_iterator __position, _InputIterator __first, _Sentinel __last) { 9492e43a304SNikolas Klauser difference_type __off = __position - begin(); 9502e43a304SNikolas Klauser iterator __p = __const_iterator_cast(__position); 9512e43a304SNikolas Klauser iterator __old_end = end(); 9522e43a304SNikolas Klauser for (; size() != capacity() && __first != __last; ++__first) { 9532e43a304SNikolas Klauser ++this->__size_; 9542e43a304SNikolas Klauser back() = *__first; 9552e43a304SNikolas Klauser } 9562e43a304SNikolas Klauser vector __v(get_allocator()); 9572e43a304SNikolas Klauser if (__first != __last) { 9582e43a304SNikolas Klauser #if _LIBCPP_HAS_EXCEPTIONS 9592e43a304SNikolas Klauser try { 9602e43a304SNikolas Klauser #endif // _LIBCPP_HAS_EXCEPTIONS 9612e43a304SNikolas Klauser __v.__assign_with_sentinel(std::move(__first), std::move(__last)); 9622e43a304SNikolas Klauser difference_type __old_size = static_cast<difference_type>(__old_end - begin()); 9632e43a304SNikolas Klauser difference_type __old_p = __p - begin(); 9642e43a304SNikolas Klauser reserve(__recommend(size() + __v.size())); 9652e43a304SNikolas Klauser __p = begin() + __old_p; 9662e43a304SNikolas Klauser __old_end = begin() + __old_size; 9672e43a304SNikolas Klauser #if _LIBCPP_HAS_EXCEPTIONS 9682e43a304SNikolas Klauser } catch (...) { 9692e43a304SNikolas Klauser erase(__old_end, end()); 9702e43a304SNikolas Klauser throw; 9712e43a304SNikolas Klauser } 9722e43a304SNikolas Klauser #endif // _LIBCPP_HAS_EXCEPTIONS 9732e43a304SNikolas Klauser } 9742e43a304SNikolas Klauser __p = std::rotate(__p, __old_end, end()); 9752e43a304SNikolas Klauser insert(__p, __v.begin(), __v.end()); 9762e43a304SNikolas Klauser return begin() + __off; 9772e43a304SNikolas Klauser } 9782e43a304SNikolas Klauser 9792e43a304SNikolas Klauser template <class _Allocator> 9802e43a304SNikolas Klauser template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> > 9812e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::iterator 9822e43a304SNikolas Klauser vector<bool, _Allocator>::insert(const_iterator __position, _ForwardIterator __first, _ForwardIterator __last) { 9832e43a304SNikolas Klauser return __insert_with_size(__position, __first, __last, std::distance(__first, __last)); 9842e43a304SNikolas Klauser } 9852e43a304SNikolas Klauser 9862e43a304SNikolas Klauser template <class _Allocator> 987733a98dbSA. Jiang template <class _Iterator, class _Sentinel> 9882e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 _LIBCPP_HIDE_FROM_ABI typename vector<bool, _Allocator>::iterator 9892e43a304SNikolas Klauser vector<bool, _Allocator>::__insert_with_size( 990733a98dbSA. Jiang const_iterator __position, _Iterator __first, _Sentinel __last, difference_type __n_signed) { 9912e43a304SNikolas Klauser _LIBCPP_ASSERT_VALID_INPUT_RANGE(__n_signed >= 0, "invalid range specified"); 9922e43a304SNikolas Klauser const size_type __n = static_cast<size_type>(__n_signed); 9932e43a304SNikolas Klauser iterator __r; 9942e43a304SNikolas Klauser size_type __c = capacity(); 9952e43a304SNikolas Klauser if (__n <= __c && size() <= __c - __n) { 9962e43a304SNikolas Klauser const_iterator __old_end = end(); 9972e43a304SNikolas Klauser __size_ += __n; 9982e43a304SNikolas Klauser std::copy_backward(__position, __old_end, end()); 9992e43a304SNikolas Klauser __r = __const_iterator_cast(__position); 10002e43a304SNikolas Klauser } else { 10012e43a304SNikolas Klauser vector __v(get_allocator()); 10022e43a304SNikolas Klauser __v.reserve(__recommend(__size_ + __n)); 10032e43a304SNikolas Klauser __v.__size_ = __size_ + __n; 10042e43a304SNikolas Klauser __r = std::copy(cbegin(), __position, __v.begin()); 10052e43a304SNikolas Klauser std::copy_backward(__position, cend(), __v.end()); 10062e43a304SNikolas Klauser swap(__v); 10072e43a304SNikolas Klauser } 1008733a98dbSA. Jiang std::__copy(std::move(__first), std::move(__last), __r); 10092e43a304SNikolas Klauser return __r; 10102e43a304SNikolas Klauser } 10112e43a304SNikolas Klauser 10122e43a304SNikolas Klauser template <class _Allocator> 10132e43a304SNikolas Klauser inline _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::iterator 10142e43a304SNikolas Klauser vector<bool, _Allocator>::erase(const_iterator __position) { 1015b0542898SPeng Liu _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS( 1016b0542898SPeng Liu __position != end(), "vector<bool>::erase(iterator) called with a non-dereferenceable iterator"); 10172e43a304SNikolas Klauser iterator __r = __const_iterator_cast(__position); 10182e43a304SNikolas Klauser std::copy(__position + 1, this->cend(), __r); 10192e43a304SNikolas Klauser --__size_; 10202e43a304SNikolas Klauser return __r; 10212e43a304SNikolas Klauser } 10222e43a304SNikolas Klauser 10232e43a304SNikolas Klauser template <class _Allocator> 10242e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 typename vector<bool, _Allocator>::iterator 10252e43a304SNikolas Klauser vector<bool, _Allocator>::erase(const_iterator __first, const_iterator __last) { 1026b0542898SPeng Liu _LIBCPP_ASSERT_VALID_INPUT_RANGE( 1027b0542898SPeng Liu __first <= __last, "vector<bool>::erase(iterator, iterator) called with an invalid range"); 10282e43a304SNikolas Klauser iterator __r = __const_iterator_cast(__first); 10292e43a304SNikolas Klauser difference_type __d = __last - __first; 10302e43a304SNikolas Klauser std::copy(__last, this->cend(), __r); 10312e43a304SNikolas Klauser __size_ -= __d; 10322e43a304SNikolas Klauser return __r; 10332e43a304SNikolas Klauser } 10342e43a304SNikolas Klauser 10352e43a304SNikolas Klauser template <class _Allocator> 10362e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::swap(vector& __x) 10372e43a304SNikolas Klauser #if _LIBCPP_STD_VER >= 14 10382e43a304SNikolas Klauser _NOEXCEPT 10392e43a304SNikolas Klauser #else 10402e43a304SNikolas Klauser _NOEXCEPT_(!__alloc_traits::propagate_on_container_swap::value || __is_nothrow_swappable_v<allocator_type>) 10412e43a304SNikolas Klauser #endif 10422e43a304SNikolas Klauser { 10432e43a304SNikolas Klauser std::swap(this->__begin_, __x.__begin_); 10442e43a304SNikolas Klauser std::swap(this->__size_, __x.__size_); 10455a48162dSLouis Dionne std::swap(this->__cap_, __x.__cap_); 10465a48162dSLouis Dionne std::__swap_allocator(this->__alloc_, __x.__alloc_); 10472e43a304SNikolas Klauser } 10482e43a304SNikolas Klauser 10492e43a304SNikolas Klauser template <class _Allocator> 10502e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::resize(size_type __sz, value_type __x) { 10512e43a304SNikolas Klauser size_type __cs = size(); 10522e43a304SNikolas Klauser if (__cs < __sz) { 10532e43a304SNikolas Klauser iterator __r; 10542e43a304SNikolas Klauser size_type __c = capacity(); 10552e43a304SNikolas Klauser size_type __n = __sz - __cs; 10562e43a304SNikolas Klauser if (__n <= __c && __cs <= __c - __n) { 10572e43a304SNikolas Klauser __r = end(); 10582e43a304SNikolas Klauser __size_ += __n; 10592e43a304SNikolas Klauser } else { 10602e43a304SNikolas Klauser vector __v(get_allocator()); 10612e43a304SNikolas Klauser __v.reserve(__recommend(__size_ + __n)); 10622e43a304SNikolas Klauser __v.__size_ = __size_ + __n; 10632e43a304SNikolas Klauser __r = std::copy(cbegin(), cend(), __v.begin()); 10642e43a304SNikolas Klauser swap(__v); 10652e43a304SNikolas Klauser } 10662e43a304SNikolas Klauser std::fill_n(__r, __n, __x); 10672e43a304SNikolas Klauser } else 10682e43a304SNikolas Klauser __size_ = __sz; 10692e43a304SNikolas Klauser } 10702e43a304SNikolas Klauser 10712e43a304SNikolas Klauser template <class _Allocator> 10722e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 void vector<bool, _Allocator>::flip() _NOEXCEPT { 1073fafdf970SPeng Liu // Flip each storage word entirely, including the last potentially partial word. 1074fafdf970SPeng Liu // The unused bits in the last word are safe to flip as they won't be accessed. 10752e43a304SNikolas Klauser __storage_pointer __p = __begin_; 1076fafdf970SPeng Liu for (size_type __n = __external_cap_to_internal(size()); __n != 0; ++__p, --__n) 10772e43a304SNikolas Klauser *__p = ~*__p; 10782e43a304SNikolas Klauser } 10792e43a304SNikolas Klauser 10802e43a304SNikolas Klauser template <class _Allocator> 10812e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 bool vector<bool, _Allocator>::__invariants() const { 10822e43a304SNikolas Klauser if (this->__begin_ == nullptr) { 10835a48162dSLouis Dionne if (this->__size_ != 0 || this->__cap_ != 0) 10842e43a304SNikolas Klauser return false; 10852e43a304SNikolas Klauser } else { 10865a48162dSLouis Dionne if (this->__cap_ == 0) 10872e43a304SNikolas Klauser return false; 10882e43a304SNikolas Klauser if (this->__size_ > this->capacity()) 10892e43a304SNikolas Klauser return false; 10902e43a304SNikolas Klauser } 10912e43a304SNikolas Klauser return true; 10922e43a304SNikolas Klauser } 10932e43a304SNikolas Klauser 10942e43a304SNikolas Klauser template <class _Allocator> 10952e43a304SNikolas Klauser _LIBCPP_CONSTEXPR_SINCE_CXX20 size_t vector<bool, _Allocator>::__hash_code() const _NOEXCEPT { 10962e43a304SNikolas Klauser size_t __h = 0; 10972e43a304SNikolas Klauser // do middle whole words 10982e43a304SNikolas Klauser size_type __n = __size_; 10992e43a304SNikolas Klauser __storage_pointer __p = __begin_; 11002e43a304SNikolas Klauser for (; __n >= __bits_per_word; ++__p, __n -= __bits_per_word) 11012e43a304SNikolas Klauser __h ^= *__p; 11022e43a304SNikolas Klauser // do last partial word 11032e43a304SNikolas Klauser if (__n > 0) { 11042e43a304SNikolas Klauser const __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n); 11052e43a304SNikolas Klauser __h ^= *__p & __m; 11062e43a304SNikolas Klauser } 11072e43a304SNikolas Klauser return __h; 11082e43a304SNikolas Klauser } 11092e43a304SNikolas Klauser 11102e43a304SNikolas Klauser template <class _Allocator> 11112e43a304SNikolas Klauser struct _LIBCPP_TEMPLATE_VIS hash<vector<bool, _Allocator> > 11122e43a304SNikolas Klauser : public __unary_function<vector<bool, _Allocator>, size_t> { 11132e43a304SNikolas Klauser _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 size_t 11142e43a304SNikolas Klauser operator()(const vector<bool, _Allocator>& __vec) const _NOEXCEPT { 11152e43a304SNikolas Klauser return __vec.__hash_code(); 11162e43a304SNikolas Klauser } 11172e43a304SNikolas Klauser }; 11182e43a304SNikolas Klauser 11192e43a304SNikolas Klauser _LIBCPP_END_NAMESPACE_STD 11202e43a304SNikolas Klauser 11212e43a304SNikolas Klauser _LIBCPP_POP_MACROS 11222e43a304SNikolas Klauser 11232e43a304SNikolas Klauser #endif // _LIBCPP___VECTOR_VECTOR_BOOL_H 1124