30#ifndef _GLIBCXX_INPLACE_VECTOR
31#define _GLIBCXX_INPLACE_VECTOR 1
33#pragma GCC system_header
35#define __glibcxx_want_constexpr_inplace_vector
36#define __glibcxx_want_hardened_inplace_vector
37#define __glibcxx_want_inplace_vector
40#ifdef __glibcxx_inplace_vector
54namespace std _GLIBCXX_VISIBILITY(default)
56_GLIBCXX_BEGIN_NAMESPACE_VERSION
57_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
60 template<
typename _Tp,
size_t _Nm>
66 using value_type = _Tp;
68 using const_pointer =
const _Tp*;
69 using reference = value_type&;
70 using const_reference =
const value_type&;
71 using size_type = size_t;
72 using difference_type = ptrdiff_t;
74 = __gnu_cxx::__normal_iterator<_Tp*, inplace_vector>;
76 = __gnu_cxx::__normal_iterator<const _Tp*, inplace_vector>;
77 using reverse_iterator = std::reverse_iterator<iterator>;
78 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
82 inplace_vector() noexcept
86 inplace_vector(size_type __n)
95 inplace_vector(size_type __n,
const _Tp& __value)
103 template<__any_input_iterator _InputIterator>
105 inplace_vector(_InputIterator __first, _InputIterator __last)
108 if (
const auto __n = _S_distance(__first, __last))
116 while (__first != __last)
117 emplace_back(*__first++);
121 template <__detail::__container_compatible_range<_Tp> _Rg>
123 inplace_vector(from_range_t, _Rg&& __rg)
128 if constexpr (ranges::__static_sized_range<_Rg>)
129 static_assert(ranges::size(__rg) <= _Nm);
135 inplace_vector(initializer_list<_Tp> __il)
138 _S_reserve(__il.size());
140 _M_size = __il.size();
143 inplace_vector(
const inplace_vector&)
144 requires is_trivially_copy_constructible_v<_Tp>
148 inplace_vector(
const inplace_vector& __other)
149 noexcept(is_nothrow_copy_constructible_v<_Tp>)
153 _M_size = __other.size();
156 inplace_vector(inplace_vector&&)
157 requires is_trivially_move_constructible_v<_Tp>
161 inplace_vector(inplace_vector&& __other)
162 noexcept(is_nothrow_move_constructible_v<_Tp>)
166 _M_size = __other.size();
170 requires is_trivially_destructible_v<_Tp>
178 operator=(
const inplace_vector&)
179 requires is_trivially_copy_assignable_v<_Tp>
180 && is_trivially_copy_constructible_v<_Tp>
181 && is_trivially_destructible_v<_Tp>
184 constexpr inplace_vector&
185 operator=(
const inplace_vector& __other)
186 noexcept(is_nothrow_copy_assignable_v<_Tp>
187 && is_nothrow_copy_constructible_v<_Tp>)
190 assign(__other.begin(), __other.end());
195 operator=(inplace_vector&&)
196 requires is_trivially_move_assignable_v<_Tp>
197 && is_trivially_move_constructible_v<_Tp>
198 && is_trivially_destructible_v<_Tp>
201 constexpr inplace_vector&
202 operator=(inplace_vector&& __other)
203 noexcept(is_nothrow_move_assignable_v<_Tp>
204 && is_nothrow_move_constructible_v<_Tp>)
207 assign(std::make_move_iterator(__other.begin()),
208 std::make_move_iterator(__other.end()));
212 constexpr inplace_vector&
213 operator=(initializer_list<_Tp> __il)
215 assign(__il.begin(), __il.end());
219 template<__any_input_iterator _InputIterator>
221 assign(_InputIterator __first, _InputIterator __last)
223 if (
const auto __n = _S_distance(__first, __last))
228 for (
size_t __i = 0; __i < _M_size; ++__i, (void)++__first)
229 _M_elems[__i] = *__first;
233 std::destroy(std::copy(__first, __last, begin()), end());
239 for (;__first != __last && __i < _M_size; ++__first)
240 _M_elems[__i++] = *__first;
241 if (__first == __last)
248 while (__first != __last)
249 emplace_back(*__first++);
254 template<__detail::__container_compatible_range<_Tp> _Rg>
256 assign_range(_Rg&& __rg)
258 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
260 const auto __len = ranges::distance(__rg);
264 const size_t __sz = size_t(__len);
267 ranges::copy_n(ranges::begin(__rg), __sz, data());
268 std::destroy(data() + __sz, data() + _M_size);
272 auto [__in, __out] = ranges::copy_n(
273 ranges::begin(__rg), _M_size,
275 ranges::uninitialized_copy(
277 __out, unreachable_sentinel);
283 auto __in = ranges::begin(__rg);
284 auto __end = ranges::end(__rg);
286 for (; __n < _M_size && __in != __end; ++__in)
287 _M_elems[__n++] = *__in;
291 std::destroy(data() + __n, data() + _M_size);
297 auto __res = ranges::uninitialized_copy(
299 data() + __n, data() + _Nm);
300 _M_size = __res.out - data();
301 if (__res.in == ranges::end(__rg))
309 assign(size_type __n,
const _Tp& __u)
316 std::destroy_n(std::fill_n(data(), __n, __u), _M_size - __n);
321 assign(initializer_list<_Tp> __il)
322 { assign(__il.begin(), __il.end()); }
327 begin() noexcept {
return iterator(data()); }
330 constexpr const_iterator
331 begin() const noexcept {
return const_iterator(data()); }
336 {
return iterator(data() + _M_size); }
339 constexpr const_iterator
341 {
return const_iterator(data() + _M_size); }
344 constexpr reverse_iterator
346 {
return reverse_iterator(end()); }
349 constexpr const_reverse_iterator
350 rbegin() const noexcept
351 {
return const_reverse_iterator(end()); }
354 constexpr reverse_iterator
355 rend() noexcept {
return reverse_iterator(begin()); }
358 constexpr const_reverse_iterator
359 rend() const noexcept {
return const_reverse_iterator(begin()); }
362 constexpr const_iterator
363 cbegin() const noexcept {
return begin(); }
366 constexpr const_iterator
367 cend() const noexcept {
return end(); }
370 constexpr const_reverse_iterator
371 crbegin() const noexcept {
return rbegin(); }
374 constexpr const_reverse_iterator
375 crend() const noexcept {
return rend(); }
380 empty() const noexcept {
return _M_size == 0; }
384 size() const noexcept
387 __builtin_unreachable();
392 static constexpr size_type
393 max_size() noexcept {
return _Nm; }
396 static constexpr size_type
397 capacity() noexcept {
return _Nm; }
400 resize(size_type __n)
405 else if (__n < _M_size)
406 std::destroy_n(data() + __n, _M_size - __n);
411 resize(size_type __n,
const _Tp& __c)
416 else if (__n < _M_size)
417 std::destroy_n(data() + __n, _M_size - __n);
421 static constexpr void
422 reserve(size_type __n)
425 static constexpr void
431 operator[](size_type __n)
433 __glibcxx_requires_subscript(__n);
434 return _M_elems[__n];
438 constexpr const_reference
439 operator[](size_type __n)
const
441 __glibcxx_requires_subscript(__n);
442 return _M_elems[__n];
446 constexpr const_reference
447 at(size_type __n)
const
450 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
452 ">= size() (which is %zu)"),
454 return _M_elems[__n];
462 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
464 ">= size() (which is %zu)"),
466 return _M_elems[__n];
473 __glibcxx_requires_nonempty();
478 constexpr const_reference
481 __glibcxx_requires_nonempty();
489 __glibcxx_requires_nonempty();
490 return _M_elems[_M_size - 1];
494 constexpr const_reference
497 __glibcxx_requires_nonempty();
498 return _M_elems[_M_size - 1];
506 {
return static_cast<pointer
>(_M_elems); }
510 data() const noexcept
511 {
return static_cast<const_pointer
>(_M_elems); }
514 template<
typename... _Args>
516 emplace_back(_Args&&... __args)
524 push_back(
const _Tp& __x)
525 {
return emplace_back(__x); }
531 template<__detail::__container_compatible_range<_Tp> _Rg>
533 append_range(_Rg&& __rg)
535 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
537 const auto __len = ranges::distance(__rg);
538 if (__len > (_Nm - size()))
541 const size_t __sz = size_t(__len);
543 ranges::uninitialized_copy(
544 ranges::begin(__rg), unreachable_sentinel,
545 data() + _M_size, data() + _M_size + __sz);
546 _M_size += size_type(__sz);
550 ranges::subrange<pointer> __tail(data() + _M_size, data() + _Nm);
551 auto [__in, __out] = ranges::uninitialized_copy(__rg, __tail);
552 _M_size = __out - data();
553 if (__in != ranges::end(__rg))
561 __glibcxx_requires_nonempty();
563 _M_elems[_M_size].~_Tp();
566 template<
typename... _Args>
567 constexpr optional<_Tp&>
568 try_emplace_back(_Args&&... __args)
570 if (_M_size >= _Nm) [[unlikely]]
572 return optional<_Tp&>(in_place,
576 constexpr optional<_Tp&>
577 try_push_back(
const _Tp& __x)
579 if (_M_size >= _Nm) [[unlikely]]
581 return optional<_Tp&>(in_place, unchecked_emplace_back(__x));
584 constexpr optional<_Tp&>
585 try_push_back(_Tp&& __x)
587 if (_M_size >= _Nm) [[unlikely]]
589 return optional<_Tp&>(in_place, unchecked_emplace_back(
std::move(__x)));
592 template<
typename... _Args>
594 unchecked_emplace_back(_Args&&... __args)
596 __glibcxx_assert(_M_size < _Nm);
597 auto __p = std::construct_at(data() + _M_size,
604 unchecked_push_back(
const _Tp& __x)
605 {
return unchecked_emplace_back(__x); }
608 unchecked_push_back(_Tp&& __x)
609 {
return unchecked_emplace_back(
std::move(__x)); }
611 template<
typename... _Args>
613 emplace(const_iterator __position, _Args&&... __args)
615 size_t __b = __position - cbegin();
616 __glibcxx_assert(__b <= _M_size);
619 iterator __pos = begin() + __b;
622 std::rotate(__pos, end() - 1, end());
627 insert(const_iterator __position,
const _Tp& __x)
628 {
return emplace(__position, __x); }
631 insert(const_iterator __position, _Tp&& __x)
632 {
return emplace(__position,
std::move(__x)); }
635 insert(const_iterator __position, size_type __n,
const _Tp& __x)
637 size_t __b = __position - cbegin();
638 __glibcxx_assert(__b <= _M_size);
639 if ((_Nm - _M_size) < __n)
641 iterator __pos = begin() + __b;
643 if (std::__exchange(_M_size, _M_size + __n))
644 std::rotate(__pos, end() - __n, end());
648 template<__any_input_iterator _InputIterator>
650 insert(const_iterator __position, _InputIterator __first,
651 _InputIterator __last)
653 size_t __b = __position - cbegin();
654 __glibcxx_assert(__b <= _M_size);
655 iterator __pos = begin() + __b;
656 const size_t __s = _M_size;
657 if (
const auto __n = _S_distance(__first, __last))
659 if ((_Nm - _M_size) < __n)
666 while (__first != __last)
667 emplace_back(*__first++);
670 std::rotate(__pos, begin() + __s, end());
674 template<__detail::__container_compatible_range<_Tp> _Rg>
676 insert_range(const_iterator __position, _Rg&& __rg)
678 iterator __pos = begin() + (__position - cbegin());
679 const auto __end = end();
680 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
682 const auto __len = ranges::distance(__rg);
683 if (__len > (_Nm - size()))
685 if (!__len) [[unlikely]]
688 const size_type __n = size_type(__len);
689 const size_type __num_after = __end - __pos;
690 if (__num_after >= __n)
692 ranges::uninitialized_move(__end - __n, __end,
693 __end, unreachable_sentinel);
695 ranges::move_backward(__pos, __end - __n, __end);
696 ranges::copy(__rg, __pos);
698 else if constexpr (ranges::forward_range<_Rg>)
700 auto __mid = ranges::next(ranges::begin(__rg), __num_after);
701 ranges::uninitialized_copy(__mid, ranges::end(__rg),
702 __end, unreachable_sentinel);
703 _M_size += __n - __num_after;
704 ranges::uninitialized_move(__pos, __end,
705 __pos + __n, unreachable_sentinel);
706 _M_size += __num_after;
707 ranges::copy(ranges::begin(__rg), __mid, __pos);
711 ranges::uninitialized_copy(
712 ranges::begin(__rg), ranges::end(__rg),
713 __end, unreachable_sentinel);
715 std::rotate(__pos, __end, end());
721 std::rotate(__pos, __end, end());
727 insert(const_iterator __position, initializer_list<_Tp> __il)
728 {
return insert(__position, __il.begin(), __il.end()); }
731 erase(const_iterator __position)
733 size_t __n = __position - cbegin();
734 __glibcxx_assert(__n < _M_size);
735 iterator __pos = begin() + __n;
742 erase(const_iterator __first, const_iterator __last)
744 size_t __n = __first - cbegin();
745 size_t __x = __last - __first;
746 __glibcxx_assert(__n <= _M_size);
747 __glibcxx_assert(__x <= _M_size);
748 iterator __pos = begin() + __n;
749 iterator __end =
std::move(__pos + __x, end(), __pos);
750 std::destroy_n(__end, __x);
756 swap(inplace_vector& __x)
757 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
760 const auto __smaller = __vs[__x.size() < size()];
761 const auto __bigger = __vs[__x.size() >= size()];
762 size_type __n = __smaller->size();
763 size_type __n2 = __bigger->size();
765 if constexpr (is_nothrow_move_constructible_v<_Tp>)
767 for (size_type __i = __n; __i < __n2; ++__i)
769 std::construct_at(__smaller->data() + __i,
771 std::destroy_at(__bigger->data() + __i);
777 __bigger->data() + __n2,
778 __smaller->data() + __n);
779 std::destroy(__bigger->data() + __n, __bigger->data() + __n2);
781 __smaller->_M_size = __n2;
782 __bigger->_M_size = __n;
785 for (size_type __i = 0; __i < __n; __i++)
786 swap(_M_elems[__i], __x._M_elems[__i]);
792 std::destroy_n(data(),
size_t(_M_size));
796 constexpr friend bool
797 operator==(
const inplace_vector& __x,
const inplace_vector& __y)
798 {
return std::equal(__x.begin(), __x.end(), __y.begin(), __y.end()); }
800 constexpr friend auto
801 operator<=>(
const inplace_vector& __x,
const inplace_vector& __y)
802 requires requires (
const _Tp __t) {
803 { __t < __t } -> __detail::__boolean_testable;
807 __y.begin(), __y.end(),
808 __detail::__synth3way);
812 constexpr friend void
813 swap(inplace_vector& __x, inplace_vector& __y)
814 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
824 template<
typename _UInt,
bool = (alignof(_Tp) <= sizeof(_UInt))>
825 static constexpr
bool __fits
826 = _Nm <= __gnu_cxx::__
int_traits<_UInt>::__max;
830 template<
typename _UInt>
831 static constexpr bool __fits<_UInt, false> =
false;
833 static consteval auto __select_size_type()
835 if constexpr (__fits<unsigned char>)
836 return (
unsigned char)0;
837#if __SHRT_WIDTH__ < __SIZE_WIDTH__
838 else if constexpr (__fits<unsigned short>)
839 return (
unsigned short)0;
841#if __INT_WIDTH__ < __SIZE_WIDTH__ && __INT_WIDTH__ > __SHRT_WIDTH__
842 else if constexpr (__fits<unsigned int>)
845#if __LONG_WIDTH__ < __SIZE_WIDTH__ && __LONG_WIDTH__ > __INT_WIDTH__
846 else if constexpr (__fits<unsigned long>)
852 decltype(__select_size_type()) _M_size = 0;
857#if __glibcxx_start_lifetime
858 std::start_lifetime(_M_elems);
862 if constexpr (is_trivially_default_constructible_v<_Tp>
863 && is_trivially_copyable_v<_Tp>)
864 for (
size_t __i = 0; __i < _Nm; ++__i)
865 _M_elems[__i] = _Tp();
867# if __has_builtin(__builtin_constexpr_diag)
868 __builtin_constexpr_diag(2,
"",
869 "std::inplace_vector supports only trivally copyable and "
870 "trivially default constructible types at compile time");
872 __builtin_unreachable();
878 static constexpr void
879 _S_reserve(
size_t __n)
885 template<
typename _InputIterator>
886 constexpr static auto
887 _S_distance(_InputIterator __first, _InputIterator __last)
889 if constexpr (sized_sentinel_for<_InputIterator, _InputIterator>
890 || forward_iterator<_InputIterator>)
891 return (size_type)ranges::distance(__first, __last);
892 else if constexpr (derived_from<__iter_category_t<_InputIterator>,
893 forward_iterator_tag>)
902 template<
typename _Tp>
903 class inplace_vector<_Tp, 0>
907 using value_type = _Tp;
908 using pointer = _Tp*;
909 using const_pointer =
const _Tp*;
910 using reference = value_type&;
911 using const_reference =
const value_type&;
912 using size_type = size_t;
913 using difference_type = ptrdiff_t;
915 = __gnu_cxx::__normal_iterator<_Tp*, inplace_vector>;
917 = __gnu_cxx::__normal_iterator<const _Tp*, inplace_vector>;
918 using reverse_iterator = std::reverse_iterator<iterator>;
919 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
922 inplace_vector() =
default;
925 inplace_vector(size_type __n)
932 inplace_vector(size_type __n,
const _Tp& __value)
938 template<__any_input_iterator _InputIterator>
940 inplace_vector(_InputIterator __first, _InputIterator __last)
942 if (__first != __last)
946 template <__detail::__container_compatible_range<_Tp> _Rg>
948 inplace_vector(from_range_t, _Rg&& __rg)
952 if constexpr (ranges::__static_sized_range<_Rg>)
953 static_assert(ranges::size(__rg) == 0);
955 if (ranges::begin(__rg) != ranges::end(__rg))
960 inplace_vector(initializer_list<_Tp> __il)
962 if (__il.size() != 0)
966 inplace_vector(
const inplace_vector&) =
default;
967 inplace_vector(inplace_vector&&) =
default;
970 ~inplace_vector() =
default;
973 operator=(
const inplace_vector&) =
default;
976 operator=(inplace_vector&&) =
default;
978 constexpr inplace_vector&
979 operator=(initializer_list<_Tp> __il)
981 if (__il.size() != 0)
986 template<__any_input_iterator _InputIterator>
988 assign(_InputIterator __first, _InputIterator __last)
990 if (__first != __last)
994 template<__detail::__container_compatible_range<_Tp> _Rg>
996 assign_range(_Rg&& __rg)
998 if (ranges::begin(__rg) != ranges::end(__rg))
1003 assign(size_type __n,
const _Tp& __u)
1006 __throw_bad_alloc();
1010 assign(initializer_list<_Tp> __il)
1012 if (__il.size() != 0)
1013 __throw_bad_alloc();
1019 begin() noexcept {
return iterator(
nullptr); }
1022 constexpr const_iterator
1023 begin() const noexcept {
return const_iterator(
nullptr); }
1027 end() noexcept {
return iterator(
nullptr); }
1030 constexpr const_iterator
1031 end() const noexcept {
return const_iterator(
nullptr); }
1034 constexpr reverse_iterator
1036 {
return reverse_iterator(end()); }
1039 constexpr const_reverse_iterator
1040 rbegin() const noexcept
1041 {
return const_reverse_iterator(end()); }
1044 constexpr reverse_iterator
1045 rend() noexcept {
return reverse_iterator(begin()); }
1048 constexpr const_reverse_iterator
1049 rend() const noexcept {
return const_reverse_iterator(begin()); }
1052 constexpr const_iterator
1053 cbegin() const noexcept {
return begin(); }
1056 constexpr const_iterator
1057 cend() const noexcept {
return end(); }
1060 constexpr const_reverse_iterator
1061 crbegin() const noexcept {
return rbegin(); }
1064 constexpr const_reverse_iterator
1065 crend() const noexcept {
return rend(); }
1070 empty() const noexcept {
return true; }
1074 size() const noexcept {
return 0; }
1077 static constexpr size_type
1078 max_size() noexcept {
return 0; }
1081 static constexpr size_type
1082 capacity() noexcept {
return 0; }
1085 resize(size_type __n)
1088 __throw_bad_alloc();
1092 resize(size_type __n,
const _Tp&)
1095 __throw_bad_alloc();
1098 static constexpr void
1099 reserve(size_type __n)
1102 __throw_bad_alloc();
1105 static constexpr void
1109 [[nodiscard,noreturn]]
1111 operator[](size_type)
1112 { __builtin_trap(); }
1114 [[nodiscard,noreturn]]
1115 constexpr const_reference
1116 operator[](size_type)
const
1117 { __builtin_trap(); }
1119 [[nodiscard,noreturn]]
1120 constexpr const_reference
1121 at(size_type __n)
const
1123 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1125 ">= size() (which is 0)"),
1129 [[nodiscard,noreturn]]
1133 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1135 ">= size() (which is 0)"),
1139 [[nodiscard,noreturn]]
1142 { __builtin_trap(); }
1144 [[nodiscard,noreturn]]
1145 constexpr const_reference
1147 { __builtin_trap(); }
1149 [[nodiscard,noreturn]]
1152 { __builtin_trap(); }
1154 [[nodiscard,noreturn]]
1155 constexpr const_reference
1157 { __builtin_trap(); }
1167 constexpr const _Tp*
1168 data() const noexcept
1172 template<
typename... _Args>
1175 emplace_back(_Args&&...)
1176 { __throw_bad_alloc(); }
1180 push_back(
const _Tp&)
1181 { __throw_bad_alloc(); }
1186 { __throw_bad_alloc(); }
1188 template<__detail::__container_compatible_range<_Tp> _Rg>
1190 append_range(_Rg&& __rg)
1192 if (ranges::begin(__rg) != ranges::end(__rg))
1193 __throw_bad_alloc();
1199 { __builtin_trap(); }
1201 template<
typename... _Args>
1202 constexpr optional<_Tp&>
1203 try_emplace_back(_Args&&...)
1206 constexpr optional<_Tp&>
1207 try_push_back(
const _Tp&)
1210 constexpr optional<_Tp&>
1211 try_push_back(_Tp&&)
1214 template<
typename... _Args>
1217 unchecked_emplace_back(_Args&&...)
1218 { __builtin_trap(); }
1222 unchecked_push_back(
const _Tp&)
1223 { __builtin_trap(); }
1227 unchecked_push_back(_Tp&&)
1228 { __builtin_trap(); }
1230 template<
typename... _Args>
1233 emplace(const_iterator, _Args&&...)
1234 { __throw_bad_alloc(); }
1238 insert(const_iterator,
const _Tp&)
1239 { __throw_bad_alloc(); }
1243 insert(const_iterator, _Tp&&)
1244 { __throw_bad_alloc(); }
1247 insert(const_iterator, size_type __n,
const _Tp&)
1250 __throw_bad_alloc();
1254 template<
typename _InputIterator>
1256 insert(const_iterator, _InputIterator __first, _InputIterator __last)
1258 if (__first != __last)
1259 __throw_bad_alloc();
1263 template<__detail::__container_compatible_range<_Tp> _Rg>
1265 insert_range(const_iterator, _Rg&& __rg)
1267 if (ranges::begin(__rg) != ranges::end(__rg))
1268 __throw_bad_alloc();
1273 insert(const_iterator, initializer_list<_Tp> __il)
1275 if (__il.size() != 0)
1276 __throw_bad_alloc();
1282 erase(const_iterator)
1283 { __builtin_trap(); }
1286 erase(const_iterator __first, const_iterator __last)
1288 __glibcxx_assert(__first == __last);
1293 swap(inplace_vector& __x)
1301 constexpr friend bool
1302 operator==(
const inplace_vector&,
const inplace_vector&)
1305 constexpr friend auto
1306 operator<=>(
const inplace_vector&,
const inplace_vector&)
1307 requires requires (
const _Tp __t) {
1308 { __t < __t } -> __detail::__boolean_testable;
1310 {
return std::strong_ordering::equal; }
1316 constexpr friend void
1317 swap(inplace_vector&, inplace_vector&)
noexcept
1321_GLIBCXX_END_NAMESPACE_CONTAINER
1323 template<
typename _Tp,
size_t _Nm,
typename _Predicate>
1325 erase_if(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
1328 if constexpr (_Nm != 0)
1329 return __detail::__erase_if(__cont, __cont,
std::move(__pred));
1334 template<
typename _Tp,
size_t _Nm,
typename _Up = _Tp>
1336 erase(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
const _Up& __value)
1337 {
return std::erase_if(__cont, __gnu_cxx::__ops::__equal_to(__value)); }
1339_GLIBCXX_END_NAMESPACE_VERSION
1342#ifdef _GLIBCXX_DEBUG
1343# include <debug/inplace_vector>
constexpr _ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __count)
Value-initializes objects in the range [first,first+count).
constexpr _ForwardIterator uninitialized_move(_InputIterator __first, _InputIterator __last, _ForwardIterator __result)
Move-construct from the range [first,last) into result.
constexpr _ForwardIterator uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp &__x)
Copies the value x into the range [first,first+n).
constexpr _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.
constexpr nullopt_t nullopt
Tag to disengage optional objects.
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)