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
51namespace std _GLIBCXX_VISIBILITY(default)
53_GLIBCXX_BEGIN_NAMESPACE_VERSION
54_GLIBCXX_BEGIN_NAMESPACE_CONTAINER
57 template<
typename _Tp,
size_t _Nm>
63 using value_type = _Tp;
65 using const_pointer =
const _Tp*;
66 using reference = value_type&;
67 using const_reference =
const value_type&;
68 using size_type = size_t;
69 using difference_type = ptrdiff_t;
71 = __gnu_cxx::__normal_iterator<_Tp*, inplace_vector>;
73 = __gnu_cxx::__normal_iterator<const _Tp*, inplace_vector>;
74 using reverse_iterator = std::reverse_iterator<iterator>;
75 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
79 inplace_vector() noexcept
83 inplace_vector(size_type __n)
92 inplace_vector(size_type __n,
const _Tp& __value)
100 template<__any_input_iterator _InputIterator>
102 inplace_vector(_InputIterator __first, _InputIterator __last)
105 if (
const auto __n = _S_distance(__first, __last))
113 while (__first != __last)
114 emplace_back(*__first++);
118 template <__detail::__container_compatible_range<_Tp> _Rg>
120 inplace_vector(from_range_t, _Rg&& __rg)
122 { append_range(__rg); }
125 inplace_vector(initializer_list<_Tp> __il)
128 _S_reserve(__il.size());
130 _M_size = __il.size();
133 inplace_vector(
const inplace_vector&)
134 requires is_trivially_copy_constructible_v<_Tp>
138 inplace_vector(
const inplace_vector& __other)
139 noexcept(is_nothrow_copy_constructible_v<_Tp>)
143 _M_size = __other.size();
146 inplace_vector(inplace_vector&&)
147 requires is_trivially_move_constructible_v<_Tp>
151 inplace_vector(inplace_vector&& __other)
152 noexcept(is_nothrow_move_constructible_v<_Tp>)
156 _M_size = __other.size();
160 requires is_trivially_destructible_v<_Tp>
168 operator=(
const inplace_vector&)
169 requires is_trivially_copy_assignable_v<_Tp>
170 && is_trivially_copy_constructible_v<_Tp>
171 && is_trivially_destructible_v<_Tp>
174 constexpr inplace_vector&
175 operator=(
const inplace_vector& __other)
176 noexcept(is_nothrow_copy_assignable_v<_Tp>
177 && is_nothrow_copy_constructible_v<_Tp>)
180 assign(__other.begin(), __other.end());
185 operator=(inplace_vector&&)
186 requires is_trivially_move_assignable_v<_Tp>
187 && is_trivially_move_constructible_v<_Tp>
188 && is_trivially_destructible_v<_Tp>
191 constexpr inplace_vector&
192 operator=(inplace_vector&& __other)
193 noexcept(is_nothrow_move_assignable_v<_Tp>
194 && is_nothrow_move_constructible_v<_Tp>)
197 assign(std::make_move_iterator(__other.begin()),
198 std::make_move_iterator(__other.end()));
202 constexpr inplace_vector&
203 operator=(initializer_list<_Tp> __il)
205 assign(__il.begin(), __il.end());
209 template<__any_input_iterator _InputIterator>
211 assign(_InputIterator __first, _InputIterator __last)
213 if (
const auto __n = _S_distance(__first, __last))
218 for (
size_t __i = 0; __i < _M_size; ++__i, (void)++__first)
219 _M_elems[__i] = *__first;
223 std::destroy(std::copy(__first, __last, begin()), end());
229 for (;__first != __last && __i < _M_size; ++__first)
230 _M_elems[__i++] = *__first;
231 if (__first == __last)
238 while (__first != __last)
239 emplace_back(*__first++);
244 template<__detail::__container_compatible_range<_Tp> _Rg>
246 assign_range(_Rg&& __rg)
248 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
250 const auto __sz = ranges::distance(__rg);
255 ranges::copy_n(ranges::begin(__rg), __sz, data());
256 std::destroy(data() + __sz, data() + _M_size);
260 auto [__in, __out] = ranges::copy_n(
261 ranges::begin(__rg), _M_size,
263 ranges::uninitialized_copy(
265 __out, unreachable_sentinel);
271 auto __in = ranges::begin(__rg);
272 auto __end = ranges::end(__rg);
274 for (; __n < _M_size && __in != __end; ++__in)
275 _M_elems[__n++] = *__in;
279 std::destroy(data() + __n, data() + _M_size);
285 auto __res = ranges::uninitialized_copy(
287 data() + __n, data() + _Nm);
288 _M_size = __res.out - data();
289 if (__res.in == ranges::end(__rg))
297 assign(size_type __n,
const _Tp& __u)
304 std::destroy_n(std::fill_n(data(), __n, __u), _M_size - __n);
309 assign(initializer_list<_Tp> __il)
310 { assign(__il.begin(), __il.end()); }
315 begin() noexcept {
return iterator(data()); }
318 constexpr const_iterator
319 begin() const noexcept {
return const_iterator(data()); }
324 {
return iterator(data() + _M_size); }
327 constexpr const_iterator
329 {
return const_iterator(data() + _M_size); }
332 constexpr reverse_iterator
334 {
return reverse_iterator(end()); }
337 constexpr const_reverse_iterator
338 rbegin() const noexcept
339 {
return const_reverse_iterator(end()); }
342 constexpr reverse_iterator
343 rend() noexcept {
return reverse_iterator(begin()); }
346 constexpr const_reverse_iterator
347 rend() const noexcept {
return const_reverse_iterator(begin()); }
350 constexpr const_iterator
351 cbegin() const noexcept {
return begin(); }
354 constexpr const_iterator
355 cend() const noexcept {
return end(); }
358 constexpr const_reverse_iterator
359 crbegin() const noexcept {
return rbegin(); }
362 constexpr const_reverse_iterator
363 crend() const noexcept {
return rend(); }
368 empty() const noexcept {
return _M_size == 0; }
372 size() const noexcept
375 __builtin_unreachable();
380 static constexpr size_type
381 max_size() noexcept {
return _Nm; }
384 static constexpr size_type
385 capacity() noexcept {
return _Nm; }
388 resize(size_type __n)
393 else if (__n < _M_size)
394 std::destroy_n(data() + __n, _M_size - __n);
399 resize(size_type __n,
const _Tp& __c)
404 else if (__n < _M_size)
405 std::destroy_n(data() + __n, _M_size - __n);
409 static constexpr void
410 reserve(size_type __n)
413 static constexpr void
419 operator[](size_type __n)
421 __glibcxx_requires_subscript(__n);
422 return _M_elems[__n];
426 constexpr const_reference
427 operator[](size_type __n)
const
429 __glibcxx_requires_subscript(__n);
430 return _M_elems[__n];
434 constexpr const_reference
435 at(size_type __n)
const
438 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
440 ">= size() (which is %zu)"),
442 return _M_elems[__n];
450 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
452 ">= size() (which is %zu)"),
454 return _M_elems[__n];
461 __glibcxx_requires_nonempty();
466 constexpr const_reference
469 __glibcxx_requires_nonempty();
477 __glibcxx_requires_nonempty();
478 return _M_elems[_M_size - 1];
482 constexpr const_reference
485 __glibcxx_requires_nonempty();
486 return _M_elems[_M_size - 1];
494 {
return static_cast<pointer
>(_M_elems); }
498 data() const noexcept
499 {
return static_cast<const_pointer
>(_M_elems); }
502 template<
typename... _Args>
504 emplace_back(_Args&&... __args)
512 push_back(
const _Tp& __x)
513 {
return emplace_back(__x); }
519 template<__detail::__container_compatible_range<_Tp> _Rg>
521 append_range(_Rg&& __rg)
523 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
525 const auto __sz = ranges::distance(__rg);
526 if (__sz > (_Nm - size()))
529 ranges::uninitialized_copy(
530 ranges::begin(__rg), unreachable_sentinel,
531 data() + _M_size, data() + _M_size + __sz);
532 _M_size += size_type(__sz);
536 ranges::subrange<pointer> __tail(data() + _M_size, data() + _Nm);
537 auto [__in, __out] = ranges::uninitialized_copy(__rg, __tail);
538 _M_size = __out - data();
539 if (__in != ranges::end(__rg))
547 __glibcxx_requires_nonempty();
549 _M_elems[_M_size].~_Tp();
552 template<
typename... _Args>
554 try_emplace_back(_Args&&... __args)
556 if (_M_size >= _Nm) [[unlikely]]
559 return __builtin_addressof(__r);
563 try_push_back(
const _Tp& __x)
565 if (_M_size >= _Nm) [[unlikely]]
567 return __builtin_addressof(unchecked_emplace_back(__x));
571 try_push_back(_Tp&& __x)
573 if (_M_size >= _Nm) [[unlikely]]
575 return __builtin_addressof(unchecked_emplace_back(
std::move(__x)));
578 template<__detail::__container_compatible_range<_Tp> _Rg>
579 constexpr ranges::borrowed_iterator_t<_Rg>
580 try_append_range(_Rg&& __rg)
582 if constexpr (ranges::sized_range<_Rg>)
584 auto __n = ranges::distance(__rg);
585 if (__n == 0) [[unlikely]]
586 return ranges::begin(__rg);
588 const auto __end = data() + _M_size;
589 const size_t __avail = _Nm - size();
591 _M_size += size_type(__n);
597 return ranges::uninitialized_copy_n(
598 ranges::begin(__rg), __n,
599 __end, unreachable_sentinel).in;
603 ranges::subrange<pointer> __tail(data() + _M_size, data() + _Nm);
604 auto [__in, __out] = ranges::uninitialized_copy(__rg, __tail);
605 _M_size = __out - data();
610 template<
typename... _Args>
612 unchecked_emplace_back(_Args&&... __args)
614 __glibcxx_assert(_M_size < _Nm);
615 auto __p = std::construct_at(data() + _M_size,
622 unchecked_push_back(
const _Tp& __x)
623 {
return unchecked_emplace_back(__x); }
626 unchecked_push_back(_Tp&& __x)
627 {
return unchecked_emplace_back(
std::move(__x)); }
629 template<
typename... _Args>
631 emplace(const_iterator __position, _Args&&... __args)
633 size_t __b = __position - cbegin();
634 __glibcxx_assert(__b <= _M_size);
637 iterator __pos = begin() + __b;
640 std::rotate(__pos, end() - 1, end());
645 insert(const_iterator __position,
const _Tp& __x)
646 {
return emplace(__position, __x); }
649 insert(const_iterator __position, _Tp&& __x)
650 {
return emplace(__position,
std::move(__x)); }
653 insert(const_iterator __position, size_type __n,
const _Tp& __x)
655 size_t __b = __position - cbegin();
656 __glibcxx_assert(__b <= _M_size);
657 if ((_Nm - _M_size) < __n)
659 iterator __pos = begin() + __b;
661 if (std::__exchange(_M_size, _M_size + __n))
662 std::rotate(__pos, end() - __n, end());
666 template<__any_input_iterator _InputIterator>
668 insert(const_iterator __position, _InputIterator __first,
669 _InputIterator __last)
671 size_t __b = __position - cbegin();
672 __glibcxx_assert(__b <= _M_size);
673 iterator __pos = begin() + __b;
674 const size_t __s = _M_size;
675 if (
const auto __n = _S_distance(__first, __last))
677 if ((_Nm - _M_size) < __n)
684 while (__first != __last)
685 emplace_back(*__first++);
688 std::rotate(__pos, begin() + __s, end());
692 template<__detail::__container_compatible_range<_Tp> _Rg>
694 insert_range(const_iterator __position, _Rg&& __rg)
696 iterator __pos = begin() + (__position - cbegin());
697 const auto __end = end();
698 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
700 const auto __len = ranges::distance(__rg);
701 if (__len > (_Nm - size()))
703 if (!__len) [[unlikely]]
706 const size_type __n = size_type(__len);
707 const size_type __num_after = __end - __pos;
708 if (__num_after >= __n)
710 ranges::uninitialized_move(__end - __n, __end,
711 __end, unreachable_sentinel);
713 ranges::move_backward(__pos, __end - __n, __end);
714 ranges::copy(__rg, __pos);
716 else if constexpr (ranges::forward_range<_Rg>)
718 auto __mid = ranges::next(ranges::begin(__rg), __num_after);
719 ranges::uninitialized_copy(__mid, ranges::end(__rg),
720 __end, unreachable_sentinel);
721 _M_size += __n - __num_after;
722 ranges::uninitialized_move(__pos, __end,
723 __pos + __n, unreachable_sentinel);
724 _M_size += __num_after;
725 ranges::copy(ranges::begin(__rg), __mid, __pos);
729 ranges::uninitialized_copy(
730 ranges::begin(__rg), ranges::end(__rg),
731 __end, unreachable_sentinel);
733 std::rotate(__pos, __end, end());
739 std::rotate(__pos, __end, end());
745 insert(const_iterator __position, initializer_list<_Tp> __il)
746 {
return insert(__position, __il.begin(), __il.end()); }
749 erase(const_iterator __position)
751 size_t __n = __position - cbegin();
752 __glibcxx_assert(__n < _M_size);
753 iterator __pos = begin() + __n;
760 erase(const_iterator __first, const_iterator __last)
762 size_t __n = __first - cbegin();
763 size_t __x = __last - __first;
764 __glibcxx_assert(__n <= _M_size);
765 __glibcxx_assert(__x <= _M_size);
766 iterator __pos = begin() + __n;
767 iterator __end =
std::move(__pos + __x, end(), __pos);
768 std::destroy_n(__end, __x);
774 swap(inplace_vector& __x)
775 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
778 const auto __smaller = __vs[__x.size() < size()];
779 const auto __bigger = __vs[__x.size() >= size()];
780 size_type __n = __smaller->size();
781 size_type __n2 = __bigger->size();
783 if constexpr (is_nothrow_move_constructible_v<_Tp>)
785 for (size_type __i = __n; __i < __n2; ++__i)
787 std::construct_at(__smaller->data() + __i,
789 std::destroy_at(__bigger->data() + __i);
795 __bigger->data() + __n2,
796 __smaller->data() + __n);
797 std::destroy(__bigger->data() + __n, __bigger->data() + __n2);
799 __smaller->_M_size = __n2;
800 __bigger->_M_size = __n;
803 for (size_type __i = 0; __i < __n; __i++)
804 swap(_M_elems[__i], __x._M_elems[__i]);
810 std::destroy_n(data(),
size_t(_M_size));
814 constexpr friend bool
815 operator==(
const inplace_vector& __x,
const inplace_vector& __y)
816 {
return std::equal(__x.begin(), __x.end(), __y.begin(), __y.end()); }
818 constexpr friend auto
819 operator<=>(
const inplace_vector& __x,
const inplace_vector& __y)
820 requires requires (
const _Tp __t) {
821 { __t < __t } -> __detail::__boolean_testable;
825 __y.begin(), __y.end(),
826 __detail::__synth3way);
830 constexpr friend void
831 swap(inplace_vector& __x, inplace_vector& __y)
832 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
842 template<
typename _UInt,
bool = (alignof(_Tp) <= sizeof(_UInt))>
843 static constexpr
bool __fits
844 = _Nm <= __gnu_cxx::__
int_traits<_UInt>::__max;
848 template<
typename _UInt>
849 static constexpr bool __fits<_UInt, false> =
false;
851 static consteval auto __select_size_type()
853 if constexpr (__fits<unsigned char>)
854 return (
unsigned char)0;
855#if __SHRT_WIDTH__ < __SIZE_WIDTH__
856 else if constexpr (__fits<unsigned short>)
857 return (
unsigned short)0;
859#if __INT_WIDTH__ < __SIZE_WIDTH__ && __INT_WIDTH__ > __SHRT_WIDTH__
860 else if constexpr (__fits<unsigned int>)
863#if __LONG_WIDTH__ < __SIZE_WIDTH__ && __LONG_WIDTH__ > __INT_WIDTH__
864 else if constexpr (__fits<unsigned long>)
870 decltype(__select_size_type()) _M_size = 0;
877#if __glibcxx_start_lifetime_as
878 std::start_lifetime_as_array<_Tp>(data(), _Nm);
884 if constexpr (is_trivial_v<_Tp>)
885 for (
size_t __i = 0; __i < _Nm; ++__i)
886 _M_elems[__i] = _Tp();
888 __builtin_unreachable();
892 static constexpr void
893 _S_reserve(
size_t __n)
899 template<
typename _InputIterator>
900 constexpr static auto
901 _S_distance(_InputIterator __first, _InputIterator __last)
903 if constexpr (sized_sentinel_for<_InputIterator, _InputIterator>
904 || forward_iterator<_InputIterator>)
905 return (size_type)ranges::distance(__first, __last);
906 else if constexpr (derived_from<__iter_category_t<_InputIterator>,
907 forward_iterator_tag>)
916 template<
typename _Tp>
917 class inplace_vector<_Tp, 0>
921 using value_type = _Tp;
922 using pointer = _Tp*;
923 using const_pointer =
const _Tp*;
924 using reference = value_type&;
925 using const_reference =
const value_type&;
926 using size_type = size_t;
927 using difference_type = ptrdiff_t;
929 = __gnu_cxx::__normal_iterator<_Tp*, inplace_vector>;
931 = __gnu_cxx::__normal_iterator<const _Tp*, inplace_vector>;
932 using reverse_iterator = std::reverse_iterator<iterator>;
933 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
936 inplace_vector() =
default;
939 inplace_vector(size_type __n)
946 inplace_vector(size_type __n,
const _Tp& __value)
952 template<__any_input_iterator _InputIterator>
954 inplace_vector(_InputIterator __first, _InputIterator __last)
956 if (__first != __last)
960 template <__detail::__container_compatible_range<_Tp> _Rg>
962 inplace_vector(from_range_t, _Rg&& __rg)
964 if (ranges::begin(__rg) != ranges::end(__rg))
969 inplace_vector(initializer_list<_Tp> __il)
971 if (__il.size() != 0)
975 inplace_vector(
const inplace_vector&) =
default;
976 inplace_vector(inplace_vector&&) =
default;
979 ~inplace_vector() =
default;
982 operator=(
const inplace_vector&) =
default;
985 operator=(inplace_vector&&) =
default;
987 constexpr inplace_vector&
988 operator=(initializer_list<_Tp> __il)
990 if (__il.size() != 0)
995 template<__any_input_iterator _InputIterator>
997 assign(_InputIterator __first, _InputIterator __last)
999 if (__first != __last)
1000 __throw_bad_alloc();
1003 template<__detail::__container_compatible_range<_Tp> _Rg>
1005 assign_range(_Rg&& __rg)
1007 if (ranges::begin(__rg) != ranges::end(__rg))
1008 __throw_bad_alloc();
1012 assign(size_type __n,
const _Tp& __u)
1015 __throw_bad_alloc();
1019 assign(initializer_list<_Tp> __il)
1021 if (__il.size() != 0)
1022 __throw_bad_alloc();
1028 begin() noexcept {
return iterator(
nullptr); }
1031 constexpr const_iterator
1032 begin() const noexcept {
return const_iterator(
nullptr); }
1036 end() noexcept {
return iterator(
nullptr); }
1039 constexpr const_iterator
1040 end() const noexcept {
return const_iterator(
nullptr); }
1043 constexpr reverse_iterator
1045 {
return reverse_iterator(end()); }
1048 constexpr const_reverse_iterator
1049 rbegin() const noexcept
1050 {
return const_reverse_iterator(end()); }
1053 constexpr reverse_iterator
1054 rend() noexcept {
return reverse_iterator(begin()); }
1057 constexpr const_reverse_iterator
1058 rend() const noexcept {
return const_reverse_iterator(begin()); }
1061 constexpr const_iterator
1062 cbegin() const noexcept {
return begin(); }
1065 constexpr const_iterator
1066 cend() const noexcept {
return end(); }
1069 constexpr const_reverse_iterator
1070 crbegin() const noexcept {
return rbegin(); }
1073 constexpr const_reverse_iterator
1074 crend() const noexcept {
return rend(); }
1079 empty() const noexcept {
return true; }
1083 size() const noexcept {
return 0; }
1086 static constexpr size_type
1087 max_size() noexcept {
return 0; }
1090 static constexpr size_type
1091 capacity() noexcept {
return 0; }
1094 resize(size_type __n)
1097 __throw_bad_alloc();
1101 resize(size_type __n,
const _Tp&)
1104 __throw_bad_alloc();
1107 static constexpr void
1108 reserve(size_type __n)
1111 __throw_bad_alloc();
1114 static constexpr void
1118 [[nodiscard,noreturn]]
1120 operator[](size_type)
1121 { __builtin_trap(); }
1123 [[nodiscard,noreturn]]
1124 constexpr const_reference
1125 operator[](size_type)
const
1126 { __builtin_trap(); }
1128 [[nodiscard,noreturn]]
1129 constexpr const_reference
1130 at(size_type __n)
const
1132 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1134 ">= size() (which is 0)"),
1138 [[nodiscard,noreturn]]
1142 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1144 ">= size() (which is 0)"),
1148 [[nodiscard,noreturn]]
1151 { __builtin_trap(); }
1153 [[nodiscard,noreturn]]
1154 constexpr const_reference
1156 { __builtin_trap(); }
1158 [[nodiscard,noreturn]]
1161 { __builtin_trap(); }
1163 [[nodiscard,noreturn]]
1164 constexpr const_reference
1166 { __builtin_trap(); }
1176 constexpr const _Tp*
1177 data() const noexcept
1181 template<
typename... _Args>
1184 emplace_back(_Args&&...)
1185 { __throw_bad_alloc(); }
1189 push_back(
const _Tp&)
1190 { __throw_bad_alloc(); }
1195 { __throw_bad_alloc(); }
1197 template<__detail::__container_compatible_range<_Tp> _Rg>
1199 append_range(_Rg&& __rg)
1201 if (ranges::begin(__rg) != ranges::end(__rg))
1202 __throw_bad_alloc();
1208 { __builtin_trap(); }
1210 template<
typename... _Args>
1212 try_emplace_back(_Args&&...)
1216 try_push_back(
const _Tp&)
1220 try_push_back(_Tp&&)
1223 template<__detail::__container_compatible_range<_Tp> _Rg>
1224 constexpr ranges::borrowed_iterator_t<_Rg>
1225 try_append_range(_Rg&& __rg)
1226 {
return ranges::begin(__rg); }
1228 template<
typename... _Args>
1231 unchecked_emplace_back(_Args&&...)
1232 { __builtin_trap(); }
1236 unchecked_push_back(
const _Tp&)
1237 { __builtin_trap(); }
1241 unchecked_push_back(_Tp&&)
1242 { __builtin_trap(); }
1244 template<
typename... _Args>
1247 emplace(const_iterator, _Args&&...)
1248 { __throw_bad_alloc(); }
1252 insert(const_iterator,
const _Tp&)
1253 { __throw_bad_alloc(); }
1257 insert(const_iterator, _Tp&&)
1258 { __throw_bad_alloc(); }
1261 insert(const_iterator, size_type __n,
const _Tp&)
1264 __throw_bad_alloc();
1268 template<
typename _InputIterator>
1270 insert(const_iterator, _InputIterator __first, _InputIterator __last)
1272 if (__first != __last)
1273 __throw_bad_alloc();
1277 template<__detail::__container_compatible_range<_Tp> _Rg>
1279 insert_range(const_iterator, _Rg&& __rg)
1281 if (ranges::begin(__rg) != ranges::end(__rg))
1282 __throw_bad_alloc();
1287 insert(const_iterator, initializer_list<_Tp> __il)
1289 if (__il.size() != 0)
1290 __throw_bad_alloc();
1296 erase(const_iterator)
1297 { __builtin_trap(); }
1300 erase(const_iterator __first, const_iterator __last)
1302 __glibcxx_assert(__first == __last);
1307 swap(inplace_vector& __x)
1315 constexpr friend bool
1316 operator==(
const inplace_vector&,
const inplace_vector&)
1319 constexpr friend auto
1320 operator<=>(
const inplace_vector&,
const inplace_vector&)
1321 requires requires (
const _Tp __t) {
1322 { __t < __t } -> __detail::__boolean_testable;
1324 {
return std::strong_ordering::equal; }
1330 constexpr friend void
1331 swap(inplace_vector&, inplace_vector&)
noexcept
1335_GLIBCXX_END_NAMESPACE_CONTAINER
1337 template<
typename _Tp,
size_t _Nm,
typename _Predicate>
1339 erase_if(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
1342 if constexpr (_Nm != 0)
1343 return __detail::__erase_if(__cont, __cont,
std::move(__pred));
1348 template<
typename _Tp,
size_t _Nm,
typename _Up = _Tp>
1350 erase(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
const _Up& __value)
1351 {
return std::erase_if(__cont, __gnu_cxx::__ops::__equal_to(__value)); }
1353_GLIBCXX_END_NAMESPACE_VERSION
1356#ifdef _GLIBCXX_DEBUG
1357# include <debug/inplace_vector>
_ForwardIterator uninitialized_value_construct_n(_ForwardIterator __first, _Size __count)
Value-initializes objects in the range [first,first+count).
_ForwardIterator uninitialized_move(_InputIterator __first, _InputIterator __last, _ForwardIterator __result)
Move-construct from the range [first,last) into result.
_ForwardIterator uninitialized_fill_n(_ForwardIterator __first, _Size __n, const _Tp &__x)
Copies the value x into the range [first,first+n).
_ForwardIterator uninitialized_copy(_InputIterator __first, _InputIterator __last, _ForwardIterator __result)
Copies the range [first,last) into result.
__bool_constant< false > false_type
The type used as a compile-time boolean with false value.
constexpr _Tp * addressof(_Tp &__r) noexcept
Returns the actual address of the object or function referenced by r, even in the presence of an over...
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
constexpr auto lexicographical_compare_three_way(_InputIter1 __first1, _InputIter1 __last1, _InputIter2 __first2, _InputIter2 __last2, _Comp __comp) -> decltype(__comp(*__first1, *__first2))
Performs dictionary comparison on ranges.
ISO C++ entities toplevel namespace is std.
constexpr iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
constexpr _ForwardIterator _Destroy_n(_ForwardIterator __first, _Size __count)