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
50namespace std _GLIBCXX_VISIBILITY(default)
52_GLIBCXX_BEGIN_NAMESPACE_VERSION
53_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
56 template<
typename _Tp,
size_t _Nm>
62 using value_type = _Tp;
64 using const_pointer =
const _Tp*;
65 using reference = value_type&;
66 using const_reference =
const value_type&;
67 using size_type = size_t;
68 using difference_type = ptrdiff_t;
70 = __gnu_cxx::__normal_iterator<_Tp*, inplace_vector>;
72 = __gnu_cxx::__normal_iterator<const _Tp*, inplace_vector>;
73 using reverse_iterator = std::reverse_iterator<iterator>;
74 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
78 inplace_vector() noexcept
82 inplace_vector(size_type __n)
91 inplace_vector(size_type __n,
const _Tp& __value)
99 template<__any_input_iterator _InputIterator>
101 inplace_vector(_InputIterator __first, _InputIterator __last)
104 if (
const auto __n = _S_distance(__first, __last))
112 while (__first != __last)
113 emplace_back(*__first++);
117 template <__detail::__container_compatible_range<_Tp> _Rg>
119 inplace_vector(from_range_t, _Rg&& __rg)
121 { append_range(__rg); }
124 inplace_vector(initializer_list<_Tp> __il)
127 _S_reserve(__il.size());
129 _M_size = __il.size();
132 inplace_vector(
const inplace_vector&)
133 requires is_trivially_copy_constructible_v<_Tp>
137 inplace_vector(
const inplace_vector& __other)
138 noexcept(is_nothrow_copy_constructible_v<_Tp>)
142 _M_size = __other.size();
145 inplace_vector(inplace_vector&&)
146 requires is_trivially_move_constructible_v<_Tp>
150 inplace_vector(inplace_vector&& __other)
151 noexcept(is_nothrow_move_constructible_v<_Tp>)
155 _M_size = __other.size();
159 requires is_trivially_destructible_v<_Tp>
167 operator=(
const inplace_vector&)
168 requires is_trivially_copy_assignable_v<_Tp>
169 && is_trivially_copy_constructible_v<_Tp>
170 && is_trivially_destructible_v<_Tp>
173 constexpr inplace_vector&
174 operator=(
const inplace_vector& __other)
175 noexcept(is_nothrow_copy_assignable_v<_Tp>
176 && is_nothrow_copy_constructible_v<_Tp>)
179 assign(__other.begin(), __other.end());
184 operator=(inplace_vector&&)
185 requires is_trivially_move_assignable_v<_Tp>
186 && is_trivially_move_constructible_v<_Tp>
187 && is_trivially_destructible_v<_Tp>
190 constexpr inplace_vector&
191 operator=(inplace_vector&& __other)
192 noexcept(is_nothrow_move_assignable_v<_Tp>
193 && is_nothrow_move_constructible_v<_Tp>)
196 assign(std::make_move_iterator(__other.begin()),
197 std::make_move_iterator(__other.end()));
201 constexpr inplace_vector&
202 operator=(initializer_list<_Tp> __il)
204 assign(__il.begin(), __il.end());
208 template<__any_input_iterator _InputIterator>
210 assign(_InputIterator __first, _InputIterator __last)
212 if (
const auto __n = _S_distance(__first, __last))
217 for (
size_t __i = 0; __i < _M_size; ++__i, (void)++__first)
218 _M_elems[__i] = *__first;
222 std::destroy(std::copy(__first, __last, begin()), end());
228 for (;__first != __last && __i < _M_size; ++__first)
229 _M_elems[__i++] = *__first;
230 if (__first == __last)
237 while (__first != __last)
238 emplace_back(*__first++);
243 template<__detail::__container_compatible_range<_Tp> _Rg>
245 assign_range(_Rg&& __rg)
247 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
249 const auto __sz = ranges::distance(__rg);
254 ranges::copy_n(ranges::begin(__rg), __sz, data());
255 std::destroy(data() + __sz, data() + _M_size);
259 auto [__in, __out] = ranges::copy_n(
260 ranges::begin(__rg), _M_size,
262 ranges::uninitialized_copy(
264 __out, unreachable_sentinel);
270 auto __in = ranges::begin(__rg);
271 auto __end = ranges::end(__rg);
273 for (; __n < _M_size && __in != __end; ++__in)
274 _M_elems[__n++] = *__in;
278 std::destroy(data() + __n, data() + _M_size);
284 auto __res = ranges::uninitialized_copy(
286 data() + __n, data() + _Nm);
287 _M_size = __res.out - data();
288 if (__res.in == ranges::end(__rg))
296 assign(size_type __n,
const _Tp& __u)
303 std::destroy_n(std::fill_n(data(), __n, __u), _M_size - __n);
308 assign(initializer_list<_Tp> __il)
309 { assign(__il.begin(), __il.end()); }
314 begin() noexcept {
return iterator(data()); }
317 constexpr const_iterator
318 begin() const noexcept {
return const_iterator(data()); }
323 {
return iterator(data() + _M_size); }
326 constexpr const_iterator
328 {
return const_iterator(data() + _M_size); }
331 constexpr reverse_iterator
333 {
return reverse_iterator(end()); }
336 constexpr const_reverse_iterator
337 rbegin() const noexcept
338 {
return const_reverse_iterator(end()); }
341 constexpr reverse_iterator
342 rend() noexcept {
return reverse_iterator(begin()); }
345 constexpr const_reverse_iterator
346 rend() const noexcept {
return const_reverse_iterator(begin()); }
349 constexpr const_iterator
350 cbegin() const noexcept {
return begin(); }
353 constexpr const_iterator
354 cend() const noexcept {
return end(); }
357 constexpr const_reverse_iterator
358 crbegin() const noexcept {
return rbegin(); }
361 constexpr const_reverse_iterator
362 crend() const noexcept {
return rend(); }
367 empty() const noexcept {
return _M_size == 0; }
371 size() const noexcept
374 __builtin_unreachable();
379 static constexpr size_type
380 max_size() noexcept {
return _Nm; }
383 static constexpr size_type
384 capacity() noexcept {
return _Nm; }
387 resize(size_type __n)
392 else if (__n < _M_size)
393 std::destroy_n(data() + __n, _M_size - __n);
398 resize(size_type __n,
const _Tp& __c)
403 else if (__n < _M_size)
404 std::destroy_n(data() + __n, _M_size - __n);
408 static constexpr void
409 reserve(size_type __n)
412 static constexpr void
418 operator[](size_type __n)
420 __glibcxx_requires_subscript(__n);
421 return _M_elems[__n];
425 constexpr const_reference
426 operator[](size_type __n)
const
428 __glibcxx_requires_subscript(__n);
429 return _M_elems[__n];
433 constexpr const_reference
434 at(size_type __n)
const
437 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
439 ">= size() (which is %zu)"),
441 return _M_elems[__n];
449 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
451 ">= size() (which is %zu)"),
453 return _M_elems[__n];
460 __glibcxx_requires_nonempty();
465 constexpr const_reference
468 __glibcxx_requires_nonempty();
476 __glibcxx_requires_nonempty();
477 return _M_elems[_M_size - 1];
481 constexpr const_reference
484 __glibcxx_requires_nonempty();
485 return _M_elems[_M_size - 1];
493 {
return static_cast<pointer
>(_M_elems); }
497 data() const noexcept
498 {
return static_cast<const_pointer
>(_M_elems); }
501 template<
typename... _Args>
503 emplace_back(_Args&&... __args)
511 push_back(
const _Tp& __x)
512 {
return emplace_back(__x); }
518 template<__detail::__container_compatible_range<_Tp> _Rg>
520 append_range(_Rg&& __rg)
522 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
524 const auto __sz = ranges::distance(__rg);
525 if (__sz > (_Nm - size()))
528 ranges::uninitialized_copy(
529 ranges::begin(__rg), unreachable_sentinel,
530 data() + _M_size, data() + _M_size + __sz);
531 _M_size += size_type(__sz);
535 ranges::subrange<pointer> __tail(data() + _M_size, data() + _Nm);
536 auto [__in, __out] = ranges::uninitialized_copy(__rg, __tail);
537 _M_size = __out - data();
538 if (__in != ranges::end(__rg))
546 __glibcxx_requires_nonempty();
548 _M_elems[_M_size].~_Tp();
551 template<
typename... _Args>
553 try_emplace_back(_Args&&... __args)
555 if (_M_size >= _Nm) [[unlikely]]
558 return __builtin_addressof(__r);
562 try_push_back(
const _Tp& __x)
564 if (_M_size >= _Nm) [[unlikely]]
566 return __builtin_addressof(unchecked_emplace_back(__x));
570 try_push_back(_Tp&& __x)
572 if (_M_size >= _Nm) [[unlikely]]
574 return __builtin_addressof(unchecked_emplace_back(
std::move(__x)));
577 template<__detail::__container_compatible_range<_Tp> _Rg>
578 constexpr ranges::borrowed_iterator_t<_Rg>
579 try_append_range(_Rg&& __rg)
581 if constexpr (ranges::sized_range<_Rg>)
583 auto __n = ranges::distance(__rg);
584 if (__n == 0) [[unlikely]]
585 return ranges::begin(__rg);
587 const auto __end = data() + _M_size;
588 const size_t __avail = _Nm - size();
590 _M_size += size_type(__n);
596 return ranges::uninitialized_copy_n(
597 ranges::begin(__rg), __n,
598 __end, unreachable_sentinel).in;
602 ranges::subrange<pointer> __tail(data() + _M_size, data() + _Nm);
603 auto [__in, __out] = ranges::uninitialized_copy(__rg, __tail);
604 _M_size = __out - data();
609 template<
typename... _Args>
611 unchecked_emplace_back(_Args&&... __args)
613 __glibcxx_assert(_M_size < _Nm);
614 auto __p = std::construct_at(data() + _M_size,
621 unchecked_push_back(
const _Tp& __x)
622 {
return unchecked_emplace_back(__x); }
625 unchecked_push_back(_Tp&& __x)
626 {
return unchecked_emplace_back(
std::move(__x)); }
628 template<
typename... _Args>
630 emplace(const_iterator __position, _Args&&... __args)
632 size_t __b = __position - cbegin();
633 __glibcxx_assert(__b <= _M_size);
636 iterator __pos = begin() + __b;
639 std::rotate(__pos, end() - 1, end());
644 insert(const_iterator __position,
const _Tp& __x)
645 {
return emplace(__position, __x); }
648 insert(const_iterator __position, _Tp&& __x)
649 {
return emplace(__position,
std::move(__x)); }
652 insert(const_iterator __position, size_type __n,
const _Tp& __x)
654 size_t __b = __position - cbegin();
655 __glibcxx_assert(__b <= _M_size);
656 if ((_Nm - _M_size) < __n)
658 iterator __pos = begin() + __b;
660 if (std::__exchange(_M_size, _M_size + __n))
661 std::rotate(__pos, end() - __n, end());
665 template<__any_input_iterator _InputIterator>
667 insert(const_iterator __position, _InputIterator __first,
668 _InputIterator __last)
670 size_t __b = __position - cbegin();
671 __glibcxx_assert(__b <= _M_size);
672 iterator __pos = begin() + __b;
673 const size_t __s = _M_size;
674 if (
const auto __n = _S_distance(__first, __last))
676 if ((_Nm - _M_size) < __n)
683 while (__first != __last)
684 emplace_back(*__first++);
687 std::rotate(__pos, begin() + __s, end());
691 template<__detail::__container_compatible_range<_Tp> _Rg>
693 insert_range(const_iterator __position, _Rg&& __rg)
695 iterator __pos = begin() + (__position - cbegin());
696 const auto __end = end();
697 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
699 const auto __len = ranges::distance(__rg);
700 if (__len > (_Nm - size()))
702 if (!__len) [[unlikely]]
705 const size_type __n = size_type(__len);
706 const size_type __num_after = __end - __pos;
707 if (__num_after >= __n)
709 ranges::uninitialized_move(__end - __n, __end,
710 __end, unreachable_sentinel);
712 ranges::move_backward(__pos, __end - __n, __end);
713 ranges::copy(__rg, __pos);
715 else if constexpr (ranges::forward_range<_Rg>)
717 auto __mid = ranges::next(ranges::begin(__rg), __num_after);
718 ranges::uninitialized_copy(__mid, ranges::end(__rg),
719 __end, unreachable_sentinel);
720 _M_size += __n - __num_after;
721 ranges::uninitialized_move(__pos, __end,
722 __pos + __n, unreachable_sentinel);
723 _M_size += __num_after;
724 ranges::copy(ranges::begin(__rg), __mid, __pos);
728 ranges::uninitialized_copy(
729 ranges::begin(__rg), ranges::end(__rg),
730 __end, unreachable_sentinel);
732 std::rotate(__pos, __end, end());
738 std::rotate(__pos, __end, end());
744 insert(const_iterator __position, initializer_list<_Tp> __il)
745 {
return insert(__position, __il.begin(), __il.end()); }
748 erase(const_iterator __position)
750 size_t __n = __position - cbegin();
751 __glibcxx_assert(__n < _M_size);
752 iterator __pos = begin() + __n;
759 erase(const_iterator __first, const_iterator __last)
761 size_t __n = __first - cbegin();
762 size_t __x = __last - __first;
763 __glibcxx_assert(__n <= _M_size);
764 __glibcxx_assert(__x <= _M_size);
765 iterator __pos = begin() + __n;
766 iterator __end =
std::move(__pos + __x, end(), __pos);
767 std::destroy_n(__end, __x);
773 swap(inplace_vector& __x)
774 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
777 const auto __smaller = __vs[__x.size() < size()];
778 const auto __bigger = __vs[__x.size() >= size()];
779 size_type __n = __smaller->size();
780 size_type __n2 = __bigger->size();
782 if constexpr (is_nothrow_move_constructible_v<_Tp>)
784 for (size_type __i = __n; __i < __n2; ++__i)
786 std::construct_at(__smaller->data() + __i,
788 std::destroy_at(__bigger->data() + __i);
794 __bigger->data() + __n2,
795 __smaller->data() + __n);
796 std::destroy(__bigger->data() + __n, __bigger->data() + __n2);
798 __smaller->_M_size = __n2;
799 __bigger->_M_size = __n;
802 for (size_type __i = 0; __i < __n; __i++)
803 swap(_M_elems[__i], __x._M_elems[__i]);
809 std::destroy_n(data(),
size_t(_M_size));
813 constexpr friend bool
814 operator==(
const inplace_vector& __x,
const inplace_vector& __y)
815 {
return std::equal(__x.begin(), __x.end(), __y.begin(), __y.end()); }
817 constexpr friend auto
818 operator<=>(
const inplace_vector& __x,
const inplace_vector& __y)
819 requires requires (
const _Tp __t) {
820 { __t < __t } -> __detail::__boolean_testable;
824 __y.begin(), __y.end(),
825 __detail::__synth3way);
829 constexpr friend void
830 swap(inplace_vector& __x, inplace_vector& __y)
831 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
841 template<
typename _UInt,
bool = (alignof(_Tp) <= sizeof(_UInt))>
842 static constexpr
bool __fits
843 = _Nm <= __gnu_cxx::__
int_traits<_UInt>::__max;
847 template<
typename _UInt>
848 static constexpr bool __fits<_UInt, false> =
false;
850 static consteval auto __select_size_type()
852 if constexpr (__fits<unsigned char>)
853 return (
unsigned char)0;
854#if __SHRT_WIDTH__ < __SIZE_WIDTH__
855 else if constexpr (__fits<unsigned short>)
856 return (
unsigned short)0;
858#if __INT_WIDTH__ < __SIZE_WIDTH__ && __INT_WIDTH__ > __SHRT_WIDTH__
859 else if constexpr (__fits<unsigned int>)
862#if __LONG_WIDTH__ < __SIZE_WIDTH__ && __LONG_WIDTH__ > __INT_WIDTH__
863 else if constexpr (__fits<unsigned long>)
869 decltype(__select_size_type()) _M_size = 0;
876#if __glibcxx_start_lifetime_as
877 std::start_lifetime_as_array<_Tp>(data(), _Nm);
883 if constexpr (is_trivial_v<_Tp>)
884 for (
size_t __i = 0; __i < _Nm; ++__i)
885 _M_elems[__i] = _Tp();
887 __builtin_unreachable();
891 static constexpr void
892 _S_reserve(
size_t __n)
898 template<
typename _InputIterator>
899 constexpr static auto
900 _S_distance(_InputIterator __first, _InputIterator __last)
902 if constexpr (sized_sentinel_for<_InputIterator, _InputIterator>
903 || forward_iterator<_InputIterator>)
904 return (size_type)ranges::distance(__first, __last);
905 else if constexpr (derived_from<__iter_category_t<_InputIterator>,
906 forward_iterator_tag>)
915 template<
typename _Tp>
916 class inplace_vector<_Tp, 0>
920 using value_type = _Tp;
921 using pointer = _Tp*;
922 using const_pointer =
const _Tp*;
923 using reference = value_type&;
924 using const_reference =
const value_type&;
925 using size_type = size_t;
926 using difference_type = ptrdiff_t;
928 = __gnu_cxx::__normal_iterator<_Tp*, inplace_vector>;
930 = __gnu_cxx::__normal_iterator<const _Tp*, inplace_vector>;
931 using reverse_iterator = std::reverse_iterator<iterator>;
932 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
935 inplace_vector() =
default;
938 inplace_vector(size_type __n)
945 inplace_vector(size_type __n,
const _Tp& __value)
951 template<__any_input_iterator _InputIterator>
953 inplace_vector(_InputIterator __first, _InputIterator __last)
955 if (__first != __last)
959 template <__detail::__container_compatible_range<_Tp> _Rg>
961 inplace_vector(from_range_t, _Rg&& __rg)
963 if (ranges::begin(__rg) != ranges::end(__rg))
968 inplace_vector(initializer_list<_Tp> __il)
970 if (__il.size() != 0)
974 inplace_vector(
const inplace_vector&) =
default;
975 inplace_vector(inplace_vector&&) =
default;
978 ~inplace_vector() =
default;
981 operator=(
const inplace_vector&) =
default;
984 operator=(inplace_vector&&) =
default;
986 constexpr inplace_vector&
987 operator=(initializer_list<_Tp> __il)
989 if (__il.size() != 0)
994 template<__any_input_iterator _InputIterator>
996 assign(_InputIterator __first, _InputIterator __last)
998 if (__first != __last)
1002 template<__detail::__container_compatible_range<_Tp> _Rg>
1004 assign_range(_Rg&& __rg)
1006 if (ranges::begin(__rg) != ranges::end(__rg))
1007 __throw_bad_alloc();
1011 assign(size_type __n,
const _Tp& __u)
1014 __throw_bad_alloc();
1018 assign(initializer_list<_Tp> __il)
1020 if (__il.size() != 0)
1021 __throw_bad_alloc();
1027 begin() noexcept {
return iterator(
nullptr); }
1030 constexpr const_iterator
1031 begin() const noexcept {
return const_iterator(
nullptr); }
1035 end() noexcept {
return iterator(
nullptr); }
1038 constexpr const_iterator
1039 end() const noexcept {
return const_iterator(
nullptr); }
1042 constexpr reverse_iterator
1044 {
return reverse_iterator(end()); }
1047 constexpr const_reverse_iterator
1048 rbegin() const noexcept
1049 {
return const_reverse_iterator(end()); }
1052 constexpr reverse_iterator
1053 rend() noexcept {
return reverse_iterator(begin()); }
1056 constexpr const_reverse_iterator
1057 rend() const noexcept {
return const_reverse_iterator(begin()); }
1060 constexpr const_iterator
1061 cbegin() const noexcept {
return begin(); }
1064 constexpr const_iterator
1065 cend() const noexcept {
return end(); }
1068 constexpr const_reverse_iterator
1069 crbegin() const noexcept {
return rbegin(); }
1072 constexpr const_reverse_iterator
1073 crend() const noexcept {
return rend(); }
1078 empty() const noexcept {
return true; }
1082 size() const noexcept {
return 0; }
1085 static constexpr size_type
1086 max_size() noexcept {
return 0; }
1089 static constexpr size_type
1090 capacity() noexcept {
return 0; }
1093 resize(size_type __n)
1096 __throw_bad_alloc();
1100 resize(size_type __n,
const _Tp&)
1103 __throw_bad_alloc();
1106 static constexpr void
1107 reserve(size_type __n)
1110 __throw_bad_alloc();
1113 static constexpr void
1117 [[nodiscard,noreturn]]
1119 operator[](size_type)
1120 { __builtin_trap(); }
1122 [[nodiscard,noreturn]]
1123 constexpr const_reference
1124 operator[](size_type)
const
1125 { __builtin_trap(); }
1127 [[nodiscard,noreturn]]
1128 constexpr const_reference
1129 at(size_type __n)
const
1131 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1133 ">= size() (which is 0)"),
1137 [[nodiscard,noreturn]]
1141 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1143 ">= size() (which is 0)"),
1147 [[nodiscard,noreturn]]
1150 { __builtin_trap(); }
1152 [[nodiscard,noreturn]]
1153 constexpr const_reference
1155 { __builtin_trap(); }
1157 [[nodiscard,noreturn]]
1160 { __builtin_trap(); }
1162 [[nodiscard,noreturn]]
1163 constexpr const_reference
1165 { __builtin_trap(); }
1175 constexpr const _Tp*
1176 data() const noexcept
1180 template<
typename... _Args>
1183 emplace_back(_Args&&...)
1184 { __throw_bad_alloc(); }
1188 push_back(
const _Tp&)
1189 { __throw_bad_alloc(); }
1194 { __throw_bad_alloc(); }
1196 template<__detail::__container_compatible_range<_Tp> _Rg>
1198 append_range(_Rg&& __rg)
1200 if (ranges::begin(__rg) != ranges::end(__rg))
1201 __throw_bad_alloc();
1207 { __builtin_trap(); }
1209 template<
typename... _Args>
1211 try_emplace_back(_Args&&...)
1215 try_push_back(
const _Tp&)
1219 try_push_back(_Tp&&)
1222 template<__detail::__container_compatible_range<_Tp> _Rg>
1223 constexpr ranges::borrowed_iterator_t<_Rg>
1224 try_append_range(_Rg&& __rg)
1225 {
return ranges::begin(__rg); }
1227 template<
typename... _Args>
1230 unchecked_emplace_back(_Args&&...)
1231 { __builtin_trap(); }
1235 unchecked_push_back(
const _Tp&)
1236 { __builtin_trap(); }
1240 unchecked_push_back(_Tp&&)
1241 { __builtin_trap(); }
1243 template<
typename... _Args>
1246 emplace(const_iterator, _Args&&...)
1247 { __throw_bad_alloc(); }
1251 insert(const_iterator,
const _Tp&)
1252 { __throw_bad_alloc(); }
1256 insert(const_iterator, _Tp&&)
1257 { __throw_bad_alloc(); }
1260 insert(const_iterator, size_type __n,
const _Tp&)
1263 __throw_bad_alloc();
1267 template<
typename _InputIterator>
1269 insert(const_iterator, _InputIterator __first, _InputIterator __last)
1271 if (__first != __last)
1272 __throw_bad_alloc();
1276 template<__detail::__container_compatible_range<_Tp> _Rg>
1278 insert_range(const_iterator, _Rg&& __rg)
1280 if (ranges::begin(__rg) != ranges::end(__rg))
1281 __throw_bad_alloc();
1286 insert(const_iterator, initializer_list<_Tp> __il)
1288 if (__il.size() != 0)
1289 __throw_bad_alloc();
1295 erase(const_iterator)
1296 { __builtin_trap(); }
1299 erase(const_iterator __first, const_iterator __last)
1301 __glibcxx_assert(__first == __last);
1306 swap(inplace_vector& __x)
1314 constexpr friend bool
1315 operator==(
const inplace_vector&,
const inplace_vector&)
1318 constexpr friend auto
1319 operator<=>(
const inplace_vector&,
const inplace_vector&)
1320 requires requires (
const _Tp __t) {
1321 { __t < __t } -> __detail::__boolean_testable;
1323 {
return std::strong_ordering::equal; }
1329 constexpr friend void
1330 swap(inplace_vector&, inplace_vector&)
noexcept
1334_GLIBCXX_END_NAMESPACE_CONTAINER
1336 template<
typename _Tp,
size_t _Nm,
typename _Predicate>
1338 erase_if(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
1341 if constexpr (_Nm != 0)
1343 const auto __osz = __cont.size();
1344 const auto __end = __cont.end();
1345 auto __removed = std::__remove_if(__cont.begin(), __end,
1347 if (__removed != __end)
1349 __cont.erase(__removed, __end);
1350 return __osz - __cont.size();
1357 template<
typename _Tp,
size_t _Nm,
typename _Up = _Tp>
1359 erase(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
const _Up& __value)
1360 {
return std::erase_if(__cont, __gnu_cxx::__ops::__equal_to(__value)); }
1362_GLIBCXX_END_NAMESPACE_VERSION
1365#ifdef _GLIBCXX_DEBUG
1366# 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)