30#ifndef _GLIBCXX_INPLACE_VECTOR
31#define _GLIBCXX_INPLACE_VECTOR 1
33#pragma GCC system_header
35#define __glibcxx_want_inplace_vector
38#ifdef __glibcxx_inplace_vector
49namespace std _GLIBCXX_VISIBILITY(default)
51_GLIBCXX_BEGIN_NAMESPACE_VERSION
52_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
55 template<
typename _Tp,
size_t _Nm>
61 using value_type = _Tp;
63 using const_pointer =
const _Tp*;
64 using reference = value_type&;
65 using const_reference =
const value_type&;
66 using size_type = size_t;
67 using difference_type = ptrdiff_t;
69 = __gnu_cxx::__normal_iterator<_Tp*, inplace_vector>;
71 = __gnu_cxx::__normal_iterator<const _Tp*, inplace_vector>;
72 using reverse_iterator = std::reverse_iterator<iterator>;
73 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
77 inplace_vector() noexcept
81 inplace_vector(size_type __n)
90 inplace_vector(size_type __n,
const _Tp& __value)
98 template<__any_input_iterator _InputIterator>
100 inplace_vector(_InputIterator __first, _InputIterator __last)
103 if (
const auto __n = _S_distance(__first, __last))
111 while (__first != __last)
112 emplace_back(*__first++);
116 template <__detail::__container_compatible_range<_Tp> _Rg>
118 inplace_vector(from_range_t, _Rg&& __rg)
120 { append_range(__rg); }
123 inplace_vector(initializer_list<_Tp> __il)
126 _S_reserve(__il.size());
128 _M_size = __il.size();
131 inplace_vector(
const inplace_vector&)
132 requires is_trivially_copy_constructible_v<_Tp>
136 inplace_vector(
const inplace_vector& __other)
137 noexcept(is_nothrow_copy_constructible_v<_Tp>)
141 _M_size = __other.size();
144 inplace_vector(inplace_vector&&)
145 requires is_trivially_move_constructible_v<_Tp>
149 inplace_vector(inplace_vector&& __other)
150 noexcept(is_nothrow_move_constructible_v<_Tp>)
154 _M_size = __other.size();
158 requires is_trivially_destructible_v<_Tp>
166 operator=(
const inplace_vector&)
167 requires is_trivially_copy_assignable_v<_Tp>
168 && is_trivially_copy_constructible_v<_Tp>
169 && is_trivially_destructible_v<_Tp>
172 constexpr inplace_vector&
173 operator=(
const inplace_vector& __other)
174 noexcept(is_nothrow_copy_assignable_v<_Tp>
175 && is_nothrow_copy_constructible_v<_Tp>)
178 assign(__other.begin(), __other.end());
183 operator=(inplace_vector&&)
184 requires is_trivially_move_assignable_v<_Tp>
185 && is_trivially_move_constructible_v<_Tp>
186 && is_trivially_destructible_v<_Tp>
189 constexpr inplace_vector&
190 operator=(inplace_vector&& __other)
191 noexcept(is_nothrow_move_assignable_v<_Tp>
192 && is_nothrow_move_constructible_v<_Tp>)
195 assign(std::make_move_iterator(__other.begin()),
196 std::make_move_iterator(__other.end()));
200 constexpr inplace_vector&
201 operator=(initializer_list<_Tp> __il)
203 assign(__il.begin(), __il.end());
207 template<__any_input_iterator _InputIterator>
209 assign(_InputIterator __first, _InputIterator __last)
211 if (
const auto __n = _S_distance(__first, __last))
216 for (
size_t __i = 0; __i < _M_size; ++__i, (void)++__first)
217 _M_elems[__i] = *__first;
221 std::destroy(std::copy(__first, __last, begin()), end());
227 for (;__first != __last && __i < _M_size; ++__first)
228 _M_elems[__i++] = *__first;
229 if (__first == __last)
236 while (__first != __last)
237 emplace_back(*__first++);
242 template<__detail::__container_compatible_range<_Tp> _Rg>
244 assign_range(_Rg&& __rg)
246 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
248 const auto __sz = ranges::distance(__rg);
253 ranges::copy_n(ranges::begin(__rg), __sz, data());
254 std::destroy(data() + __sz, data() + _M_size);
258 auto [__in, __out] = ranges::copy_n(
259 ranges::begin(__rg), _M_size,
261 ranges::uninitialized_copy(
263 __out, unreachable_sentinel);
269 auto __in = ranges::begin(__rg);
270 auto __end = ranges::end(__rg);
272 for (; __n < _M_size && __in != __end; ++__in)
273 _M_elems[__n++] = *__in;
277 std::destroy(data() + __n, data() + _M_size);
283 auto __res = ranges::uninitialized_copy(
285 data() + __n, data() + _Nm);
286 _M_size = __res.out - data();
287 if (__res.in == ranges::end(__rg))
295 assign(size_type __n,
const _Tp& __u)
302 std::destroy_n(std::fill_n(data(), __n, __u), _M_size - __n);
307 assign(initializer_list<_Tp> __il)
308 { assign(__il.begin(), __il.end()); }
313 begin() noexcept {
return iterator(data()); }
316 constexpr const_iterator
317 begin() const noexcept {
return const_iterator(data()); }
322 {
return iterator(data() + _M_size); }
325 constexpr const_iterator
327 {
return const_iterator(data() + _M_size); }
330 constexpr reverse_iterator
332 {
return reverse_iterator(end()); }
335 constexpr const_reverse_iterator
336 rbegin() const noexcept
337 {
return const_reverse_iterator(end()); }
340 constexpr reverse_iterator
341 rend() noexcept {
return reverse_iterator(begin()); }
344 constexpr const_reverse_iterator
345 rend() const noexcept {
return const_reverse_iterator(begin()); }
348 constexpr const_iterator
349 cbegin() const noexcept {
return begin(); }
352 constexpr const_iterator
353 cend() const noexcept {
return end(); }
356 constexpr const_reverse_iterator
357 crbegin() const noexcept {
return rbegin(); }
360 constexpr const_reverse_iterator
361 crend() const noexcept {
return rend(); }
366 empty() const noexcept {
return _M_size == 0; }
370 size() const noexcept
373 __builtin_unreachable();
378 static constexpr size_type
379 max_size() noexcept {
return _Nm; }
382 static constexpr size_type
383 capacity() noexcept {
return _Nm; }
386 resize(size_type __n)
391 else if (__n < _M_size)
392 std::destroy_n(data() + __n, _M_size - __n);
397 resize(size_type __n,
const _Tp& __c)
402 else if (__n < _M_size)
403 std::destroy_n(data() + __n, _M_size - __n);
407 static constexpr void
408 reserve(size_type __n)
411 static constexpr void
417 operator[](size_type __n)
419 __glibcxx_requires_subscript(__n);
420 return _M_elems[__n];
424 constexpr const_reference
425 operator[](size_type __n)
const
427 __glibcxx_requires_subscript(__n);
428 return _M_elems[__n];
432 constexpr const_reference
433 at(size_type __n)
const
436 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
438 ">= size() (which is %zu)"),
440 return _M_elems[__n];
448 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
450 ">= size() (which is %zu)"),
452 return _M_elems[__n];
459 __glibcxx_requires_nonempty();
464 constexpr const_reference
467 __glibcxx_requires_nonempty();
475 __glibcxx_requires_nonempty();
476 return _M_elems[_M_size - 1];
480 constexpr const_reference
483 __glibcxx_requires_nonempty();
484 return _M_elems[_M_size - 1];
492 {
return static_cast<pointer
>(_M_elems); }
496 data() const noexcept
497 {
return static_cast<const_pointer
>(_M_elems); }
500 template<
typename... _Args>
502 emplace_back(_Args&&... __args)
510 push_back(
const _Tp& __x)
511 {
return emplace_back(__x); }
517 template<__detail::__container_compatible_range<_Tp> _Rg>
519 append_range(_Rg&& __rg)
521 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
523 const auto __sz = ranges::distance(__rg);
524 if (__sz > (_Nm - size()))
527 ranges::uninitialized_copy(
528 ranges::begin(__rg), unreachable_sentinel,
529 data() + _M_size, data() + _M_size + __sz);
530 _M_size += size_type(__sz);
534 ranges::subrange<pointer> __tail(data() + _M_size, data() + _Nm);
535 auto [__in, __out] = ranges::uninitialized_copy(__rg, __tail);
536 _M_size = __out - data();
537 if (__in != ranges::end(__rg))
545 __glibcxx_requires_nonempty();
547 _M_elems[_M_size].~_Tp();
550 template<
typename... _Args>
552 try_emplace_back(_Args&&... __args)
554 if (_M_size >= _Nm) [[unlikely]]
557 return __builtin_addressof(__r);
561 try_push_back(
const _Tp& __x)
563 if (_M_size >= _Nm) [[unlikely]]
565 return __builtin_addressof(unchecked_emplace_back(__x));
569 try_push_back(_Tp&& __x)
571 if (_M_size >= _Nm) [[unlikely]]
573 return __builtin_addressof(unchecked_emplace_back(
std::move(__x)));
576 template<__detail::__container_compatible_range<_Tp> _Rg>
577 constexpr ranges::borrowed_iterator_t<_Rg>
578 try_append_range(_Rg&& __rg)
580 if constexpr (ranges::sized_range<_Rg>)
582 auto __n = ranges::distance(__rg);
583 if (__n == 0) [[unlikely]]
584 return ranges::begin(__rg);
586 const auto __end = data() + _M_size;
587 const size_t __avail = _Nm - size();
589 _M_size += size_type(__n);
595 return ranges::uninitialized_copy_n(
596 ranges::begin(__rg), __n,
597 __end, unreachable_sentinel).in;
601 ranges::subrange<pointer> __tail(data() + _M_size, data() + _Nm);
602 auto [__in, __out] = ranges::uninitialized_copy(__rg, __tail);
603 _M_size = __out - data();
608 template<
typename... _Args>
610 unchecked_emplace_back(_Args&&... __args)
612 __glibcxx_assert(_M_size < _Nm);
613 auto __p = std::construct_at(data() + _M_size,
620 unchecked_push_back(
const _Tp& __x)
621 {
return unchecked_emplace_back(__x); }
624 unchecked_push_back(_Tp&& __x)
625 {
return unchecked_emplace_back(
std::move(__x)); }
627 template<
typename... _Args>
629 emplace(const_iterator __position, _Args&&... __args)
631 size_t __b = __position - cbegin();
632 __glibcxx_assert(__b <= _M_size);
635 iterator __pos = begin() + __b;
638 std::rotate(__pos, end() - 1, end());
643 insert(const_iterator __position,
const _Tp& __x)
644 {
return emplace(__position, __x); }
647 insert(const_iterator __position, _Tp&& __x)
648 {
return emplace(__position,
std::move(__x)); }
651 insert(const_iterator __position, size_type __n,
const _Tp& __x)
653 size_t __b = __position - cbegin();
654 __glibcxx_assert(__b <= _M_size);
655 if ((_Nm - _M_size) < __n)
657 iterator __pos = begin() + __b;
659 if (std::__exchange(_M_size, _M_size + __n))
660 std::rotate(__pos, end() - __n, end());
664 template<__any_input_iterator _InputIterator>
666 insert(const_iterator __position, _InputIterator __first,
667 _InputIterator __last)
669 size_t __b = __position - cbegin();
670 __glibcxx_assert(__b <= _M_size);
671 iterator __pos = begin() + __b;
672 const size_t __s = _M_size;
673 if (
const auto __n = _S_distance(__first, __last))
675 if ((_Nm - _M_size) < __n)
682 while (__first != __last)
683 emplace_back(*__first++);
686 std::rotate(__pos, begin() + __s, end());
690 template<__detail::__container_compatible_range<_Tp> _Rg>
692 insert_range(const_iterator __position, _Rg&& __rg)
694 iterator __pos = begin() + (__position - cbegin());
695 const auto __end = end();
696 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
698 const auto __len = ranges::distance(__rg);
699 if (__len > (_Nm - size()))
701 if (!__len) [[unlikely]]
704 const size_type __n = size_type(__len);
705 const size_type __num_after = __end - __pos;
706 if (__num_after >= __n)
708 ranges::uninitialized_move(__end - __n, __end,
709 __end, unreachable_sentinel);
711 ranges::move_backward(__pos, __end - __n, __end);
712 ranges::copy(__rg, __pos);
714 else if constexpr (ranges::forward_range<_Rg>)
716 auto __mid = ranges::next(ranges::begin(__rg), __num_after);
717 ranges::uninitialized_copy(__mid, ranges::end(__rg),
718 __end, unreachable_sentinel);
719 _M_size += __n - __num_after;
720 ranges::uninitialized_move(__pos, __end,
721 __pos + __n, unreachable_sentinel);
722 _M_size += __num_after;
723 ranges::copy(ranges::begin(__rg), __mid, __pos);
727 ranges::uninitialized_copy(
728 ranges::begin(__rg), ranges::end(__rg),
729 __end, unreachable_sentinel);
731 std::rotate(__pos, __end, end());
737 std::rotate(__pos, __end, end());
743 insert(const_iterator __position, initializer_list<_Tp> __il)
744 {
return insert(__position, __il.begin(), __il.end()); }
747 erase(const_iterator __position)
749 size_t __n = __position - cbegin();
750 __glibcxx_assert(__n < _M_size);
751 iterator __pos = begin() + __n;
758 erase(const_iterator __first, const_iterator __last)
760 size_t __n = __first - cbegin();
761 size_t __x = __last - __first;
762 __glibcxx_assert(__n <= _M_size);
763 __glibcxx_assert(__x <= _M_size);
764 iterator __pos = begin() + __n;
765 iterator __end =
std::move(__pos + __x, end(), __pos);
766 std::destroy_n(__end, __x);
772 swap(inplace_vector& __x)
773 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
776 const auto __smaller = __vs[__x.size() < size()];
777 const auto __bigger = __vs[__x.size() >= size()];
778 size_type __n = __smaller->size();
779 size_type __n2 = __bigger->size();
781 if constexpr (is_nothrow_move_constructible_v<_Tp>)
783 for (size_type __i = __n; __i < __n2; ++__i)
785 std::construct_at(__smaller->data() + __i,
787 std::destroy_at(__bigger->data() + __i);
793 __bigger->data() + __n2,
794 __smaller->data() + __n);
795 std::destroy(__bigger->data() + __n, __bigger->data() + __n2);
797 __smaller->_M_size = __n2;
798 __bigger->_M_size = __n;
801 for (size_type __i = 0; __i < __n; __i++)
802 swap(_M_elems[__i], __x._M_elems[__i]);
808 std::destroy_n(data(),
size_t(_M_size));
812 constexpr friend bool
813 operator==(
const inplace_vector& __x,
const inplace_vector& __y)
814 {
return std::equal(__x.begin(), __x.end(), __y.begin(), __y.end()); }
816 constexpr friend auto
817 operator<=>(
const inplace_vector& __x,
const inplace_vector& __y)
818 requires requires (
const _Tp __t) {
819 { __t < __t } -> __detail::__boolean_testable;
823 __y.begin(), __y.end(),
824 __detail::__synth3way);
828 constexpr friend void
829 swap(inplace_vector& __x, inplace_vector& __y)
830 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
840 template<
typename _UInt,
bool = (alignof(_Tp) <= sizeof(_UInt))>
841 static constexpr
bool __fits
842 = _Nm <= __gnu_cxx::__
int_traits<_UInt>::__max;
846 template<
typename _UInt>
847 static constexpr bool __fits<_UInt, false> =
false;
849 static consteval auto __select_size_type()
851 if constexpr (__fits<unsigned char>)
852 return (
unsigned char)0;
853#if __SHRT_WIDTH__ < __SIZE_WIDTH__
854 else if constexpr (__fits<unsigned short>)
855 return (
unsigned short)0;
857#if __INT_WIDTH__ < __SIZE_WIDTH__ && __INT_WIDTH__ > __SHRT_WIDTH__
858 else if constexpr (__fits<unsigned int>)
861#if __LONG_WIDTH__ < __SIZE_WIDTH__ && __LONG_WIDTH__ > __INT_WIDTH__
862 else if constexpr (__fits<unsigned long>)
868 decltype(__select_size_type()) _M_size = 0;
875#if __glibcxx_start_lifetime_as
876 std::start_lifetime_as_array<_Tp>(data(), _Nm);
882 if constexpr (is_trivial_v<_Tp>)
883 for (
size_t __i = 0; __i < _Nm; ++__i)
884 _M_elems[__i] = _Tp();
886 __builtin_unreachable();
890 static constexpr void
891 _S_reserve(
size_t __n)
897 template<
typename _InputIterator>
898 constexpr static auto
899 _S_distance(_InputIterator __first, _InputIterator __last)
901 if constexpr (sized_sentinel_for<_InputIterator, _InputIterator>
902 || forward_iterator<_InputIterator>)
903 return (size_type)ranges::distance(__first, __last);
904 else if constexpr (derived_from<__iter_category_t<_InputIterator>,
905 forward_iterator_tag>)
914 template<
typename _Tp>
915 class inplace_vector<_Tp, 0>
919 using value_type = _Tp;
920 using pointer = _Tp*;
921 using const_pointer =
const _Tp*;
922 using reference = value_type&;
923 using const_reference =
const value_type&;
924 using size_type = size_t;
925 using difference_type = ptrdiff_t;
927 = __gnu_cxx::__normal_iterator<_Tp*, inplace_vector>;
929 = __gnu_cxx::__normal_iterator<const _Tp*, inplace_vector>;
930 using reverse_iterator = std::reverse_iterator<iterator>;
931 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
934 inplace_vector() =
default;
937 inplace_vector(size_type __n)
944 inplace_vector(size_type __n,
const _Tp& __value)
950 template<__any_input_iterator _InputIterator>
952 inplace_vector(_InputIterator __first, _InputIterator __last)
954 if (__first != __last)
958 template <__detail::__container_compatible_range<_Tp> _Rg>
960 inplace_vector(from_range_t, _Rg&& __rg)
962 if (ranges::begin(__rg) != ranges::end(__rg))
967 inplace_vector(initializer_list<_Tp> __il)
969 if (__il.size() != 0)
973 inplace_vector(
const inplace_vector&) =
default;
974 inplace_vector(inplace_vector&&) =
default;
977 ~inplace_vector() =
default;
980 operator=(
const inplace_vector&) =
default;
983 operator=(inplace_vector&&) =
default;
985 constexpr inplace_vector&
986 operator=(initializer_list<_Tp> __il)
988 if (__il.size() != 0)
993 template<__any_input_iterator _InputIterator>
995 assign(_InputIterator __first, _InputIterator __last)
997 if (__first != __last)
1001 template<__detail::__container_compatible_range<_Tp> _Rg>
1003 assign_range(_Rg&& __rg)
1005 if (ranges::begin(__rg) != ranges::end(__rg))
1006 __throw_bad_alloc();
1010 assign(size_type __n,
const _Tp& __u)
1013 __throw_bad_alloc();
1017 assign(initializer_list<_Tp> __il)
1019 if (__il.size() != 0)
1020 __throw_bad_alloc();
1026 begin() noexcept {
return iterator(
nullptr); }
1029 constexpr const_iterator
1030 begin() const noexcept {
return const_iterator(
nullptr); }
1034 end() noexcept {
return iterator(
nullptr); }
1037 constexpr const_iterator
1038 end() const noexcept {
return const_iterator(
nullptr); }
1041 constexpr reverse_iterator
1043 {
return reverse_iterator(end()); }
1046 constexpr const_reverse_iterator
1047 rbegin() const noexcept
1048 {
return const_reverse_iterator(end()); }
1051 constexpr reverse_iterator
1052 rend() noexcept {
return reverse_iterator(begin()); }
1055 constexpr const_reverse_iterator
1056 rend() const noexcept {
return const_reverse_iterator(begin()); }
1059 constexpr const_iterator
1060 cbegin() const noexcept {
return begin(); }
1063 constexpr const_iterator
1064 cend() const noexcept {
return end(); }
1067 constexpr const_reverse_iterator
1068 crbegin() const noexcept {
return rbegin(); }
1071 constexpr const_reverse_iterator
1072 crend() const noexcept {
return rend(); }
1077 empty() const noexcept {
return true; }
1081 size() const noexcept {
return 0; }
1084 static constexpr size_type
1085 max_size() noexcept {
return 0; }
1088 static constexpr size_type
1089 capacity() noexcept {
return 0; }
1092 resize(size_type __n)
1095 __throw_bad_alloc();
1099 resize(size_type __n,
const _Tp&)
1102 __throw_bad_alloc();
1105 static constexpr void
1106 reserve(size_type __n)
1109 __throw_bad_alloc();
1112 static constexpr void
1116 [[nodiscard,noreturn]]
1118 operator[](size_type)
1119 { __builtin_trap(); }
1121 [[nodiscard,noreturn]]
1122 constexpr const_reference
1123 operator[](size_type)
const
1124 { __builtin_trap(); }
1126 [[nodiscard,noreturn]]
1127 constexpr const_reference
1128 at(size_type __n)
const
1130 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1132 ">= size() (which is 0)"),
1136 [[nodiscard,noreturn]]
1140 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1142 ">= size() (which is 0)"),
1146 [[nodiscard,noreturn]]
1149 { __builtin_trap(); }
1151 [[nodiscard,noreturn]]
1152 constexpr const_reference
1154 { __builtin_trap(); }
1156 [[nodiscard,noreturn]]
1159 { __builtin_trap(); }
1161 [[nodiscard,noreturn]]
1162 constexpr const_reference
1164 { __builtin_trap(); }
1174 constexpr const _Tp*
1175 data() const noexcept
1179 template<
typename... _Args>
1182 emplace_back(_Args&&...)
1183 { __throw_bad_alloc(); }
1187 push_back(
const _Tp&)
1188 { __throw_bad_alloc(); }
1193 { __throw_bad_alloc(); }
1195 template<__detail::__container_compatible_range<_Tp> _Rg>
1197 append_range(_Rg&& __rg)
1199 if (ranges::begin(__rg) != ranges::end(__rg))
1200 __throw_bad_alloc();
1206 { __builtin_trap(); }
1208 template<
typename... _Args>
1210 try_emplace_back(_Args&&...)
1214 try_push_back(
const _Tp&)
1218 try_push_back(_Tp&&)
1221 template<__detail::__container_compatible_range<_Tp> _Rg>
1222 constexpr ranges::borrowed_iterator_t<_Rg>
1223 try_append_range(_Rg&& __rg)
1224 {
return ranges::begin(__rg); }
1226 template<
typename... _Args>
1229 unchecked_emplace_back(_Args&&...)
1230 { __builtin_trap(); }
1234 unchecked_push_back(
const _Tp&)
1235 { __builtin_trap(); }
1239 unchecked_push_back(_Tp&&)
1240 { __builtin_trap(); }
1242 template<
typename... _Args>
1245 emplace(const_iterator, _Args&&...)
1246 { __throw_bad_alloc(); }
1250 insert(const_iterator,
const _Tp&)
1251 { __throw_bad_alloc(); }
1255 insert(const_iterator, _Tp&&)
1256 { __throw_bad_alloc(); }
1259 insert(const_iterator, size_type __n,
const _Tp&)
1262 __throw_bad_alloc();
1266 template<
typename _InputIterator>
1268 insert(const_iterator, _InputIterator __first, _InputIterator __last)
1270 if (__first != __last)
1271 __throw_bad_alloc();
1275 template<__detail::__container_compatible_range<_Tp> _Rg>
1277 insert_range(const_iterator, _Rg&& __rg)
1279 if (ranges::begin(__rg) != ranges::end(__rg))
1280 __throw_bad_alloc();
1285 insert(const_iterator, initializer_list<_Tp> __il)
1287 if (__il.size() != 0)
1288 __throw_bad_alloc();
1294 erase(const_iterator)
1295 { __builtin_trap(); }
1298 erase(const_iterator __first, const_iterator __last)
1300 __glibcxx_assert(__first == __last);
1305 swap(inplace_vector& __x)
1313 constexpr friend bool
1314 operator==(
const inplace_vector&,
const inplace_vector&)
1317 constexpr friend auto
1318 operator<=>(
const inplace_vector&,
const inplace_vector&)
1319 requires requires (
const _Tp __t) {
1320 { __t < __t } -> __detail::__boolean_testable;
1322 {
return std::strong_ordering::equal; }
1328 constexpr friend void
1329 swap(inplace_vector&, inplace_vector&)
noexcept
1333_GLIBCXX_END_NAMESPACE_CONTAINER
1335 template<
typename _Tp,
size_t _Nm,
typename _Predicate>
1337 erase_if(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
1340 if constexpr (_Nm != 0)
1342 const auto __osz = __cont.size();
1343 const auto __end = __cont.end();
1344 auto __removed = std::__remove_if(__cont.begin(), __end,
1346 if (__removed != __end)
1348 __cont.erase(__removed, __end);
1349 return __osz - __cont.size();
1356 template<
typename _Tp,
size_t _Nm,
typename _Up = _Tp>
1358 erase(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
const _Up& __value)
1359 {
return std::erase_if(__cont, __gnu_cxx::__ops::__equal_to(__value)); }
1361_GLIBCXX_END_NAMESPACE_VERSION
1364#ifdef _GLIBCXX_DEBUG
1365# include <debug/inplace_vector>
_ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __count)
Value-initializes objects in the range [first,first+count).
_ForwardIterator uninitialized_move(_InputIterator __first, _InputIterator __last, _ForwardIterator __result)
Move-construct from the range [first,last) into result.
_ForwardIterator uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp &__x)
Copies the value x into the range [first,first+n).
_ForwardIterator uninitialized_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result)
Copies the range [first,last) into result.
__bool_constant< false > false_type
The type used as a compile-time boolean with false value.
constexpr _Tp * addressof(_Tp &__r) noexcept
Returns the actual address of the object or function referenced by r, even in the presence of an over...
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
constexpr auto lexicographical_compare_three_way(_InputIter1 __first1, _InputIter1 __last1, _InputIter2 __first2, _InputIter2 __last2, _Comp __comp) -> decltype(__comp(*__first1, *__first2))
Performs dictionary comparison on ranges.
ISO C++ entities toplevel namespace is std.
constexpr iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
constexpr _ForwardIterator _Destroy_n(_ForwardIterator __first, _Size __count)