57#define _STL_BVECTOR_H 1
59#ifndef _GLIBCXX_ALWAYS_INLINE
60#define _GLIBCXX_ALWAYS_INLINE inline __attribute__((__always_inline__))
63#if __cplusplus >= 201103L
68namespace std _GLIBCXX_VISIBILITY(default)
70_GLIBCXX_BEGIN_NAMESPACE_VERSION
72 typedef unsigned long _Bit_type;
73 enum { _S_word_bit = int(__CHAR_BIT__ *
sizeof(_Bit_type)) };
75 __attribute__((__nonnull__))
78 __fill_bvector_n(_Bit_type*,
size_t,
bool) _GLIBCXX_NOEXCEPT;
80_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
85 template<
typename,
typename>
friend class vector;
86 friend struct _Bit_iterator;
87 friend struct _Bit_const_iterator;
90 _Bit_reference() _GLIBCXX_NOEXCEPT : _M_p(0), _M_mask(0) { }
96 _Bit_reference(_Bit_type * __x, _Bit_type __y)
97 : _M_p(__x), _M_mask(__y) { }
100#if __cplusplus >= 201103L
101 _Bit_reference(
const _Bit_reference&) =
default;
104 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
105 operator bool() const _GLIBCXX_NOEXCEPT
106 {
return !!(*_M_p & _M_mask); }
110 operator=(
bool __x) _GLIBCXX_NOEXCEPT
119#if __cplusplus > 202002L
120 constexpr const _Bit_reference&
121 operator=(
bool __x)
const noexcept
133 operator=(
const _Bit_reference& __x) _GLIBCXX_NOEXCEPT
134 {
return *
this = bool(__x); }
136 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
138 operator==(
const _Bit_reference& __x)
const
139 {
return bool(*
this) == bool(__x); }
141 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
143 operator<(
const _Bit_reference& __x)
const
144 {
return !bool(*
this) && bool(__x); }
148 flip() _GLIBCXX_NOEXCEPT
149 { *_M_p ^= _M_mask; }
151#if __cplusplus >= 201103L
154 swap(_Bit_reference __x, _Bit_reference __y)
noexcept
163 swap(_Bit_reference __x,
bool& __y)
noexcept
172 swap(
bool& __x, _Bit_reference __y)
noexcept
182#pragma GCC diagnostic push
183#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
184 struct _Bit_iterator_base
185 :
public std::iterator<std::random_access_iterator_tag, bool>
188 unsigned int _M_offset;
190 _GLIBCXX20_CONSTEXPR _GLIBCXX_ALWAYS_INLINE
192 _M_assume_normalized()
const
194#if __has_attribute(__assume__) && !defined(_GLIBCXX_CLANG)
195 unsigned int __ofst = _M_offset;
196 __attribute__ ((__assume__ (__ofst <
unsigned(_S_word_bit))));
201 _Bit_iterator_base(_Bit_type * __x,
unsigned int __y)
202 : _M_p(__x), _M_offset(__y) { }
208 _M_assume_normalized();
209 if (_M_offset++ ==
int(_S_word_bit) - 1)
220 _M_assume_normalized();
221 if (_M_offset-- == 0)
223 _M_offset = int(_S_word_bit) - 1;
230 _M_incr(ptrdiff_t __i)
232 _M_assume_normalized();
234 _M_p += __n / int(_S_word_bit);
235 __n = __n % int(_S_word_bit);
238 __n += int(_S_word_bit);
241 _M_offset =
static_cast<unsigned int>(__n);
245 friend _GLIBCXX20_CONSTEXPR
bool
246 operator==(
const _Bit_iterator_base& __x,
const _Bit_iterator_base& __y)
248 __x._M_assume_normalized();
249 __y._M_assume_normalized();
250 return __x._M_p == __y._M_p && __x._M_offset == __y._M_offset;
253#if __cpp_lib_three_way_comparison
255 friend constexpr strong_ordering
256 operator<=>(
const _Bit_iterator_base& __x,
const _Bit_iterator_base& __y)
259 __x._M_assume_normalized();
260 __y._M_assume_normalized();
261 if (
const auto __cmp = __x._M_p <=> __y._M_p; __cmp != 0)
263 return __x._M_offset <=> __y._M_offset;
268 operator<(
const _Bit_iterator_base& __x,
const _Bit_iterator_base& __y)
270 __x._M_assume_normalized();
271 __y._M_assume_normalized();
272 return __x._M_p < __y._M_p
273 || (__x._M_p == __y._M_p && __x._M_offset < __y._M_offset);
278 operator!=(
const _Bit_iterator_base& __x,
const _Bit_iterator_base& __y)
279 {
return !(__x == __y); }
283 operator>(
const _Bit_iterator_base& __x,
const _Bit_iterator_base& __y)
284 {
return __y < __x; }
288 operator<=(
const _Bit_iterator_base& __x,
const _Bit_iterator_base& __y)
289 {
return !(__y < __x); }
293 operator>=(
const _Bit_iterator_base& __x,
const _Bit_iterator_base& __y)
294 {
return !(__x < __y); }
297 friend _GLIBCXX20_CONSTEXPR ptrdiff_t
298 operator-(
const _Bit_iterator_base& __x,
const _Bit_iterator_base& __y)
300 __x._M_assume_normalized();
301 __y._M_assume_normalized();
302 return (
int(_S_word_bit) * (__x._M_p - __y._M_p)
303 + __x._M_offset - __y._M_offset);
306#pragma GCC diagnostic pop
308 struct _Bit_iterator :
public _Bit_iterator_base
310 typedef _Bit_reference reference;
311#if __cplusplus > 201703L
312 typedef void pointer;
314 typedef _Bit_reference* pointer;
316 typedef _Bit_iterator iterator;
319 _Bit_iterator() : _Bit_iterator_base(0, 0) { }
322 _Bit_iterator(_Bit_type * __x,
unsigned int __y)
323 : _Bit_iterator_base(__x, __y) { }
327 _M_const_cast()
const
330 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
334 _M_assume_normalized();
335 return reference(_M_p, 1UL << _M_offset);
350 iterator __tmp = *
this;
367 iterator __tmp = *
this;
388 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
391 {
return *(*
this + __i); }
394 friend _GLIBCXX20_CONSTEXPR iterator
397 iterator __tmp = __x;
403 friend _GLIBCXX20_CONSTEXPR iterator
405 {
return __x + __n; }
408 friend _GLIBCXX20_CONSTEXPR iterator
411 iterator __tmp = __x;
417 struct _Bit_const_iterator :
public _Bit_iterator_base
419 typedef bool reference;
420 typedef bool const_reference;
421#if __cplusplus > 201703L
422 typedef void pointer;
424 typedef const bool* pointer;
426 typedef _Bit_const_iterator const_iterator;
429 _Bit_const_iterator() : _Bit_iterator_base(0, 0) { }
432 _Bit_const_iterator(_Bit_type * __x,
unsigned int __y)
433 : _Bit_iterator_base(__x, __y) { }
436 _Bit_const_iterator(
const _Bit_iterator& __x)
437 : _Bit_iterator_base(__x._M_p, __x._M_offset) { }
441 _M_const_cast()
const
442 {
return _Bit_iterator(_M_p, _M_offset); }
444 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
448 _M_assume_normalized();
449 return _Bit_reference(_M_p, 1UL << _M_offset);
464 const_iterator __tmp = *
this;
481 const_iterator __tmp = *
this;
502 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
505 {
return *(*
this + __i); }
508 friend _GLIBCXX20_CONSTEXPR const_iterator
511 const_iterator __tmp = __x;
517 friend _GLIBCXX20_CONSTEXPR const_iterator
520 const_iterator __tmp = __x;
526 friend _GLIBCXX20_CONSTEXPR const_iterator
528 {
return __x + __n; }
531 template<
typename _Alloc>
535 rebind<_Bit_type>::other _Bit_alloc_type;
538 typedef typename _Bit_alloc_traits::pointer _Bit_pointer;
540 struct _Bvector_impl_data
542#if !_GLIBCXX_INLINE_VERSION
543 _Bit_iterator _M_start;
550 void operator=(_Bit_iterator __it) { _M_p = __it._M_p; }
553 _Bit_iterator _M_finish;
554 _Bit_pointer _M_end_of_storage;
557 _Bvector_impl_data() _GLIBCXX_NOEXCEPT
558 : _M_start(), _M_finish(), _M_end_of_storage()
561#if __cplusplus >= 201103L
562 _Bvector_impl_data(
const _Bvector_impl_data&) =
default;
565 operator=(
const _Bvector_impl_data&) =
default;
568 _Bvector_impl_data(_Bvector_impl_data&& __x) noexcept
569 : _Bvector_impl_data(__x)
574 _M_move_data(_Bvector_impl_data&& __x)
noexcept
583 _M_reset() _GLIBCXX_NOEXCEPT
584 { *
this = _Bvector_impl_data(); }
588 _M_swap_data(_Bvector_impl_data& __x) _GLIBCXX_NOEXCEPT
592 std::swap(*
this, __x);
597 :
public _Bit_alloc_type,
public _Bvector_impl_data
600 _Bvector_impl() _GLIBCXX_NOEXCEPT_IF(
601 is_nothrow_default_constructible<_Bit_alloc_type>::value)
602#if __cpp_concepts && __glibcxx_type_trait_variable_templates
603 requires is_default_constructible_v<_Bit_alloc_type>
609 _Bvector_impl(
const _Bit_alloc_type& __a) _GLIBCXX_NOEXCEPT
610 : _Bit_alloc_type(__a)
613#if __cplusplus >= 201103L
617 _Bvector_impl(_Bvector_impl&& __x) noexcept
622 _Bvector_impl(_Bit_alloc_type&& __a, _Bvector_impl&& __x) noexcept
629 _M_end_addr() const _GLIBCXX_NOEXCEPT
631 if (this->_M_end_of_storage)
638 typedef _Alloc allocator_type;
642 _M_get_Bit_allocator() _GLIBCXX_NOEXCEPT
643 {
return this->_M_impl; }
646 const _Bit_alloc_type&
647 _M_get_Bit_allocator() const _GLIBCXX_NOEXCEPT
648 {
return this->_M_impl; }
652 get_allocator() const _GLIBCXX_NOEXCEPT
653 {
return allocator_type(_M_get_Bit_allocator()); }
655#if __cplusplus >= 201103L
656 _Bvector_base() =
default;
662 _Bvector_base(
const allocator_type& __a)
663 : _M_impl(_Bit_alloc_type(__a)) { }
665#if __cplusplus >= 201103L
666 _Bvector_base(_Bvector_base&&) =
default;
669 _Bvector_base(_Bvector_base&& __x,
const allocator_type& __a) noexcept
670 : _M_impl(_Bit_alloc_type(__a),
std::move(__x._M_impl))
676 { this->_M_deallocate(); }
679 _Bvector_impl _M_impl;
683 _M_allocate(
size_t __n)
686#if __cpp_lib_is_constant_evaluated && __cpp_constexpr_dynamic_alloc
687 if (std::is_constant_evaluated())
690 for (
size_t __i = 0; __i < __n; ++__i)
701 if (_M_impl._M_start._M_p)
703 const size_t __n = _M_impl._M_end_addr() - _M_impl._M_start._M_p;
705 _M_impl._M_end_of_storage - __n,
711#if __cplusplus >= 201103L
714 _M_move_data(_Bvector_base&& __x)
noexcept
715 { _M_impl._M_move_data(
std::move(__x._M_impl)); }
721 {
return (__n +
int(_S_word_bit) - 1) / int(_S_word_bit); }
745 template<
typename _Alloc>
746 class vector<bool, _Alloc> :
protected _Bvector_base<_Alloc>
748 typedef _Bvector_base<_Alloc> _Base;
749 typedef typename _Base::_Bit_pointer _Bit_pointer;
752#if __cplusplus >= 201103L
757 typedef bool value_type;
758 typedef size_t size_type;
759 typedef ptrdiff_t difference_type;
760 typedef _Bit_reference reference;
761 typedef bool const_reference;
762 typedef _Bit_reference* pointer;
763 typedef const bool* const_pointer;
764 typedef _Bit_iterator iterator;
765 typedef _Bit_const_iterator const_iterator;
768 typedef _Alloc allocator_type;
773 {
return _Base::get_allocator(); }
776 using _Base::_M_allocate;
777 using _Base::_M_deallocate;
778 using _Base::_S_nword;
779 using _Base::_M_get_Bit_allocator;
782#if __cplusplus >= 201103L
790 vector(
const allocator_type& __a)
793#if __cplusplus >= 201103L
796 vector(size_type __n,
const allocator_type& __a = allocator_type())
801 vector(size_type __n,
const bool& __value,
802 const allocator_type& __a = allocator_type())
805 vector(size_type __n,
const bool& __value =
bool(),
806 const allocator_type& __a = allocator_type())
811 _M_initialize_value(__value);
816 : _Base(_Bit_alloc_traits::_S_select_on_copy(__x._M_get_Bit_allocator()))
818 const_iterator __xbegin = __x.
begin(), __xend = __x.
end();
819 _M_initialize(__x.
size());
820 _M_copy_aligned(__xbegin, __xend,
begin());
823#if __cplusplus >= 201103L
840 _M_initialize(__x.
size());
848 vector(
vector&& __x,
const __type_identity_t<allocator_type>& __a)
849 noexcept(_Bit_alloc_traits::_S_always_equal())
855 vector(
const vector& __x,
const __type_identity_t<allocator_type>& __a)
858 _M_initialize(__x.
size());
864 const allocator_type& __a = allocator_type())
867 _M_initialize_range(__l.begin(), __l.end(),
872#if __cplusplus >= 201103L
873 template<
typename _InputIterator,
874 typename = std::_RequireInputIter<_InputIterator>>
876 vector(_InputIterator __first, _InputIterator __last,
877 const allocator_type& __a = allocator_type())
880 _M_initialize_range(__first, __last,
884 template<
typename _InputIterator>
885 vector(_InputIterator __first, _InputIterator __last,
886 const allocator_type& __a = allocator_type())
890 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
891 _M_initialize_dispatch(__first, __last, _Integral());
896 ~vector() _GLIBCXX_NOEXCEPT { }
904#if __cplusplus >= 201103L
905 if (_Bit_alloc_traits::_S_propagate_on_copy_assign())
907 if (this->_M_get_Bit_allocator() != __x._M_get_Bit_allocator())
909 this->_M_deallocate();
910 std::__alloc_on_copy(_M_get_Bit_allocator(),
911 __x._M_get_Bit_allocator());
912 _M_initialize(__x.
size());
915 std::__alloc_on_copy(_M_get_Bit_allocator(),
916 __x._M_get_Bit_allocator());
921 this->_M_deallocate();
922 _M_initialize(__x.
size());
924 this->_M_impl._M_finish = _M_copy_aligned(__x.
begin(), __x.
end(),
929#if __cplusplus >= 201103L
934 if (_Bit_alloc_traits::_S_propagate_on_move_assign()
935 || this->_M_get_Bit_allocator() == __x._M_get_Bit_allocator())
937 this->_M_deallocate();
939 std::__alloc_on_move(_M_get_Bit_allocator(),
940 __x._M_get_Bit_allocator());
946 this->_M_deallocate();
947 _M_initialize(__x.
size());
949 this->_M_impl._M_finish = _M_copy_aligned(__x.
begin(), __x.
end(),
960 this->
assign(__l.begin(), __l.end());
971 assign(size_type __n,
const bool& __x)
972 { _M_fill_assign(__n, __x); }
974#if __cplusplus >= 201103L
975 template<
typename _InputIterator,
976 typename = std::_RequireInputIter<_InputIterator>>
979 assign(_InputIterator __first, _InputIterator __last)
982 template<
typename _InputIterator>
984 assign(_InputIterator __first, _InputIterator __last)
987 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
988 _M_assign_dispatch(__first, __last, _Integral());
992#if __cplusplus >= 201103L
999 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1001 begin() _GLIBCXX_NOEXCEPT
1002 {
return iterator(this->_M_impl._M_start._M_p, 0); }
1004 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1006 begin()
const _GLIBCXX_NOEXCEPT
1007 {
return const_iterator(this->_M_impl._M_start._M_p, 0); }
1009 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1011 end() _GLIBCXX_NOEXCEPT
1012 {
return this->_M_impl._M_finish; }
1014 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1016 end()
const _GLIBCXX_NOEXCEPT
1017 {
return this->_M_impl._M_finish; }
1019 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1021 rbegin() _GLIBCXX_NOEXCEPT
1024 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1026 rbegin()
const _GLIBCXX_NOEXCEPT
1029 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1031 rend() _GLIBCXX_NOEXCEPT
1034 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1036 rend()
const _GLIBCXX_NOEXCEPT
1039#if __cplusplus >= 201103L
1040 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1043 {
return const_iterator(this->_M_impl._M_start._M_p, 0); }
1045 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1047 cend()
const noexcept
1048 {
return this->_M_impl._M_finish; }
1050 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1055 [[__nodiscard__]] _GLIBCXX20_CONSTEXPR
1057 crend()
const noexcept
1061 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1063 size()
const _GLIBCXX_NOEXCEPT
1064 {
return size_type(
end() -
begin()); }
1066 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1070 const size_type __isize =
1071 __gnu_cxx::__numeric_traits<difference_type>::__max
1072 - int(_S_word_bit) + 1;
1073 const size_type __asize
1074 = _Bit_alloc_traits::max_size(_M_get_Bit_allocator());
1075 return (__asize <= __isize /
int(_S_word_bit)
1076 ? __asize *
int(_S_word_bit) : __isize);
1079 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1082 {
return size_type(const_iterator(this->_M_impl._M_end_addr(), 0)
1085 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1087 empty()
const _GLIBCXX_NOEXCEPT
1090 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1094 __glibcxx_requires_subscript(__n);
1095 return begin()[__n];
1098 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1102 __glibcxx_requires_subscript(__n);
1103 return begin()[__n];
1107 _GLIBCXX20_CONSTEXPR
1111 if (__n >= this->
size())
1112 __throw_out_of_range_fmt(__N(
"vector<bool>::_M_range_check: __n "
1113 "(which is %zu) >= this->size() "
1119 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1124 return (*
this)[__n];
1127 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1129 at(size_type __n)
const
1132 return (*
this)[__n];
1135 _GLIBCXX20_CONSTEXPR
1140 __throw_length_error(__N(
"vector::reserve"));
1145 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1149 __glibcxx_requires_nonempty();
1153 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1157 __glibcxx_requires_nonempty();
1161 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1165 __glibcxx_requires_nonempty();
1166 return *(
end() - 1);
1169 _GLIBCXX_NODISCARD _GLIBCXX20_CONSTEXPR
1173 __glibcxx_requires_nonempty();
1174 return *(
end() - 1);
1177 _GLIBCXX20_CONSTEXPR
1181 if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_addr())
1182 *this->_M_impl._M_finish++ = __x;
1184 _M_insert_aux(
end(), __x);
1187 _GLIBCXX20_CONSTEXPR
1189 swap(
vector& __x) _GLIBCXX_NOEXCEPT
1191#if __cplusplus >= 201103L
1192 __glibcxx_assert(_Bit_alloc_traits::propagate_on_container_swap::value
1193 || _M_get_Bit_allocator() == __x._M_get_Bit_allocator());
1195 this->_M_impl._M_swap_data(__x._M_impl);
1196 _Bit_alloc_traits::_S_on_swap(_M_get_Bit_allocator(),
1197 __x._M_get_Bit_allocator());
1201 _GLIBCXX20_CONSTEXPR
1203 swap(reference __x, reference __y) _GLIBCXX_NOEXCEPT
1210 _GLIBCXX20_CONSTEXPR
1212#if __cplusplus >= 201103L
1213 insert(const_iterator __position,
const bool& __x)
1215 insert(iterator __position,
const bool& __x)
1218 const difference_type __n = __position -
begin();
1219 if (this->_M_impl._M_finish._M_p != this->_M_impl._M_end_addr()
1220 && __position ==
end())
1221 *this->_M_impl._M_finish++ = __x;
1223 _M_insert_aux(__position._M_const_cast(), __x);
1224 return begin() + __n;
1227#if _GLIBCXX_USE_DEPRECATED
1228 _GLIBCXX_DEPRECATED_SUGGEST(
"insert(position, false)")
1230 insert(const_iterator __position)
1231 {
return this->
insert(__position._M_const_cast(),
false); }
1234#if __cplusplus >= 201103L
1235 template<
typename _InputIterator,
1236 typename = std::_RequireInputIter<_InputIterator>>
1237 _GLIBCXX20_CONSTEXPR
1239 insert(const_iterator __position,
1240 _InputIterator __first, _InputIterator __last)
1242 difference_type __offset = __position -
cbegin();
1243 _M_insert_range(__position._M_const_cast(),
1246 return begin() + __offset;
1249 template<
typename _InputIterator>
1251 insert(iterator __position,
1252 _InputIterator __first, _InputIterator __last)
1255 typedef typename std::__is_integer<_InputIterator>::__type _Integral;
1256 _M_insert_dispatch(__position, __first, __last, _Integral());
1260#if __cplusplus >= 201103L
1261 _GLIBCXX20_CONSTEXPR
1263 insert(const_iterator __position, size_type __n,
const bool& __x)
1265 difference_type __offset = __position -
cbegin();
1266 _M_fill_insert(__position._M_const_cast(), __n, __x);
1267 return begin() + __offset;
1271 insert(iterator __position, size_type __n,
const bool& __x)
1272 { _M_fill_insert(__position, __n, __x); }
1275#if __cplusplus >= 201103L
1276 _GLIBCXX20_CONSTEXPR
1279 {
return this->
insert(__p, __l.begin(), __l.end()); }
1282 _GLIBCXX20_CONSTEXPR
1285 { --this->_M_impl._M_finish; }
1287 _GLIBCXX20_CONSTEXPR
1289#if __cplusplus >= 201103L
1290 erase(const_iterator __position)
1292 erase(iterator __position)
1294 {
return _M_erase(__position._M_const_cast()); }
1296 _GLIBCXX20_CONSTEXPR
1298#if __cplusplus >= 201103L
1299 erase(const_iterator __first, const_iterator __last)
1301 erase(iterator __first, iterator __last)
1303 {
return _M_erase(__first._M_const_cast(), __last._M_const_cast()); }
1305 _GLIBCXX20_CONSTEXPR
1307 resize(size_type __new_size,
bool __x =
bool())
1309 if (__new_size <
size())
1310 _M_erase_at_end(
begin() + difference_type(__new_size));
1315#if __cplusplus >= 201103L
1316 _GLIBCXX20_CONSTEXPR
1319 { _M_shrink_to_fit(); }
1322 _GLIBCXX20_CONSTEXPR
1324 flip() _GLIBCXX_NOEXCEPT
1326 _Bit_type *
const __end = this->_M_impl._M_end_addr();
1327 for (_Bit_type * __p = this->_M_impl._M_start._M_p; __p != __end; ++__p)
1331 _GLIBCXX20_CONSTEXPR
1333 clear() _GLIBCXX_NOEXCEPT
1334 { _M_erase_at_end(
begin()); }
1336#if __cplusplus >= 201103L
1337 template<
typename... _Args>
1338#if __cplusplus > 201402L
1339 _GLIBCXX20_CONSTEXPR
1344 emplace_back(_Args&&... __args)
1347#if __cplusplus > 201402L
1352 template<
typename... _Args>
1353 _GLIBCXX20_CONSTEXPR
1355 emplace(const_iterator __pos, _Args&&... __args)
1356 {
return insert(__pos,
bool(__args...)); }
1361 _GLIBCXX20_CONSTEXPR
1363 _M_copy_aligned(const_iterator __first, const_iterator __last,
1366 _Bit_type* __q = std::copy(__first._M_p, __last._M_p, __result._M_p);
1367 return std::copy(const_iterator(__last._M_p, 0), __last,
1371 _GLIBCXX20_CONSTEXPR
1373 _M_initialize(size_type __n)
1377 _Bit_pointer __q = this->_M_allocate(__n);
1378 this->_M_impl._M_end_of_storage = __q + _S_nword(__n);
1380 this->_M_impl._M_start = __start;
1381 this->_M_impl._M_finish = __start + difference_type(__n);
1385 _GLIBCXX20_CONSTEXPR
1387 _M_initialize_value(
bool __x) _GLIBCXX_NOEXCEPT
1389 if (_Bit_type* __p = this->_M_impl._M_start._M_p)
1390 __fill_bvector_n(__p, this->_M_impl._M_end_addr() - __p, __x);
1393 _GLIBCXX20_CONSTEXPR
1395 _M_reallocate(size_type __n);
1397#if __cplusplus >= 201103L
1398 _GLIBCXX20_CONSTEXPR
1403#if __cplusplus < 201103L
1406 template<
typename _Integer>
1408 _M_initialize_dispatch(_Integer __n, _Integer __x, __true_type)
1410 _M_initialize(
static_cast<size_type
>(__n));
1411 _M_initialize_value(__x);
1414 template<
typename _InputIterator>
1416 _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
1418 { _M_initialize_range(__first, __last,
1422 template<
typename _InputIterator>
1423 _GLIBCXX20_CONSTEXPR
1425 _M_initialize_range(_InputIterator __first, _InputIterator __last,
1428 for (; __first != __last; ++__first)
1432 template<
typename _ForwardIterator>
1433 _GLIBCXX20_CONSTEXPR
1435 _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,
1440 std::copy(__first, __last,
begin());
1443#if __cplusplus < 201103L
1446 template<
typename _Integer>
1448 _M_assign_dispatch(_Integer __n, _Integer __val, __true_type)
1449 { _M_fill_assign(__n, __val); }
1451 template<
class _InputIterator>
1453 _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
1458 _GLIBCXX20_CONSTEXPR
1460 _M_fill_assign(
size_t __n,
bool __x)
1464 _M_initialize_value(__x);
1469 _M_erase_at_end(
begin() + __n);
1470 _M_initialize_value(__x);
1474 template<
typename _InputIterator>
1475 _GLIBCXX20_CONSTEXPR
1477 _M_assign_aux(_InputIterator __first, _InputIterator __last,
1480 iterator __cur =
begin();
1481 for (; __first != __last && __cur !=
end(); ++__cur, (void)++__first)
1483 if (__first == __last)
1484 _M_erase_at_end(__cur);
1489 template<
typename _ForwardIterator>
1490 _GLIBCXX20_CONSTEXPR
1492 _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
1497 _M_erase_at_end(std::copy(__first, __last,
begin()));
1500 _ForwardIterator __mid = __first;
1502 std::copy(__first, __mid,
begin());
1507#if __cplusplus < 201103L
1510 template<
typename _Integer>
1512 _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
1514 { _M_fill_insert(__pos, __n, __x); }
1516 template<
typename _InputIterator>
1518 _M_insert_dispatch(iterator __pos,
1519 _InputIterator __first, _InputIterator __last,
1521 { _M_insert_range(__pos, __first, __last,
1525 _GLIBCXX20_CONSTEXPR
1527 _M_fill_insert(iterator __position, size_type __n,
bool __x);
1529 template<
typename _InputIterator>
1530 _GLIBCXX20_CONSTEXPR
1532 _M_insert_range(iterator __pos, _InputIterator __first,
1535 for (; __first != __last; ++__first)
1537 __pos =
insert(__pos, *__first);
1542 template<
typename _ForwardIterator>
1543 _GLIBCXX20_CONSTEXPR
1545 _M_insert_range(iterator __position, _ForwardIterator __first,
1548 _GLIBCXX20_CONSTEXPR
1550 _M_insert_aux(iterator __position,
bool __x);
1552 _GLIBCXX20_CONSTEXPR
1554 _M_check_len(size_type __n,
const char* __s)
const
1557 __throw_length_error(__N(__s));
1563 _GLIBCXX20_CONSTEXPR
1565 _M_erase_at_end(iterator __pos)
1566 { this->_M_impl._M_finish = __pos; }
1568 _GLIBCXX20_CONSTEXPR
1570 _M_erase(iterator __pos);
1572 _GLIBCXX20_CONSTEXPR
1574 _M_erase(iterator __first, iterator __last);
1582#if __cplusplus >= 201103L
1583 void data() =
delete;
1589_GLIBCXX_END_NAMESPACE_CONTAINER
1592 _GLIBCXX20_CONSTEXPR
1594 __fill_bvector(_Bit_type* __v,
unsigned int __first,
unsigned int __last,
1595 bool __x) _GLIBCXX_NOEXCEPT
1597 const _Bit_type __fmask = ~0ul << __first;
1598 const _Bit_type __lmask = ~0ul >> (_S_word_bit - __last);
1599 const _Bit_type __mask = __fmask & __lmask;
1608 __attribute__((__nonnull__))
1609 _GLIBCXX20_CONSTEXPR
1611 __fill_bvector_n(_Bit_type* __p,
size_t __n,
bool __x) _GLIBCXX_NOEXCEPT
1613#if __cpp_lib_is_constant_evaluated
1614 if (std::is_constant_evaluated())
1616 for (
size_t __i = 0; __i < __n; ++__i)
1617 __p[__i] = __x ? ~0ul : 0ul;
1621 __builtin_memset(__p, __x ? ~0 : 0, __n * sizeof(_Bit_type));
1625 _GLIBCXX20_CONSTEXPR
1627 __fill_a1(_GLIBCXX_STD_C::_Bit_iterator __first,
1628 _GLIBCXX_STD_C::_Bit_iterator __last,
const bool& __x)
1630 if (__first._M_p != __last._M_p)
1632 _Bit_type* __first_p = __first._M_p;
1633 if (__first._M_offset != 0)
1634 __fill_bvector(__first_p++, __first._M_offset, _S_word_bit, __x);
1636 __fill_bvector_n(__first_p, __last._M_p - __first_p, __x);
1638 if (__last._M_offset != 0)
1639 __fill_bvector(__last._M_p, 0, __last._M_offset, __x);
1641 else if (__first._M_offset != __last._M_offset)
1642 __fill_bvector(__first._M_p, __first._M_offset, __last._M_offset, __x);
1645#if __cplusplus >= 201103L
1648 template<
typename _Alloc>
1650 :
public __hash_base<size_t, _GLIBCXX_STD_C::vector<bool, _Alloc>>
1653 operator()(
const _GLIBCXX_STD_C::vector<bool, _Alloc>&)
const noexcept;
1657_GLIBCXX_END_NAMESPACE_VERSION
constexpr bool operator<=(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr bool operator>=(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr bool operator<(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr bool operator>(const duration< _Rep1, _Period1 > &__lhs, const duration< _Rep2, _Period2 > &__rhs)
constexpr complex< _Tp > operator*(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x times y.
constexpr complex< _Tp > operator-(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x minus y.
constexpr complex< _Tp > operator+(const complex< _Tp > &__x, const complex< _Tp > &__y)
Return new complex value x plus y.
constexpr _Tp * to_address(_Tp *__ptr) noexcept
Obtain address referenced by a pointer to an object.
__bool_constant< true > true_type
The type used as a compile-time boolean with true value.
__bool_constant< false > false_type
The type used as a compile-time boolean with false value.
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
constexpr const _Tp & max(const _Tp &, const _Tp &)
This does what you think it does.
constexpr iterator_traits< _Iter >::iterator_category __iterator_category(const _Iter &)
ISO C++ entities toplevel namespace is std.
constexpr iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
constexpr void advance(_InputIterator &__i, _Distance __n)
A generalization of pointer arithmetic.
Primary class template hash.
typename __detected_or_t< is_empty< _Alloc >, __equal, _Alloc >::type is_always_equal
Whether all instances of the allocator type compare equal.
Forward iterators support a superset of input iterator operations.
Random-access iterators support a superset of bidirectional iterator operations.
ptrdiff_t difference_type
Distance between iterators is represented as this type.
A standard container which offers fixed time access to individual elements in any order.
constexpr iterator insert(const_iterator __position, const value_type &__x)
Inserts given value into vector before specified iterator.
constexpr void push_back(const value_type &__x)
Add data to the end of the vector.
constexpr reverse_iterator rbegin() noexcept
constexpr iterator end() noexcept
vector()=default
Creates a vector with no elements.
constexpr iterator emplace(const_iterator __position, _Args &&... __args)
Inserts an object in vector before specified iterator.
constexpr iterator begin() noexcept
constexpr size_type capacity() const noexcept
constexpr ~vector() noexcept
constexpr void assign(size_type __n, const value_type &__val)
Assigns a given value to a vector.
constexpr _Tp * data() noexcept
constexpr vector & operator=(const vector &__x)
Vector assignment operator.
constexpr void pop_back() noexcept
Removes last element.
constexpr void reserve(size_type __n)
Attempt to preallocate enough memory for specified number of elements.
constexpr reference at(size_type __n)
Provides access to the data contained in the vector.
constexpr void resize(size_type __new_size)
Resizes the vector to the specified number of elements.
constexpr void _M_range_check(size_type __n) const
Safety check used only from at().
constexpr reference front() noexcept
constexpr iterator erase(const_iterator __position)
Remove element at given position.
constexpr bool empty() const noexcept
constexpr reverse_iterator rend() noexcept
constexpr const_reverse_iterator crbegin() const noexcept
constexpr const_iterator cbegin() const noexcept
constexpr void clear() noexcept
constexpr allocator_type get_allocator() const noexcept
Get a copy of the memory allocation object.
constexpr size_type size() const noexcept
constexpr reference back() noexcept
constexpr const_reverse_iterator crend() const noexcept
constexpr const_iterator cend() const noexcept
constexpr reference operator[](size_type __n) noexcept
Subscript access to the data contained in the vector.
constexpr void shrink_to_fit()
constexpr size_type max_size() const noexcept
Uniform interface to C++98 and C++11 allocators.
static constexpr pointer allocate(_Alloc &__a, size_type __n)
Allocate memory.
static constexpr void deallocate(_Alloc &__a, pointer __p, size_type __n)
Deallocate memory.