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
52namespace std _GLIBCXX_VISIBILITY(default)
54_GLIBCXX_BEGIN_NAMESPACE_VERSION
55_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
58 template<
typename _Tp,
size_t _Nm>
64 using value_type = _Tp;
66 using const_pointer =
const _Tp*;
67 using reference = value_type&;
68 using const_reference =
const value_type&;
69 using size_type = size_t;
70 using difference_type = ptrdiff_t;
72 = __gnu_cxx::__normal_iterator<_Tp*, inplace_vector>;
74 = __gnu_cxx::__normal_iterator<const _Tp*, inplace_vector>;
75 using reverse_iterator = std::reverse_iterator<iterator>;
76 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
80 inplace_vector() noexcept
84 inplace_vector(size_type __n)
93 inplace_vector(size_type __n,
const _Tp& __value)
101 template<__any_input_iterator _InputIterator>
103 inplace_vector(_InputIterator __first, _InputIterator __last)
106 if (
const auto __n = _S_distance(__first, __last))
114 while (__first != __last)
115 emplace_back(*__first++);
119 template <__detail::__container_compatible_range<_Tp> _Rg>
121 inplace_vector(from_range_t, _Rg&& __rg)
126 if constexpr (ranges::__static_sized_range<_Rg>)
127 static_assert(ranges::size(__rg) <= _Nm);
133 inplace_vector(initializer_list<_Tp> __il)
136 _S_reserve(__il.size());
138 _M_size = __il.size();
141 inplace_vector(
const inplace_vector&)
142 requires is_trivially_copy_constructible_v<_Tp>
146 inplace_vector(
const inplace_vector& __other)
147 noexcept(is_nothrow_copy_constructible_v<_Tp>)
151 _M_size = __other.size();
154 inplace_vector(inplace_vector&&)
155 requires is_trivially_move_constructible_v<_Tp>
159 inplace_vector(inplace_vector&& __other)
160 noexcept(is_nothrow_move_constructible_v<_Tp>)
164 _M_size = __other.size();
168 requires is_trivially_destructible_v<_Tp>
176 operator=(
const inplace_vector&)
177 requires is_trivially_copy_assignable_v<_Tp>
178 && is_trivially_copy_constructible_v<_Tp>
179 && is_trivially_destructible_v<_Tp>
182 constexpr inplace_vector&
183 operator=(
const inplace_vector& __other)
184 noexcept(is_nothrow_copy_assignable_v<_Tp>
185 && is_nothrow_copy_constructible_v<_Tp>)
188 assign(__other.begin(), __other.end());
193 operator=(inplace_vector&&)
194 requires is_trivially_move_assignable_v<_Tp>
195 && is_trivially_move_constructible_v<_Tp>
196 && is_trivially_destructible_v<_Tp>
199 constexpr inplace_vector&
200 operator=(inplace_vector&& __other)
201 noexcept(is_nothrow_move_assignable_v<_Tp>
202 && is_nothrow_move_constructible_v<_Tp>)
205 assign(std::make_move_iterator(__other.begin()),
206 std::make_move_iterator(__other.end()));
210 constexpr inplace_vector&
211 operator=(initializer_list<_Tp> __il)
213 assign(__il.begin(), __il.end());
217 template<__any_input_iterator _InputIterator>
219 assign(_InputIterator __first, _InputIterator __last)
221 if (
const auto __n = _S_distance(__first, __last))
226 for (
size_t __i = 0; __i < _M_size; ++__i, (void)++__first)
227 _M_elems[__i] = *__first;
231 std::destroy(std::copy(__first, __last, begin()), end());
237 for (;__first != __last && __i < _M_size; ++__first)
238 _M_elems[__i++] = *__first;
239 if (__first == __last)
246 while (__first != __last)
247 emplace_back(*__first++);
252 template<__detail::__container_compatible_range<_Tp> _Rg>
254 assign_range(_Rg&& __rg)
256 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
258 const auto __len = ranges::distance(__rg);
262 const size_t __sz = size_t(__len);
265 ranges::copy_n(ranges::begin(__rg), __sz, data());
266 std::destroy(data() + __sz, data() + _M_size);
270 auto [__in, __out] = ranges::copy_n(
271 ranges::begin(__rg), _M_size,
273 ranges::uninitialized_copy(
275 __out, unreachable_sentinel);
281 auto __in = ranges::begin(__rg);
282 auto __end = ranges::end(__rg);
284 for (; __n < _M_size && __in != __end; ++__in)
285 _M_elems[__n++] = *__in;
289 std::destroy(data() + __n, data() + _M_size);
295 auto __res = ranges::uninitialized_copy(
297 data() + __n, data() + _Nm);
298 _M_size = __res.out - data();
299 if (__res.in == ranges::end(__rg))
307 assign(size_type __n,
const _Tp& __u)
314 std::destroy_n(std::fill_n(data(), __n, __u), _M_size - __n);
319 assign(initializer_list<_Tp> __il)
320 { assign(__il.begin(), __il.end()); }
325 begin() noexcept {
return iterator(data()); }
328 constexpr const_iterator
329 begin() const noexcept {
return const_iterator(data()); }
334 {
return iterator(data() + _M_size); }
337 constexpr const_iterator
339 {
return const_iterator(data() + _M_size); }
342 constexpr reverse_iterator
344 {
return reverse_iterator(end()); }
347 constexpr const_reverse_iterator
348 rbegin() const noexcept
349 {
return const_reverse_iterator(end()); }
352 constexpr reverse_iterator
353 rend() noexcept {
return reverse_iterator(begin()); }
356 constexpr const_reverse_iterator
357 rend() const noexcept {
return const_reverse_iterator(begin()); }
360 constexpr const_iterator
361 cbegin() const noexcept {
return begin(); }
364 constexpr const_iterator
365 cend() const noexcept {
return end(); }
368 constexpr const_reverse_iterator
369 crbegin() const noexcept {
return rbegin(); }
372 constexpr const_reverse_iterator
373 crend() const noexcept {
return rend(); }
378 empty() const noexcept {
return _M_size == 0; }
382 size() const noexcept
385 __builtin_unreachable();
390 static constexpr size_type
391 max_size() noexcept {
return _Nm; }
394 static constexpr size_type
395 capacity() noexcept {
return _Nm; }
398 resize(size_type __n)
403 else if (__n < _M_size)
404 std::destroy_n(data() + __n, _M_size - __n);
409 resize(size_type __n,
const _Tp& __c)
414 else if (__n < _M_size)
415 std::destroy_n(data() + __n, _M_size - __n);
419 static constexpr void
420 reserve(size_type __n)
423 static constexpr void
429 operator[](size_type __n)
431 __glibcxx_requires_subscript(__n);
432 return _M_elems[__n];
436 constexpr const_reference
437 operator[](size_type __n)
const
439 __glibcxx_requires_subscript(__n);
440 return _M_elems[__n];
444 constexpr const_reference
445 at(size_type __n)
const
448 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
450 ">= size() (which is %zu)"),
452 return _M_elems[__n];
460 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
462 ">= size() (which is %zu)"),
464 return _M_elems[__n];
471 __glibcxx_requires_nonempty();
476 constexpr const_reference
479 __glibcxx_requires_nonempty();
487 __glibcxx_requires_nonempty();
488 return _M_elems[_M_size - 1];
492 constexpr const_reference
495 __glibcxx_requires_nonempty();
496 return _M_elems[_M_size - 1];
504 {
return static_cast<pointer
>(_M_elems); }
508 data() const noexcept
509 {
return static_cast<const_pointer
>(_M_elems); }
512 template<
typename... _Args>
514 emplace_back(_Args&&... __args)
522 push_back(
const _Tp& __x)
523 {
return emplace_back(__x); }
529 template<__detail::__container_compatible_range<_Tp> _Rg>
531 append_range(_Rg&& __rg)
533 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
535 const auto __len = ranges::distance(__rg);
536 if (__len > (_Nm - size()))
539 const size_t __sz = size_t(__len);
541 ranges::uninitialized_copy(
542 ranges::begin(__rg), unreachable_sentinel,
543 data() + _M_size, data() + _M_size + __sz);
544 _M_size += size_type(__sz);
548 ranges::subrange<pointer> __tail(data() + _M_size, data() + _Nm);
549 auto [__in, __out] = ranges::uninitialized_copy(__rg, __tail);
550 _M_size = __out - data();
551 if (__in != ranges::end(__rg))
559 __glibcxx_requires_nonempty();
561 _M_elems[_M_size].~_Tp();
564 template<
typename... _Args>
565 constexpr optional<_Tp&>
566 try_emplace_back(_Args&&... __args)
568 if (_M_size >= _Nm) [[unlikely]]
570 return optional<_Tp&>(in_place,
574 constexpr optional<_Tp&>
575 try_push_back(
const _Tp& __x)
577 if (_M_size >= _Nm) [[unlikely]]
579 return optional<_Tp&>(in_place, unchecked_emplace_back(__x));
582 constexpr optional<_Tp&>
583 try_push_back(_Tp&& __x)
585 if (_M_size >= _Nm) [[unlikely]]
587 return optional<_Tp&>(in_place, unchecked_emplace_back(
std::move(__x)));
590 template<
typename... _Args>
592 unchecked_emplace_back(_Args&&... __args)
594 __glibcxx_assert(_M_size < _Nm);
595 auto __p = std::construct_at(data() + _M_size,
602 unchecked_push_back(
const _Tp& __x)
603 {
return unchecked_emplace_back(__x); }
606 unchecked_push_back(_Tp&& __x)
607 {
return unchecked_emplace_back(
std::move(__x)); }
609 template<
typename... _Args>
611 emplace(const_iterator __position, _Args&&... __args)
613 size_t __b = __position - cbegin();
614 __glibcxx_assert(__b <= _M_size);
617 iterator __pos = begin() + __b;
620 std::rotate(__pos, end() - 1, end());
625 insert(const_iterator __position,
const _Tp& __x)
626 {
return emplace(__position, __x); }
629 insert(const_iterator __position, _Tp&& __x)
630 {
return emplace(__position,
std::move(__x)); }
633 insert(const_iterator __position, size_type __n,
const _Tp& __x)
635 size_t __b = __position - cbegin();
636 __glibcxx_assert(__b <= _M_size);
637 if ((_Nm - _M_size) < __n)
639 iterator __pos = begin() + __b;
641 if (std::__exchange(_M_size, _M_size + __n))
642 std::rotate(__pos, end() - __n, end());
646 template<__any_input_iterator _InputIterator>
648 insert(const_iterator __position, _InputIterator __first,
649 _InputIterator __last)
651 size_t __b = __position - cbegin();
652 __glibcxx_assert(__b <= _M_size);
653 iterator __pos = begin() + __b;
654 const size_t __s = _M_size;
655 if (
const auto __n = _S_distance(__first, __last))
657 if ((_Nm - _M_size) < __n)
664 while (__first != __last)
665 emplace_back(*__first++);
668 std::rotate(__pos, begin() + __s, end());
672 template<__detail::__container_compatible_range<_Tp> _Rg>
674 insert_range(const_iterator __position, _Rg&& __rg)
676 iterator __pos = begin() + (__position - cbegin());
677 const auto __end = end();
678 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
680 const auto __len = ranges::distance(__rg);
681 if (__len > (_Nm - size()))
683 if (!__len) [[unlikely]]
686 const size_type __n = size_type(__len);
687 const size_type __num_after = __end - __pos;
688 if (__num_after >= __n)
690 ranges::uninitialized_move(__end - __n, __end,
691 __end, unreachable_sentinel);
693 ranges::move_backward(__pos, __end - __n, __end);
694 ranges::copy(__rg, __pos);
696 else if constexpr (ranges::forward_range<_Rg>)
698 auto __mid = ranges::next(ranges::begin(__rg), __num_after);
699 ranges::uninitialized_copy(__mid, ranges::end(__rg),
700 __end, unreachable_sentinel);
701 _M_size += __n - __num_after;
702 ranges::uninitialized_move(__pos, __end,
703 __pos + __n, unreachable_sentinel);
704 _M_size += __num_after;
705 ranges::copy(ranges::begin(__rg), __mid, __pos);
709 ranges::uninitialized_copy(
710 ranges::begin(__rg), ranges::end(__rg),
711 __end, unreachable_sentinel);
713 std::rotate(__pos, __end, end());
719 std::rotate(__pos, __end, end());
725 insert(const_iterator __position, initializer_list<_Tp> __il)
726 {
return insert(__position, __il.begin(), __il.end()); }
729 erase(const_iterator __position)
731 size_t __n = __position - cbegin();
732 __glibcxx_assert(__n < _M_size);
733 iterator __pos = begin() + __n;
740 erase(const_iterator __first, const_iterator __last)
742 size_t __n = __first - cbegin();
743 size_t __x = __last - __first;
744 __glibcxx_assert(__n <= _M_size);
745 __glibcxx_assert(__x <= _M_size);
746 iterator __pos = begin() + __n;
747 iterator __end =
std::move(__pos + __x, end(), __pos);
748 std::destroy_n(__end, __x);
754 swap(inplace_vector& __x)
755 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
758 const auto __smaller = __vs[__x.size() < size()];
759 const auto __bigger = __vs[__x.size() >= size()];
760 size_type __n = __smaller->size();
761 size_type __n2 = __bigger->size();
763 if constexpr (is_nothrow_move_constructible_v<_Tp>)
765 for (size_type __i = __n; __i < __n2; ++__i)
767 std::construct_at(__smaller->data() + __i,
769 std::destroy_at(__bigger->data() + __i);
775 __bigger->data() + __n2,
776 __smaller->data() + __n);
777 std::destroy(__bigger->data() + __n, __bigger->data() + __n2);
779 __smaller->_M_size = __n2;
780 __bigger->_M_size = __n;
783 for (size_type __i = 0; __i < __n; __i++)
784 swap(_M_elems[__i], __x._M_elems[__i]);
790 std::destroy_n(data(),
size_t(_M_size));
794 constexpr friend bool
795 operator==(
const inplace_vector& __x,
const inplace_vector& __y)
796 {
return std::equal(__x.begin(), __x.end(), __y.begin(), __y.end()); }
798 constexpr friend auto
799 operator<=>(
const inplace_vector& __x,
const inplace_vector& __y)
800 requires requires (
const _Tp __t) {
801 { __t < __t } -> __detail::__boolean_testable;
805 __y.begin(), __y.end(),
806 __detail::__synth3way);
810 constexpr friend void
811 swap(inplace_vector& __x, inplace_vector& __y)
812 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
822 template<
typename _UInt,
bool = (alignof(_Tp) <= sizeof(_UInt))>
823 static constexpr
bool __fits
824 = _Nm <= __gnu_cxx::__
int_traits<_UInt>::__max;
828 template<
typename _UInt>
829 static constexpr bool __fits<_UInt, false> =
false;
831 static consteval auto __select_size_type()
833 if constexpr (__fits<unsigned char>)
834 return (
unsigned char)0;
835#if __SHRT_WIDTH__ < __SIZE_WIDTH__
836 else if constexpr (__fits<unsigned short>)
837 return (
unsigned short)0;
839#if __INT_WIDTH__ < __SIZE_WIDTH__ && __INT_WIDTH__ > __SHRT_WIDTH__
840 else if constexpr (__fits<unsigned int>)
843#if __LONG_WIDTH__ < __SIZE_WIDTH__ && __LONG_WIDTH__ > __INT_WIDTH__
844 else if constexpr (__fits<unsigned long>)
850 decltype(__select_size_type()) _M_size = 0;
857#if __glibcxx_start_lifetime_as
858 std::start_lifetime_as_array<_Tp>(data(), _Nm);
864 if constexpr (is_trivial_v<_Tp>)
865 for (
size_t __i = 0; __i < _Nm; ++__i)
866 _M_elems[__i] = _Tp();
868 __builtin_unreachable();
872 static constexpr void
873 _S_reserve(
size_t __n)
879 template<
typename _InputIterator>
880 constexpr static auto
881 _S_distance(_InputIterator __first, _InputIterator __last)
883 if constexpr (sized_sentinel_for<_InputIterator, _InputIterator>
884 || forward_iterator<_InputIterator>)
885 return (size_type)ranges::distance(__first, __last);
886 else if constexpr (derived_from<__iter_category_t<_InputIterator>,
887 forward_iterator_tag>)
896 template<
typename _Tp>
897 class inplace_vector<_Tp, 0>
901 using value_type = _Tp;
902 using pointer = _Tp*;
903 using const_pointer =
const _Tp*;
904 using reference = value_type&;
905 using const_reference =
const value_type&;
906 using size_type = size_t;
907 using difference_type = ptrdiff_t;
909 = __gnu_cxx::__normal_iterator<_Tp*, inplace_vector>;
911 = __gnu_cxx::__normal_iterator<const _Tp*, inplace_vector>;
912 using reverse_iterator = std::reverse_iterator<iterator>;
913 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
916 inplace_vector() =
default;
919 inplace_vector(size_type __n)
926 inplace_vector(size_type __n,
const _Tp& __value)
932 template<__any_input_iterator _InputIterator>
934 inplace_vector(_InputIterator __first, _InputIterator __last)
936 if (__first != __last)
940 template <__detail::__container_compatible_range<_Tp> _Rg>
942 inplace_vector(from_range_t, _Rg&& __rg)
946 if constexpr (ranges::__static_sized_range<_Rg>)
947 static_assert(ranges::size(__rg) == 0);
949 if (ranges::begin(__rg) != ranges::end(__rg))
954 inplace_vector(initializer_list<_Tp> __il)
956 if (__il.size() != 0)
960 inplace_vector(
const inplace_vector&) =
default;
961 inplace_vector(inplace_vector&&) =
default;
964 ~inplace_vector() =
default;
967 operator=(
const inplace_vector&) =
default;
970 operator=(inplace_vector&&) =
default;
972 constexpr inplace_vector&
973 operator=(initializer_list<_Tp> __il)
975 if (__il.size() != 0)
980 template<__any_input_iterator _InputIterator>
982 assign(_InputIterator __first, _InputIterator __last)
984 if (__first != __last)
988 template<__detail::__container_compatible_range<_Tp> _Rg>
990 assign_range(_Rg&& __rg)
992 if (ranges::begin(__rg) != ranges::end(__rg))
997 assign(size_type __n,
const _Tp& __u)
1000 __throw_bad_alloc();
1004 assign(initializer_list<_Tp> __il)
1006 if (__il.size() != 0)
1007 __throw_bad_alloc();
1013 begin() noexcept {
return iterator(
nullptr); }
1016 constexpr const_iterator
1017 begin() const noexcept {
return const_iterator(
nullptr); }
1021 end() noexcept {
return iterator(
nullptr); }
1024 constexpr const_iterator
1025 end() const noexcept {
return const_iterator(
nullptr); }
1028 constexpr reverse_iterator
1030 {
return reverse_iterator(end()); }
1033 constexpr const_reverse_iterator
1034 rbegin() const noexcept
1035 {
return const_reverse_iterator(end()); }
1038 constexpr reverse_iterator
1039 rend() noexcept {
return reverse_iterator(begin()); }
1042 constexpr const_reverse_iterator
1043 rend() const noexcept {
return const_reverse_iterator(begin()); }
1046 constexpr const_iterator
1047 cbegin() const noexcept {
return begin(); }
1050 constexpr const_iterator
1051 cend() const noexcept {
return end(); }
1054 constexpr const_reverse_iterator
1055 crbegin() const noexcept {
return rbegin(); }
1058 constexpr const_reverse_iterator
1059 crend() const noexcept {
return rend(); }
1064 empty() const noexcept {
return true; }
1068 size() const noexcept {
return 0; }
1071 static constexpr size_type
1072 max_size() noexcept {
return 0; }
1075 static constexpr size_type
1076 capacity() noexcept {
return 0; }
1079 resize(size_type __n)
1082 __throw_bad_alloc();
1086 resize(size_type __n,
const _Tp&)
1089 __throw_bad_alloc();
1092 static constexpr void
1093 reserve(size_type __n)
1096 __throw_bad_alloc();
1099 static constexpr void
1103 [[nodiscard,noreturn]]
1105 operator[](size_type)
1106 { __builtin_trap(); }
1108 [[nodiscard,noreturn]]
1109 constexpr const_reference
1110 operator[](size_type)
const
1111 { __builtin_trap(); }
1113 [[nodiscard,noreturn]]
1114 constexpr const_reference
1115 at(size_type __n)
const
1117 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1119 ">= size() (which is 0)"),
1123 [[nodiscard,noreturn]]
1127 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1129 ">= size() (which is 0)"),
1133 [[nodiscard,noreturn]]
1136 { __builtin_trap(); }
1138 [[nodiscard,noreturn]]
1139 constexpr const_reference
1141 { __builtin_trap(); }
1143 [[nodiscard,noreturn]]
1146 { __builtin_trap(); }
1148 [[nodiscard,noreturn]]
1149 constexpr const_reference
1151 { __builtin_trap(); }
1161 constexpr const _Tp*
1162 data() const noexcept
1166 template<
typename... _Args>
1169 emplace_back(_Args&&...)
1170 { __throw_bad_alloc(); }
1174 push_back(
const _Tp&)
1175 { __throw_bad_alloc(); }
1180 { __throw_bad_alloc(); }
1182 template<__detail::__container_compatible_range<_Tp> _Rg>
1184 append_range(_Rg&& __rg)
1186 if (ranges::begin(__rg) != ranges::end(__rg))
1187 __throw_bad_alloc();
1193 { __builtin_trap(); }
1195 template<
typename... _Args>
1196 constexpr optional<_Tp&>
1197 try_emplace_back(_Args&&...)
1200 constexpr optional<_Tp&>
1201 try_push_back(
const _Tp&)
1204 constexpr optional<_Tp&>
1205 try_push_back(_Tp&&)
1208 template<
typename... _Args>
1211 unchecked_emplace_back(_Args&&...)
1212 { __builtin_trap(); }
1216 unchecked_push_back(
const _Tp&)
1217 { __builtin_trap(); }
1221 unchecked_push_back(_Tp&&)
1222 { __builtin_trap(); }
1224 template<
typename... _Args>
1227 emplace(const_iterator, _Args&&...)
1228 { __throw_bad_alloc(); }
1232 insert(const_iterator,
const _Tp&)
1233 { __throw_bad_alloc(); }
1237 insert(const_iterator, _Tp&&)
1238 { __throw_bad_alloc(); }
1241 insert(const_iterator, size_type __n,
const _Tp&)
1244 __throw_bad_alloc();
1248 template<
typename _InputIterator>
1250 insert(const_iterator, _InputIterator __first, _InputIterator __last)
1252 if (__first != __last)
1253 __throw_bad_alloc();
1257 template<__detail::__container_compatible_range<_Tp> _Rg>
1259 insert_range(const_iterator, _Rg&& __rg)
1261 if (ranges::begin(__rg) != ranges::end(__rg))
1262 __throw_bad_alloc();
1267 insert(const_iterator, initializer_list<_Tp> __il)
1269 if (__il.size() != 0)
1270 __throw_bad_alloc();
1276 erase(const_iterator)
1277 { __builtin_trap(); }
1280 erase(const_iterator __first, const_iterator __last)
1282 __glibcxx_assert(__first == __last);
1287 swap(inplace_vector& __x)
1295 constexpr friend bool
1296 operator==(
const inplace_vector&,
const inplace_vector&)
1299 constexpr friend auto
1300 operator<=>(
const inplace_vector&,
const inplace_vector&)
1301 requires requires (
const _Tp __t) {
1302 { __t < __t } -> __detail::__boolean_testable;
1304 {
return std::strong_ordering::equal; }
1310 constexpr friend void
1311 swap(inplace_vector&, inplace_vector&)
noexcept
1315_GLIBCXX_END_NAMESPACE_CONTAINER
1317 template<
typename _Tp,
size_t _Nm,
typename _Predicate>
1319 erase_if(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
1322 if constexpr (_Nm != 0)
1323 return __detail::__erase_if(__cont, __cont,
std::move(__pred));
1328 template<
typename _Tp,
size_t _Nm,
typename _Up = _Tp>
1330 erase(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
const _Up& __value)
1331 {
return std::erase_if(__cont, __gnu_cxx::__ops::__equal_to(__value)); }
1333_GLIBCXX_END_NAMESPACE_VERSION
1336#ifdef _GLIBCXX_DEBUG
1337# 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)