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)
123 { append_range(__rg); }
126 inplace_vector(initializer_list<_Tp> __il)
129 _S_reserve(__il.size());
131 _M_size = __il.size();
134 inplace_vector(
const inplace_vector&)
135 requires is_trivially_copy_constructible_v<_Tp>
139 inplace_vector(
const inplace_vector& __other)
140 noexcept(is_nothrow_copy_constructible_v<_Tp>)
144 _M_size = __other.size();
147 inplace_vector(inplace_vector&&)
148 requires is_trivially_move_constructible_v<_Tp>
152 inplace_vector(inplace_vector&& __other)
153 noexcept(is_nothrow_move_constructible_v<_Tp>)
157 _M_size = __other.size();
161 requires is_trivially_destructible_v<_Tp>
169 operator=(
const inplace_vector&)
170 requires is_trivially_copy_assignable_v<_Tp>
171 && is_trivially_copy_constructible_v<_Tp>
172 && is_trivially_destructible_v<_Tp>
175 constexpr inplace_vector&
176 operator=(
const inplace_vector& __other)
177 noexcept(is_nothrow_copy_assignable_v<_Tp>
178 && is_nothrow_copy_constructible_v<_Tp>)
181 assign(__other.begin(), __other.end());
186 operator=(inplace_vector&&)
187 requires is_trivially_move_assignable_v<_Tp>
188 && is_trivially_move_constructible_v<_Tp>
189 && is_trivially_destructible_v<_Tp>
192 constexpr inplace_vector&
193 operator=(inplace_vector&& __other)
194 noexcept(is_nothrow_move_assignable_v<_Tp>
195 && is_nothrow_move_constructible_v<_Tp>)
198 assign(std::make_move_iterator(__other.begin()),
199 std::make_move_iterator(__other.end()));
203 constexpr inplace_vector&
204 operator=(initializer_list<_Tp> __il)
206 assign(__il.begin(), __il.end());
210 template<__any_input_iterator _InputIterator>
212 assign(_InputIterator __first, _InputIterator __last)
214 if (
const auto __n = _S_distance(__first, __last))
219 for (
size_t __i = 0; __i < _M_size; ++__i, (void)++__first)
220 _M_elems[__i] = *__first;
224 std::destroy(std::copy(__first, __last, begin()), end());
230 for (;__first != __last && __i < _M_size; ++__first)
231 _M_elems[__i++] = *__first;
232 if (__first == __last)
239 while (__first != __last)
240 emplace_back(*__first++);
245 template<__detail::__container_compatible_range<_Tp> _Rg>
247 assign_range(_Rg&& __rg)
249 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
251 const auto __sz = ranges::distance(__rg);
256 ranges::copy_n(ranges::begin(__rg), __sz, data());
257 std::destroy(data() + __sz, data() + _M_size);
261 auto [__in, __out] = ranges::copy_n(
262 ranges::begin(__rg), _M_size,
264 ranges::uninitialized_copy(
266 __out, unreachable_sentinel);
272 auto __in = ranges::begin(__rg);
273 auto __end = ranges::end(__rg);
275 for (; __n < _M_size && __in != __end; ++__in)
276 _M_elems[__n++] = *__in;
280 std::destroy(data() + __n, data() + _M_size);
286 auto __res = ranges::uninitialized_copy(
288 data() + __n, data() + _Nm);
289 _M_size = __res.out - data();
290 if (__res.in == ranges::end(__rg))
298 assign(size_type __n,
const _Tp& __u)
305 std::destroy_n(std::fill_n(data(), __n, __u), _M_size - __n);
310 assign(initializer_list<_Tp> __il)
311 { assign(__il.begin(), __il.end()); }
316 begin() noexcept {
return iterator(data()); }
319 constexpr const_iterator
320 begin() const noexcept {
return const_iterator(data()); }
325 {
return iterator(data() + _M_size); }
328 constexpr const_iterator
330 {
return const_iterator(data() + _M_size); }
333 constexpr reverse_iterator
335 {
return reverse_iterator(end()); }
338 constexpr const_reverse_iterator
339 rbegin() const noexcept
340 {
return const_reverse_iterator(end()); }
343 constexpr reverse_iterator
344 rend() noexcept {
return reverse_iterator(begin()); }
347 constexpr const_reverse_iterator
348 rend() const noexcept {
return const_reverse_iterator(begin()); }
351 constexpr const_iterator
352 cbegin() const noexcept {
return begin(); }
355 constexpr const_iterator
356 cend() const noexcept {
return end(); }
359 constexpr const_reverse_iterator
360 crbegin() const noexcept {
return rbegin(); }
363 constexpr const_reverse_iterator
364 crend() const noexcept {
return rend(); }
369 empty() const noexcept {
return _M_size == 0; }
373 size() const noexcept
376 __builtin_unreachable();
381 static constexpr size_type
382 max_size() noexcept {
return _Nm; }
385 static constexpr size_type
386 capacity() noexcept {
return _Nm; }
389 resize(size_type __n)
394 else if (__n < _M_size)
395 std::destroy_n(data() + __n, _M_size - __n);
400 resize(size_type __n,
const _Tp& __c)
405 else if (__n < _M_size)
406 std::destroy_n(data() + __n, _M_size - __n);
410 static constexpr void
411 reserve(size_type __n)
414 static constexpr void
420 operator[](size_type __n)
422 __glibcxx_requires_subscript(__n);
423 return _M_elems[__n];
427 constexpr const_reference
428 operator[](size_type __n)
const
430 __glibcxx_requires_subscript(__n);
431 return _M_elems[__n];
435 constexpr const_reference
436 at(size_type __n)
const
439 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
441 ">= size() (which is %zu)"),
443 return _M_elems[__n];
451 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
453 ">= size() (which is %zu)"),
455 return _M_elems[__n];
462 __glibcxx_requires_nonempty();
467 constexpr const_reference
470 __glibcxx_requires_nonempty();
478 __glibcxx_requires_nonempty();
479 return _M_elems[_M_size - 1];
483 constexpr const_reference
486 __glibcxx_requires_nonempty();
487 return _M_elems[_M_size - 1];
495 {
return static_cast<pointer
>(_M_elems); }
499 data() const noexcept
500 {
return static_cast<const_pointer
>(_M_elems); }
503 template<
typename... _Args>
505 emplace_back(_Args&&... __args)
513 push_back(
const _Tp& __x)
514 {
return emplace_back(__x); }
520 template<__detail::__container_compatible_range<_Tp> _Rg>
522 append_range(_Rg&& __rg)
524 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
526 const auto __sz = ranges::distance(__rg);
527 if (__sz > (_Nm - size()))
530 ranges::uninitialized_copy(
531 ranges::begin(__rg), unreachable_sentinel,
532 data() + _M_size, data() + _M_size + __sz);
533 _M_size += size_type(__sz);
537 ranges::subrange<pointer> __tail(data() + _M_size, data() + _Nm);
538 auto [__in, __out] = ranges::uninitialized_copy(__rg, __tail);
539 _M_size = __out - data();
540 if (__in != ranges::end(__rg))
548 __glibcxx_requires_nonempty();
550 _M_elems[_M_size].~_Tp();
553 template<
typename... _Args>
554 constexpr optional<_Tp&>
555 try_emplace_back(_Args&&... __args)
557 if (_M_size >= _Nm) [[unlikely]]
559 return optional<_Tp&>(in_place,
563 constexpr optional<_Tp&>
564 try_push_back(
const _Tp& __x)
566 if (_M_size >= _Nm) [[unlikely]]
568 return optional<_Tp&>(in_place, unchecked_emplace_back(__x));
571 constexpr optional<_Tp&>
572 try_push_back(_Tp&& __x)
574 if (_M_size >= _Nm) [[unlikely]]
576 return optional<_Tp&>(in_place, unchecked_emplace_back(
std::move(__x)));
579 template<
typename... _Args>
581 unchecked_emplace_back(_Args&&... __args)
583 __glibcxx_assert(_M_size < _Nm);
584 auto __p = std::construct_at(data() + _M_size,
591 unchecked_push_back(
const _Tp& __x)
592 {
return unchecked_emplace_back(__x); }
595 unchecked_push_back(_Tp&& __x)
596 {
return unchecked_emplace_back(
std::move(__x)); }
598 template<
typename... _Args>
600 emplace(const_iterator __position, _Args&&... __args)
602 size_t __b = __position - cbegin();
603 __glibcxx_assert(__b <= _M_size);
606 iterator __pos = begin() + __b;
609 std::rotate(__pos, end() - 1, end());
614 insert(const_iterator __position,
const _Tp& __x)
615 {
return emplace(__position, __x); }
618 insert(const_iterator __position, _Tp&& __x)
619 {
return emplace(__position,
std::move(__x)); }
622 insert(const_iterator __position, size_type __n,
const _Tp& __x)
624 size_t __b = __position - cbegin();
625 __glibcxx_assert(__b <= _M_size);
626 if ((_Nm - _M_size) < __n)
628 iterator __pos = begin() + __b;
630 if (std::__exchange(_M_size, _M_size + __n))
631 std::rotate(__pos, end() - __n, end());
635 template<__any_input_iterator _InputIterator>
637 insert(const_iterator __position, _InputIterator __first,
638 _InputIterator __last)
640 size_t __b = __position - cbegin();
641 __glibcxx_assert(__b <= _M_size);
642 iterator __pos = begin() + __b;
643 const size_t __s = _M_size;
644 if (
const auto __n = _S_distance(__first, __last))
646 if ((_Nm - _M_size) < __n)
653 while (__first != __last)
654 emplace_back(*__first++);
657 std::rotate(__pos, begin() + __s, end());
661 template<__detail::__container_compatible_range<_Tp> _Rg>
663 insert_range(const_iterator __position, _Rg&& __rg)
665 iterator __pos = begin() + (__position - cbegin());
666 const auto __end = end();
667 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
669 const auto __len = ranges::distance(__rg);
670 if (__len > (_Nm - size()))
672 if (!__len) [[unlikely]]
675 const size_type __n = size_type(__len);
676 const size_type __num_after = __end - __pos;
677 if (__num_after >= __n)
679 ranges::uninitialized_move(__end - __n, __end,
680 __end, unreachable_sentinel);
682 ranges::move_backward(__pos, __end - __n, __end);
683 ranges::copy(__rg, __pos);
685 else if constexpr (ranges::forward_range<_Rg>)
687 auto __mid = ranges::next(ranges::begin(__rg), __num_after);
688 ranges::uninitialized_copy(__mid, ranges::end(__rg),
689 __end, unreachable_sentinel);
690 _M_size += __n - __num_after;
691 ranges::uninitialized_move(__pos, __end,
692 __pos + __n, unreachable_sentinel);
693 _M_size += __num_after;
694 ranges::copy(ranges::begin(__rg), __mid, __pos);
698 ranges::uninitialized_copy(
699 ranges::begin(__rg), ranges::end(__rg),
700 __end, unreachable_sentinel);
702 std::rotate(__pos, __end, end());
708 std::rotate(__pos, __end, end());
714 insert(const_iterator __position, initializer_list<_Tp> __il)
715 {
return insert(__position, __il.begin(), __il.end()); }
718 erase(const_iterator __position)
720 size_t __n = __position - cbegin();
721 __glibcxx_assert(__n < _M_size);
722 iterator __pos = begin() + __n;
729 erase(const_iterator __first, const_iterator __last)
731 size_t __n = __first - cbegin();
732 size_t __x = __last - __first;
733 __glibcxx_assert(__n <= _M_size);
734 __glibcxx_assert(__x <= _M_size);
735 iterator __pos = begin() + __n;
736 iterator __end =
std::move(__pos + __x, end(), __pos);
737 std::destroy_n(__end, __x);
743 swap(inplace_vector& __x)
744 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
747 const auto __smaller = __vs[__x.size() < size()];
748 const auto __bigger = __vs[__x.size() >= size()];
749 size_type __n = __smaller->size();
750 size_type __n2 = __bigger->size();
752 if constexpr (is_nothrow_move_constructible_v<_Tp>)
754 for (size_type __i = __n; __i < __n2; ++__i)
756 std::construct_at(__smaller->data() + __i,
758 std::destroy_at(__bigger->data() + __i);
764 __bigger->data() + __n2,
765 __smaller->data() + __n);
766 std::destroy(__bigger->data() + __n, __bigger->data() + __n2);
768 __smaller->_M_size = __n2;
769 __bigger->_M_size = __n;
772 for (size_type __i = 0; __i < __n; __i++)
773 swap(_M_elems[__i], __x._M_elems[__i]);
779 std::destroy_n(data(),
size_t(_M_size));
783 constexpr friend bool
784 operator==(
const inplace_vector& __x,
const inplace_vector& __y)
785 {
return std::equal(__x.begin(), __x.end(), __y.begin(), __y.end()); }
787 constexpr friend auto
788 operator<=>(
const inplace_vector& __x,
const inplace_vector& __y)
789 requires requires (
const _Tp __t) {
790 { __t < __t } -> __detail::__boolean_testable;
794 __y.begin(), __y.end(),
795 __detail::__synth3way);
799 constexpr friend void
800 swap(inplace_vector& __x, inplace_vector& __y)
801 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
811 template<
typename _UInt,
bool = (alignof(_Tp) <= sizeof(_UInt))>
812 static constexpr
bool __fits
813 = _Nm <= __gnu_cxx::__
int_traits<_UInt>::__max;
817 template<
typename _UInt>
818 static constexpr bool __fits<_UInt, false> =
false;
820 static consteval auto __select_size_type()
822 if constexpr (__fits<unsigned char>)
823 return (
unsigned char)0;
824#if __SHRT_WIDTH__ < __SIZE_WIDTH__
825 else if constexpr (__fits<unsigned short>)
826 return (
unsigned short)0;
828#if __INT_WIDTH__ < __SIZE_WIDTH__ && __INT_WIDTH__ > __SHRT_WIDTH__
829 else if constexpr (__fits<unsigned int>)
832#if __LONG_WIDTH__ < __SIZE_WIDTH__ && __LONG_WIDTH__ > __INT_WIDTH__
833 else if constexpr (__fits<unsigned long>)
839 decltype(__select_size_type()) _M_size = 0;
846#if __glibcxx_start_lifetime_as
847 std::start_lifetime_as_array<_Tp>(data(), _Nm);
853 if constexpr (is_trivial_v<_Tp>)
854 for (
size_t __i = 0; __i < _Nm; ++__i)
855 _M_elems[__i] = _Tp();
857 __builtin_unreachable();
861 static constexpr void
862 _S_reserve(
size_t __n)
868 template<
typename _InputIterator>
869 constexpr static auto
870 _S_distance(_InputIterator __first, _InputIterator __last)
872 if constexpr (sized_sentinel_for<_InputIterator, _InputIterator>
873 || forward_iterator<_InputIterator>)
874 return (size_type)ranges::distance(__first, __last);
875 else if constexpr (derived_from<__iter_category_t<_InputIterator>,
876 forward_iterator_tag>)
885 template<
typename _Tp>
886 class inplace_vector<_Tp, 0>
890 using value_type = _Tp;
891 using pointer = _Tp*;
892 using const_pointer =
const _Tp*;
893 using reference = value_type&;
894 using const_reference =
const value_type&;
895 using size_type = size_t;
896 using difference_type = ptrdiff_t;
898 = __gnu_cxx::__normal_iterator<_Tp*, inplace_vector>;
900 = __gnu_cxx::__normal_iterator<const _Tp*, inplace_vector>;
901 using reverse_iterator = std::reverse_iterator<iterator>;
902 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
905 inplace_vector() =
default;
908 inplace_vector(size_type __n)
915 inplace_vector(size_type __n,
const _Tp& __value)
921 template<__any_input_iterator _InputIterator>
923 inplace_vector(_InputIterator __first, _InputIterator __last)
925 if (__first != __last)
929 template <__detail::__container_compatible_range<_Tp> _Rg>
931 inplace_vector(from_range_t, _Rg&& __rg)
933 if (ranges::begin(__rg) != ranges::end(__rg))
938 inplace_vector(initializer_list<_Tp> __il)
940 if (__il.size() != 0)
944 inplace_vector(
const inplace_vector&) =
default;
945 inplace_vector(inplace_vector&&) =
default;
948 ~inplace_vector() =
default;
951 operator=(
const inplace_vector&) =
default;
954 operator=(inplace_vector&&) =
default;
956 constexpr inplace_vector&
957 operator=(initializer_list<_Tp> __il)
959 if (__il.size() != 0)
964 template<__any_input_iterator _InputIterator>
966 assign(_InputIterator __first, _InputIterator __last)
968 if (__first != __last)
972 template<__detail::__container_compatible_range<_Tp> _Rg>
974 assign_range(_Rg&& __rg)
976 if (ranges::begin(__rg) != ranges::end(__rg))
981 assign(size_type __n,
const _Tp& __u)
988 assign(initializer_list<_Tp> __il)
990 if (__il.size() != 0)
997 begin() noexcept {
return iterator(
nullptr); }
1000 constexpr const_iterator
1001 begin() const noexcept {
return const_iterator(
nullptr); }
1005 end() noexcept {
return iterator(
nullptr); }
1008 constexpr const_iterator
1009 end() const noexcept {
return const_iterator(
nullptr); }
1012 constexpr reverse_iterator
1014 {
return reverse_iterator(end()); }
1017 constexpr const_reverse_iterator
1018 rbegin() const noexcept
1019 {
return const_reverse_iterator(end()); }
1022 constexpr reverse_iterator
1023 rend() noexcept {
return reverse_iterator(begin()); }
1026 constexpr const_reverse_iterator
1027 rend() const noexcept {
return const_reverse_iterator(begin()); }
1030 constexpr const_iterator
1031 cbegin() const noexcept {
return begin(); }
1034 constexpr const_iterator
1035 cend() const noexcept {
return end(); }
1038 constexpr const_reverse_iterator
1039 crbegin() const noexcept {
return rbegin(); }
1042 constexpr const_reverse_iterator
1043 crend() const noexcept {
return rend(); }
1048 empty() const noexcept {
return true; }
1052 size() const noexcept {
return 0; }
1055 static constexpr size_type
1056 max_size() noexcept {
return 0; }
1059 static constexpr size_type
1060 capacity() noexcept {
return 0; }
1063 resize(size_type __n)
1066 __throw_bad_alloc();
1070 resize(size_type __n,
const _Tp&)
1073 __throw_bad_alloc();
1076 static constexpr void
1077 reserve(size_type __n)
1080 __throw_bad_alloc();
1083 static constexpr void
1087 [[nodiscard,noreturn]]
1089 operator[](size_type)
1090 { __builtin_trap(); }
1092 [[nodiscard,noreturn]]
1093 constexpr const_reference
1094 operator[](size_type)
const
1095 { __builtin_trap(); }
1097 [[nodiscard,noreturn]]
1098 constexpr const_reference
1099 at(size_type __n)
const
1101 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1103 ">= size() (which is 0)"),
1107 [[nodiscard,noreturn]]
1111 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1113 ">= size() (which is 0)"),
1117 [[nodiscard,noreturn]]
1120 { __builtin_trap(); }
1122 [[nodiscard,noreturn]]
1123 constexpr const_reference
1125 { __builtin_trap(); }
1127 [[nodiscard,noreturn]]
1130 { __builtin_trap(); }
1132 [[nodiscard,noreturn]]
1133 constexpr const_reference
1135 { __builtin_trap(); }
1145 constexpr const _Tp*
1146 data() const noexcept
1150 template<
typename... _Args>
1153 emplace_back(_Args&&...)
1154 { __throw_bad_alloc(); }
1158 push_back(
const _Tp&)
1159 { __throw_bad_alloc(); }
1164 { __throw_bad_alloc(); }
1166 template<__detail::__container_compatible_range<_Tp> _Rg>
1168 append_range(_Rg&& __rg)
1170 if (ranges::begin(__rg) != ranges::end(__rg))
1171 __throw_bad_alloc();
1177 { __builtin_trap(); }
1179 template<
typename... _Args>
1180 constexpr optional<_Tp&>
1181 try_emplace_back(_Args&&...)
1184 constexpr optional<_Tp&>
1185 try_push_back(
const _Tp&)
1188 constexpr optional<_Tp&>
1189 try_push_back(_Tp&&)
1192 template<
typename... _Args>
1195 unchecked_emplace_back(_Args&&...)
1196 { __builtin_trap(); }
1200 unchecked_push_back(
const _Tp&)
1201 { __builtin_trap(); }
1205 unchecked_push_back(_Tp&&)
1206 { __builtin_trap(); }
1208 template<
typename... _Args>
1211 emplace(const_iterator, _Args&&...)
1212 { __throw_bad_alloc(); }
1216 insert(const_iterator,
const _Tp&)
1217 { __throw_bad_alloc(); }
1221 insert(const_iterator, _Tp&&)
1222 { __throw_bad_alloc(); }
1225 insert(const_iterator, size_type __n,
const _Tp&)
1228 __throw_bad_alloc();
1232 template<
typename _InputIterator>
1234 insert(const_iterator, _InputIterator __first, _InputIterator __last)
1236 if (__first != __last)
1237 __throw_bad_alloc();
1241 template<__detail::__container_compatible_range<_Tp> _Rg>
1243 insert_range(const_iterator, _Rg&& __rg)
1245 if (ranges::begin(__rg) != ranges::end(__rg))
1246 __throw_bad_alloc();
1251 insert(const_iterator, initializer_list<_Tp> __il)
1253 if (__il.size() != 0)
1254 __throw_bad_alloc();
1260 erase(const_iterator)
1261 { __builtin_trap(); }
1264 erase(const_iterator __first, const_iterator __last)
1266 __glibcxx_assert(__first == __last);
1271 swap(inplace_vector& __x)
1279 constexpr friend bool
1280 operator==(
const inplace_vector&,
const inplace_vector&)
1283 constexpr friend auto
1284 operator<=>(
const inplace_vector&,
const inplace_vector&)
1285 requires requires (
const _Tp __t) {
1286 { __t < __t } -> __detail::__boolean_testable;
1288 {
return std::strong_ordering::equal; }
1294 constexpr friend void
1295 swap(inplace_vector&, inplace_vector&)
noexcept
1299_GLIBCXX_END_NAMESPACE_CONTAINER
1301 template<
typename _Tp,
size_t _Nm,
typename _Predicate>
1303 erase_if(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
1306 if constexpr (_Nm != 0)
1307 return __detail::__erase_if(__cont, __cont,
std::move(__pred));
1312 template<
typename _Tp,
size_t _Nm,
typename _Up = _Tp>
1314 erase(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
const _Up& __value)
1315 {
return std::erase_if(__cont, __gnu_cxx::__ops::__equal_to(__value)); }
1317_GLIBCXX_END_NAMESPACE_VERSION
1320#ifdef _GLIBCXX_DEBUG
1321# 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)