30#ifndef _GLIBCXX_INPLACE_VECTOR
31#define _GLIBCXX_INPLACE_VECTOR 1
33#pragma GCC system_header
35#define __glibcxx_want_hardened_inplace_vector
36#define __glibcxx_want_inplace_vector
39#ifdef __glibcxx_inplace_vector
53namespace std _GLIBCXX_VISIBILITY(default)
55_GLIBCXX_BEGIN_NAMESPACE_VERSION
56_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
59 template<
typename _Tp,
size_t _Nm>
65 using value_type = _Tp;
67 using const_pointer =
const _Tp*;
68 using reference = value_type&;
69 using const_reference =
const value_type&;
70 using size_type = size_t;
71 using difference_type = ptrdiff_t;
73 = __gnu_cxx::__normal_iterator<_Tp*, inplace_vector>;
75 = __gnu_cxx::__normal_iterator<const _Tp*, inplace_vector>;
76 using reverse_iterator = std::reverse_iterator<iterator>;
77 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
81 inplace_vector() noexcept
85 inplace_vector(size_type __n)
94 inplace_vector(size_type __n,
const _Tp& __value)
102 template<__any_input_iterator _InputIterator>
104 inplace_vector(_InputIterator __first, _InputIterator __last)
107 if (
const auto __n = _S_distance(__first, __last))
115 while (__first != __last)
116 emplace_back(*__first++);
120 template <__detail::__container_compatible_range<_Tp> _Rg>
122 inplace_vector(from_range_t, _Rg&& __rg)
127 if constexpr (ranges::__static_sized_range<_Rg>)
128 static_assert(ranges::size(__rg) <= _Nm);
134 inplace_vector(initializer_list<_Tp> __il)
137 _S_reserve(__il.size());
139 _M_size = __il.size();
142 inplace_vector(
const inplace_vector&)
143 requires is_trivially_copy_constructible_v<_Tp>
147 inplace_vector(
const inplace_vector& __other)
148 noexcept(is_nothrow_copy_constructible_v<_Tp>)
152 _M_size = __other.size();
155 inplace_vector(inplace_vector&&)
156 requires is_trivially_move_constructible_v<_Tp>
160 inplace_vector(inplace_vector&& __other)
161 noexcept(is_nothrow_move_constructible_v<_Tp>)
165 _M_size = __other.size();
169 requires is_trivially_destructible_v<_Tp>
177 operator=(
const inplace_vector&)
178 requires is_trivially_copy_assignable_v<_Tp>
179 && is_trivially_copy_constructible_v<_Tp>
180 && is_trivially_destructible_v<_Tp>
183 constexpr inplace_vector&
184 operator=(
const inplace_vector& __other)
185 noexcept(is_nothrow_copy_assignable_v<_Tp>
186 && is_nothrow_copy_constructible_v<_Tp>)
189 assign(__other.begin(), __other.end());
194 operator=(inplace_vector&&)
195 requires is_trivially_move_assignable_v<_Tp>
196 && is_trivially_move_constructible_v<_Tp>
197 && is_trivially_destructible_v<_Tp>
200 constexpr inplace_vector&
201 operator=(inplace_vector&& __other)
202 noexcept(is_nothrow_move_assignable_v<_Tp>
203 && is_nothrow_move_constructible_v<_Tp>)
206 assign(std::make_move_iterator(__other.begin()),
207 std::make_move_iterator(__other.end()));
211 constexpr inplace_vector&
212 operator=(initializer_list<_Tp> __il)
214 assign(__il.begin(), __il.end());
218 template<__any_input_iterator _InputIterator>
220 assign(_InputIterator __first, _InputIterator __last)
222 if (
const auto __n = _S_distance(__first, __last))
227 for (
size_t __i = 0; __i < _M_size; ++__i, (void)++__first)
228 _M_elems[__i] = *__first;
232 std::destroy(std::copy(__first, __last, begin()), end());
238 for (;__first != __last && __i < _M_size; ++__first)
239 _M_elems[__i++] = *__first;
240 if (__first == __last)
247 while (__first != __last)
248 emplace_back(*__first++);
253 template<__detail::__container_compatible_range<_Tp> _Rg>
255 assign_range(_Rg&& __rg)
257 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
259 const auto __len = ranges::distance(__rg);
263 const size_t __sz = size_t(__len);
266 ranges::copy_n(ranges::begin(__rg), __sz, data());
267 std::destroy(data() + __sz, data() + _M_size);
271 auto [__in, __out] = ranges::copy_n(
272 ranges::begin(__rg), _M_size,
274 ranges::uninitialized_copy(
276 __out, unreachable_sentinel);
282 auto __in = ranges::begin(__rg);
283 auto __end = ranges::end(__rg);
285 for (; __n < _M_size && __in != __end; ++__in)
286 _M_elems[__n++] = *__in;
290 std::destroy(data() + __n, data() + _M_size);
296 auto __res = ranges::uninitialized_copy(
298 data() + __n, data() + _Nm);
299 _M_size = __res.out - data();
300 if (__res.in == ranges::end(__rg))
308 assign(size_type __n,
const _Tp& __u)
315 std::destroy_n(std::fill_n(data(), __n, __u), _M_size - __n);
320 assign(initializer_list<_Tp> __il)
321 { assign(__il.begin(), __il.end()); }
326 begin() noexcept {
return iterator(data()); }
329 constexpr const_iterator
330 begin() const noexcept {
return const_iterator(data()); }
335 {
return iterator(data() + _M_size); }
338 constexpr const_iterator
340 {
return const_iterator(data() + _M_size); }
343 constexpr reverse_iterator
345 {
return reverse_iterator(end()); }
348 constexpr const_reverse_iterator
349 rbegin() const noexcept
350 {
return const_reverse_iterator(end()); }
353 constexpr reverse_iterator
354 rend() noexcept {
return reverse_iterator(begin()); }
357 constexpr const_reverse_iterator
358 rend() const noexcept {
return const_reverse_iterator(begin()); }
361 constexpr const_iterator
362 cbegin() const noexcept {
return begin(); }
365 constexpr const_iterator
366 cend() const noexcept {
return end(); }
369 constexpr const_reverse_iterator
370 crbegin() const noexcept {
return rbegin(); }
373 constexpr const_reverse_iterator
374 crend() const noexcept {
return rend(); }
379 empty() const noexcept {
return _M_size == 0; }
383 size() const noexcept
386 __builtin_unreachable();
391 static constexpr size_type
392 max_size() noexcept {
return _Nm; }
395 static constexpr size_type
396 capacity() noexcept {
return _Nm; }
399 resize(size_type __n)
404 else if (__n < _M_size)
405 std::destroy_n(data() + __n, _M_size - __n);
410 resize(size_type __n,
const _Tp& __c)
415 else if (__n < _M_size)
416 std::destroy_n(data() + __n, _M_size - __n);
420 static constexpr void
421 reserve(size_type __n)
424 static constexpr void
430 operator[](size_type __n)
432 __glibcxx_requires_subscript(__n);
433 return _M_elems[__n];
437 constexpr const_reference
438 operator[](size_type __n)
const
440 __glibcxx_requires_subscript(__n);
441 return _M_elems[__n];
445 constexpr const_reference
446 at(size_type __n)
const
449 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
451 ">= size() (which is %zu)"),
453 return _M_elems[__n];
461 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
463 ">= size() (which is %zu)"),
465 return _M_elems[__n];
472 __glibcxx_requires_nonempty();
477 constexpr const_reference
480 __glibcxx_requires_nonempty();
488 __glibcxx_requires_nonempty();
489 return _M_elems[_M_size - 1];
493 constexpr const_reference
496 __glibcxx_requires_nonempty();
497 return _M_elems[_M_size - 1];
505 {
return static_cast<pointer
>(_M_elems); }
509 data() const noexcept
510 {
return static_cast<const_pointer
>(_M_elems); }
513 template<
typename... _Args>
515 emplace_back(_Args&&... __args)
523 push_back(
const _Tp& __x)
524 {
return emplace_back(__x); }
530 template<__detail::__container_compatible_range<_Tp> _Rg>
532 append_range(_Rg&& __rg)
534 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
536 const auto __len = ranges::distance(__rg);
537 if (__len > (_Nm - size()))
540 const size_t __sz = size_t(__len);
542 ranges::uninitialized_copy(
543 ranges::begin(__rg), unreachable_sentinel,
544 data() + _M_size, data() + _M_size + __sz);
545 _M_size += size_type(__sz);
549 ranges::subrange<pointer> __tail(data() + _M_size, data() + _Nm);
550 auto [__in, __out] = ranges::uninitialized_copy(__rg, __tail);
551 _M_size = __out - data();
552 if (__in != ranges::end(__rg))
560 __glibcxx_requires_nonempty();
562 _M_elems[_M_size].~_Tp();
565 template<
typename... _Args>
566 constexpr optional<_Tp&>
567 try_emplace_back(_Args&&... __args)
569 if (_M_size >= _Nm) [[unlikely]]
571 return optional<_Tp&>(in_place,
575 constexpr optional<_Tp&>
576 try_push_back(
const _Tp& __x)
578 if (_M_size >= _Nm) [[unlikely]]
580 return optional<_Tp&>(in_place, unchecked_emplace_back(__x));
583 constexpr optional<_Tp&>
584 try_push_back(_Tp&& __x)
586 if (_M_size >= _Nm) [[unlikely]]
588 return optional<_Tp&>(in_place, unchecked_emplace_back(
std::move(__x)));
591 template<
typename... _Args>
593 unchecked_emplace_back(_Args&&... __args)
595 __glibcxx_assert(_M_size < _Nm);
596 auto __p = std::construct_at(data() + _M_size,
603 unchecked_push_back(
const _Tp& __x)
604 {
return unchecked_emplace_back(__x); }
607 unchecked_push_back(_Tp&& __x)
608 {
return unchecked_emplace_back(
std::move(__x)); }
610 template<
typename... _Args>
612 emplace(const_iterator __position, _Args&&... __args)
614 size_t __b = __position - cbegin();
615 __glibcxx_assert(__b <= _M_size);
618 iterator __pos = begin() + __b;
621 std::rotate(__pos, end() - 1, end());
626 insert(const_iterator __position,
const _Tp& __x)
627 {
return emplace(__position, __x); }
630 insert(const_iterator __position, _Tp&& __x)
631 {
return emplace(__position,
std::move(__x)); }
634 insert(const_iterator __position, size_type __n,
const _Tp& __x)
636 size_t __b = __position - cbegin();
637 __glibcxx_assert(__b <= _M_size);
638 if ((_Nm - _M_size) < __n)
640 iterator __pos = begin() + __b;
642 if (std::__exchange(_M_size, _M_size + __n))
643 std::rotate(__pos, end() - __n, end());
647 template<__any_input_iterator _InputIterator>
649 insert(const_iterator __position, _InputIterator __first,
650 _InputIterator __last)
652 size_t __b = __position - cbegin();
653 __glibcxx_assert(__b <= _M_size);
654 iterator __pos = begin() + __b;
655 const size_t __s = _M_size;
656 if (
const auto __n = _S_distance(__first, __last))
658 if ((_Nm - _M_size) < __n)
665 while (__first != __last)
666 emplace_back(*__first++);
669 std::rotate(__pos, begin() + __s, end());
673 template<__detail::__container_compatible_range<_Tp> _Rg>
675 insert_range(const_iterator __position, _Rg&& __rg)
677 iterator __pos = begin() + (__position - cbegin());
678 const auto __end = end();
679 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
681 const auto __len = ranges::distance(__rg);
682 if (__len > (_Nm - size()))
684 if (!__len) [[unlikely]]
687 const size_type __n = size_type(__len);
688 const size_type __num_after = __end - __pos;
689 if (__num_after >= __n)
691 ranges::uninitialized_move(__end - __n, __end,
692 __end, unreachable_sentinel);
694 ranges::move_backward(__pos, __end - __n, __end);
695 ranges::copy(__rg, __pos);
697 else if constexpr (ranges::forward_range<_Rg>)
699 auto __mid = ranges::next(ranges::begin(__rg), __num_after);
700 ranges::uninitialized_copy(__mid, ranges::end(__rg),
701 __end, unreachable_sentinel);
702 _M_size += __n - __num_after;
703 ranges::uninitialized_move(__pos, __end,
704 __pos + __n, unreachable_sentinel);
705 _M_size += __num_after;
706 ranges::copy(ranges::begin(__rg), __mid, __pos);
710 ranges::uninitialized_copy(
711 ranges::begin(__rg), ranges::end(__rg),
712 __end, unreachable_sentinel);
714 std::rotate(__pos, __end, end());
720 std::rotate(__pos, __end, end());
726 insert(const_iterator __position, initializer_list<_Tp> __il)
727 {
return insert(__position, __il.begin(), __il.end()); }
730 erase(const_iterator __position)
732 size_t __n = __position - cbegin();
733 __glibcxx_assert(__n < _M_size);
734 iterator __pos = begin() + __n;
741 erase(const_iterator __first, const_iterator __last)
743 size_t __n = __first - cbegin();
744 size_t __x = __last - __first;
745 __glibcxx_assert(__n <= _M_size);
746 __glibcxx_assert(__x <= _M_size);
747 iterator __pos = begin() + __n;
748 iterator __end =
std::move(__pos + __x, end(), __pos);
749 std::destroy_n(__end, __x);
755 swap(inplace_vector& __x)
756 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
759 const auto __smaller = __vs[__x.size() < size()];
760 const auto __bigger = __vs[__x.size() >= size()];
761 size_type __n = __smaller->size();
762 size_type __n2 = __bigger->size();
764 if constexpr (is_nothrow_move_constructible_v<_Tp>)
766 for (size_type __i = __n; __i < __n2; ++__i)
768 std::construct_at(__smaller->data() + __i,
770 std::destroy_at(__bigger->data() + __i);
776 __bigger->data() + __n2,
777 __smaller->data() + __n);
778 std::destroy(__bigger->data() + __n, __bigger->data() + __n2);
780 __smaller->_M_size = __n2;
781 __bigger->_M_size = __n;
784 for (size_type __i = 0; __i < __n; __i++)
785 swap(_M_elems[__i], __x._M_elems[__i]);
791 std::destroy_n(data(),
size_t(_M_size));
795 constexpr friend bool
796 operator==(
const inplace_vector& __x,
const inplace_vector& __y)
797 {
return std::equal(__x.begin(), __x.end(), __y.begin(), __y.end()); }
799 constexpr friend auto
800 operator<=>(
const inplace_vector& __x,
const inplace_vector& __y)
801 requires requires (
const _Tp __t) {
802 { __t < __t } -> __detail::__boolean_testable;
806 __y.begin(), __y.end(),
807 __detail::__synth3way);
811 constexpr friend void
812 swap(inplace_vector& __x, inplace_vector& __y)
813 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
823 template<
typename _UInt,
bool = (alignof(_Tp) <= sizeof(_UInt))>
824 static constexpr
bool __fits
825 = _Nm <= __gnu_cxx::__
int_traits<_UInt>::__max;
829 template<
typename _UInt>
830 static constexpr bool __fits<_UInt, false> =
false;
832 static consteval auto __select_size_type()
834 if constexpr (__fits<unsigned char>)
835 return (
unsigned char)0;
836#if __SHRT_WIDTH__ < __SIZE_WIDTH__
837 else if constexpr (__fits<unsigned short>)
838 return (
unsigned short)0;
840#if __INT_WIDTH__ < __SIZE_WIDTH__ && __INT_WIDTH__ > __SHRT_WIDTH__
841 else if constexpr (__fits<unsigned int>)
844#if __LONG_WIDTH__ < __SIZE_WIDTH__ && __LONG_WIDTH__ > __INT_WIDTH__
845 else if constexpr (__fits<unsigned long>)
851 decltype(__select_size_type()) _M_size = 0;
858#if __glibcxx_start_lifetime_as
859 std::start_lifetime_as_array<_Tp>(data(), _Nm);
865 if constexpr (is_trivial_v<_Tp>)
866 for (
size_t __i = 0; __i < _Nm; ++__i)
867 _M_elems[__i] = _Tp();
869 __builtin_unreachable();
873 static constexpr void
874 _S_reserve(
size_t __n)
880 template<
typename _InputIterator>
881 constexpr static auto
882 _S_distance(_InputIterator __first, _InputIterator __last)
884 if constexpr (sized_sentinel_for<_InputIterator, _InputIterator>
885 || forward_iterator<_InputIterator>)
886 return (size_type)ranges::distance(__first, __last);
887 else if constexpr (derived_from<__iter_category_t<_InputIterator>,
888 forward_iterator_tag>)
897 template<
typename _Tp>
898 class inplace_vector<_Tp, 0>
902 using value_type = _Tp;
903 using pointer = _Tp*;
904 using const_pointer =
const _Tp*;
905 using reference = value_type&;
906 using const_reference =
const value_type&;
907 using size_type = size_t;
908 using difference_type = ptrdiff_t;
910 = __gnu_cxx::__normal_iterator<_Tp*, inplace_vector>;
912 = __gnu_cxx::__normal_iterator<const _Tp*, inplace_vector>;
913 using reverse_iterator = std::reverse_iterator<iterator>;
914 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
917 inplace_vector() =
default;
920 inplace_vector(size_type __n)
927 inplace_vector(size_type __n,
const _Tp& __value)
933 template<__any_input_iterator _InputIterator>
935 inplace_vector(_InputIterator __first, _InputIterator __last)
937 if (__first != __last)
941 template <__detail::__container_compatible_range<_Tp> _Rg>
943 inplace_vector(from_range_t, _Rg&& __rg)
947 if constexpr (ranges::__static_sized_range<_Rg>)
948 static_assert(ranges::size(__rg) == 0);
950 if (ranges::begin(__rg) != ranges::end(__rg))
955 inplace_vector(initializer_list<_Tp> __il)
957 if (__il.size() != 0)
961 inplace_vector(
const inplace_vector&) =
default;
962 inplace_vector(inplace_vector&&) =
default;
965 ~inplace_vector() =
default;
968 operator=(
const inplace_vector&) =
default;
971 operator=(inplace_vector&&) =
default;
973 constexpr inplace_vector&
974 operator=(initializer_list<_Tp> __il)
976 if (__il.size() != 0)
981 template<__any_input_iterator _InputIterator>
983 assign(_InputIterator __first, _InputIterator __last)
985 if (__first != __last)
989 template<__detail::__container_compatible_range<_Tp> _Rg>
991 assign_range(_Rg&& __rg)
993 if (ranges::begin(__rg) != ranges::end(__rg))
998 assign(size_type __n,
const _Tp& __u)
1001 __throw_bad_alloc();
1005 assign(initializer_list<_Tp> __il)
1007 if (__il.size() != 0)
1008 __throw_bad_alloc();
1014 begin() noexcept {
return iterator(
nullptr); }
1017 constexpr const_iterator
1018 begin() const noexcept {
return const_iterator(
nullptr); }
1022 end() noexcept {
return iterator(
nullptr); }
1025 constexpr const_iterator
1026 end() const noexcept {
return const_iterator(
nullptr); }
1029 constexpr reverse_iterator
1031 {
return reverse_iterator(end()); }
1034 constexpr const_reverse_iterator
1035 rbegin() const noexcept
1036 {
return const_reverse_iterator(end()); }
1039 constexpr reverse_iterator
1040 rend() noexcept {
return reverse_iterator(begin()); }
1043 constexpr const_reverse_iterator
1044 rend() const noexcept {
return const_reverse_iterator(begin()); }
1047 constexpr const_iterator
1048 cbegin() const noexcept {
return begin(); }
1051 constexpr const_iterator
1052 cend() const noexcept {
return end(); }
1055 constexpr const_reverse_iterator
1056 crbegin() const noexcept {
return rbegin(); }
1059 constexpr const_reverse_iterator
1060 crend() const noexcept {
return rend(); }
1065 empty() const noexcept {
return true; }
1069 size() const noexcept {
return 0; }
1072 static constexpr size_type
1073 max_size() noexcept {
return 0; }
1076 static constexpr size_type
1077 capacity() noexcept {
return 0; }
1080 resize(size_type __n)
1083 __throw_bad_alloc();
1087 resize(size_type __n,
const _Tp&)
1090 __throw_bad_alloc();
1093 static constexpr void
1094 reserve(size_type __n)
1097 __throw_bad_alloc();
1100 static constexpr void
1104 [[nodiscard,noreturn]]
1106 operator[](size_type)
1107 { __builtin_trap(); }
1109 [[nodiscard,noreturn]]
1110 constexpr const_reference
1111 operator[](size_type)
const
1112 { __builtin_trap(); }
1114 [[nodiscard,noreturn]]
1115 constexpr const_reference
1116 at(size_type __n)
const
1118 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1120 ">= size() (which is 0)"),
1124 [[nodiscard,noreturn]]
1128 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1130 ">= size() (which is 0)"),
1134 [[nodiscard,noreturn]]
1137 { __builtin_trap(); }
1139 [[nodiscard,noreturn]]
1140 constexpr const_reference
1142 { __builtin_trap(); }
1144 [[nodiscard,noreturn]]
1147 { __builtin_trap(); }
1149 [[nodiscard,noreturn]]
1150 constexpr const_reference
1152 { __builtin_trap(); }
1162 constexpr const _Tp*
1163 data() const noexcept
1167 template<
typename... _Args>
1170 emplace_back(_Args&&...)
1171 { __throw_bad_alloc(); }
1175 push_back(
const _Tp&)
1176 { __throw_bad_alloc(); }
1181 { __throw_bad_alloc(); }
1183 template<__detail::__container_compatible_range<_Tp> _Rg>
1185 append_range(_Rg&& __rg)
1187 if (ranges::begin(__rg) != ranges::end(__rg))
1188 __throw_bad_alloc();
1194 { __builtin_trap(); }
1196 template<
typename... _Args>
1197 constexpr optional<_Tp&>
1198 try_emplace_back(_Args&&...)
1201 constexpr optional<_Tp&>
1202 try_push_back(
const _Tp&)
1205 constexpr optional<_Tp&>
1206 try_push_back(_Tp&&)
1209 template<
typename... _Args>
1212 unchecked_emplace_back(_Args&&...)
1213 { __builtin_trap(); }
1217 unchecked_push_back(
const _Tp&)
1218 { __builtin_trap(); }
1222 unchecked_push_back(_Tp&&)
1223 { __builtin_trap(); }
1225 template<
typename... _Args>
1228 emplace(const_iterator, _Args&&...)
1229 { __throw_bad_alloc(); }
1233 insert(const_iterator,
const _Tp&)
1234 { __throw_bad_alloc(); }
1238 insert(const_iterator, _Tp&&)
1239 { __throw_bad_alloc(); }
1242 insert(const_iterator, size_type __n,
const _Tp&)
1245 __throw_bad_alloc();
1249 template<
typename _InputIterator>
1251 insert(const_iterator, _InputIterator __first, _InputIterator __last)
1253 if (__first != __last)
1254 __throw_bad_alloc();
1258 template<__detail::__container_compatible_range<_Tp> _Rg>
1260 insert_range(const_iterator, _Rg&& __rg)
1262 if (ranges::begin(__rg) != ranges::end(__rg))
1263 __throw_bad_alloc();
1268 insert(const_iterator, initializer_list<_Tp> __il)
1270 if (__il.size() != 0)
1271 __throw_bad_alloc();
1277 erase(const_iterator)
1278 { __builtin_trap(); }
1281 erase(const_iterator __first, const_iterator __last)
1283 __glibcxx_assert(__first == __last);
1288 swap(inplace_vector& __x)
1296 constexpr friend bool
1297 operator==(
const inplace_vector&,
const inplace_vector&)
1300 constexpr friend auto
1301 operator<=>(
const inplace_vector&,
const inplace_vector&)
1302 requires requires (
const _Tp __t) {
1303 { __t < __t } -> __detail::__boolean_testable;
1305 {
return std::strong_ordering::equal; }
1311 constexpr friend void
1312 swap(inplace_vector&, inplace_vector&)
noexcept
1316_GLIBCXX_END_NAMESPACE_CONTAINER
1318 template<
typename _Tp,
size_t _Nm,
typename _Predicate>
1320 erase_if(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
1323 if constexpr (_Nm != 0)
1324 return __detail::__erase_if(__cont, __cont,
std::move(__pred));
1329 template<
typename _Tp,
size_t _Nm,
typename _Up = _Tp>
1331 erase(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
const _Up& __value)
1332 {
return std::erase_if(__cont, __gnu_cxx::__ops::__equal_to(__value)); }
1334_GLIBCXX_END_NAMESPACE_VERSION
1337#ifdef _GLIBCXX_DEBUG
1338# 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)