xref: /llvm-project/libcxx/include/__vector/vector_bool.h (revision 67752f61917994e4daa6f5d30e39e237c26a73de)
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