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 __len = ranges::distance(__rg);
255 const size_t __sz = size_t(__len);
258 ranges::copy_n(ranges::begin(__rg), __sz, data());
259 std::destroy(data() + __sz, data() + _M_size);
263 auto [__in, __out] = ranges::copy_n(
264 ranges::begin(__rg), _M_size,
266 ranges::uninitialized_copy(
268 __out, unreachable_sentinel);
274 auto __in = ranges::begin(__rg);
275 auto __end = ranges::end(__rg);
277 for (; __n < _M_size && __in != __end; ++__in)
278 _M_elems[__n++] = *__in;
282 std::destroy(data() + __n, data() + _M_size);
288 auto __res = ranges::uninitialized_copy(
290 data() + __n, data() + _Nm);
291 _M_size = __res.out - data();
292 if (__res.in == ranges::end(__rg))
300 assign(size_type __n,
const _Tp& __u)
307 std::destroy_n(std::fill_n(data(), __n, __u), _M_size - __n);
312 assign(initializer_list<_Tp> __il)
313 { assign(__il.begin(), __il.end()); }
318 begin() noexcept {
return iterator(data()); }
321 constexpr const_iterator
322 begin() const noexcept {
return const_iterator(data()); }
327 {
return iterator(data() + _M_size); }
330 constexpr const_iterator
332 {
return const_iterator(data() + _M_size); }
335 constexpr reverse_iterator
337 {
return reverse_iterator(end()); }
340 constexpr const_reverse_iterator
341 rbegin() const noexcept
342 {
return const_reverse_iterator(end()); }
345 constexpr reverse_iterator
346 rend() noexcept {
return reverse_iterator(begin()); }
349 constexpr const_reverse_iterator
350 rend() const noexcept {
return const_reverse_iterator(begin()); }
353 constexpr const_iterator
354 cbegin() const noexcept {
return begin(); }
357 constexpr const_iterator
358 cend() const noexcept {
return end(); }
361 constexpr const_reverse_iterator
362 crbegin() const noexcept {
return rbegin(); }
365 constexpr const_reverse_iterator
366 crend() const noexcept {
return rend(); }
371 empty() const noexcept {
return _M_size == 0; }
375 size() const noexcept
378 __builtin_unreachable();
383 static constexpr size_type
384 max_size() noexcept {
return _Nm; }
387 static constexpr size_type
388 capacity() noexcept {
return _Nm; }
391 resize(size_type __n)
396 else if (__n < _M_size)
397 std::destroy_n(data() + __n, _M_size - __n);
402 resize(size_type __n,
const _Tp& __c)
407 else if (__n < _M_size)
408 std::destroy_n(data() + __n, _M_size - __n);
412 static constexpr void
413 reserve(size_type __n)
416 static constexpr void
422 operator[](size_type __n)
424 __glibcxx_requires_subscript(__n);
425 return _M_elems[__n];
429 constexpr const_reference
430 operator[](size_type __n)
const
432 __glibcxx_requires_subscript(__n);
433 return _M_elems[__n];
437 constexpr const_reference
438 at(size_type __n)
const
441 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
443 ">= size() (which is %zu)"),
445 return _M_elems[__n];
453 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
455 ">= size() (which is %zu)"),
457 return _M_elems[__n];
464 __glibcxx_requires_nonempty();
469 constexpr const_reference
472 __glibcxx_requires_nonempty();
480 __glibcxx_requires_nonempty();
481 return _M_elems[_M_size - 1];
485 constexpr const_reference
488 __glibcxx_requires_nonempty();
489 return _M_elems[_M_size - 1];
497 {
return static_cast<pointer
>(_M_elems); }
501 data() const noexcept
502 {
return static_cast<const_pointer
>(_M_elems); }
505 template<
typename... _Args>
507 emplace_back(_Args&&... __args)
515 push_back(
const _Tp& __x)
516 {
return emplace_back(__x); }
522 template<__detail::__container_compatible_range<_Tp> _Rg>
524 append_range(_Rg&& __rg)
526 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
528 const auto __len = ranges::distance(__rg);
529 if (__len > (_Nm - size()))
532 const size_t __sz = size_t(__len);
534 ranges::uninitialized_copy(
535 ranges::begin(__rg), unreachable_sentinel,
536 data() + _M_size, data() + _M_size + __sz);
537 _M_size += size_type(__sz);
541 ranges::subrange<pointer> __tail(data() + _M_size, data() + _Nm);
542 auto [__in, __out] = ranges::uninitialized_copy(__rg, __tail);
543 _M_size = __out - data();
544 if (__in != ranges::end(__rg))
552 __glibcxx_requires_nonempty();
554 _M_elems[_M_size].~_Tp();
557 template<
typename... _Args>
558 constexpr optional<_Tp&>
559 try_emplace_back(_Args&&... __args)
561 if (_M_size >= _Nm) [[unlikely]]
563 return optional<_Tp&>(in_place,
567 constexpr optional<_Tp&>
568 try_push_back(
const _Tp& __x)
570 if (_M_size >= _Nm) [[unlikely]]
572 return optional<_Tp&>(in_place, unchecked_emplace_back(__x));
575 constexpr optional<_Tp&>
576 try_push_back(_Tp&& __x)
578 if (_M_size >= _Nm) [[unlikely]]
580 return optional<_Tp&>(in_place, unchecked_emplace_back(
std::move(__x)));
583 template<
typename... _Args>
585 unchecked_emplace_back(_Args&&... __args)
587 __glibcxx_assert(_M_size < _Nm);
588 auto __p = std::construct_at(data() + _M_size,
595 unchecked_push_back(
const _Tp& __x)
596 {
return unchecked_emplace_back(__x); }
599 unchecked_push_back(_Tp&& __x)
600 {
return unchecked_emplace_back(
std::move(__x)); }
602 template<
typename... _Args>
604 emplace(const_iterator __position, _Args&&... __args)
606 size_t __b = __position - cbegin();
607 __glibcxx_assert(__b <= _M_size);
610 iterator __pos = begin() + __b;
613 std::rotate(__pos, end() - 1, end());
618 insert(const_iterator __position,
const _Tp& __x)
619 {
return emplace(__position, __x); }
622 insert(const_iterator __position, _Tp&& __x)
623 {
return emplace(__position,
std::move(__x)); }
626 insert(const_iterator __position, size_type __n,
const _Tp& __x)
628 size_t __b = __position - cbegin();
629 __glibcxx_assert(__b <= _M_size);
630 if ((_Nm - _M_size) < __n)
632 iterator __pos = begin() + __b;
634 if (std::__exchange(_M_size, _M_size + __n))
635 std::rotate(__pos, end() - __n, end());
639 template<__any_input_iterator _InputIterator>
641 insert(const_iterator __position, _InputIterator __first,
642 _InputIterator __last)
644 size_t __b = __position - cbegin();
645 __glibcxx_assert(__b <= _M_size);
646 iterator __pos = begin() + __b;
647 const size_t __s = _M_size;
648 if (
const auto __n = _S_distance(__first, __last))
650 if ((_Nm - _M_size) < __n)
657 while (__first != __last)
658 emplace_back(*__first++);
661 std::rotate(__pos, begin() + __s, end());
665 template<__detail::__container_compatible_range<_Tp> _Rg>
667 insert_range(const_iterator __position, _Rg&& __rg)
669 iterator __pos = begin() + (__position - cbegin());
670 const auto __end = end();
671 if constexpr (ranges::forward_range<_Rg> || ranges::sized_range<_Rg>)
673 const auto __len = ranges::distance(__rg);
674 if (__len > (_Nm - size()))
676 if (!__len) [[unlikely]]
679 const size_type __n = size_type(__len);
680 const size_type __num_after = __end - __pos;
681 if (__num_after >= __n)
683 ranges::uninitialized_move(__end - __n, __end,
684 __end, unreachable_sentinel);
686 ranges::move_backward(__pos, __end - __n, __end);
687 ranges::copy(__rg, __pos);
689 else if constexpr (ranges::forward_range<_Rg>)
691 auto __mid = ranges::next(ranges::begin(__rg), __num_after);
692 ranges::uninitialized_copy(__mid, ranges::end(__rg),
693 __end, unreachable_sentinel);
694 _M_size += __n - __num_after;
695 ranges::uninitialized_move(__pos, __end,
696 __pos + __n, unreachable_sentinel);
697 _M_size += __num_after;
698 ranges::copy(ranges::begin(__rg), __mid, __pos);
702 ranges::uninitialized_copy(
703 ranges::begin(__rg), ranges::end(__rg),
704 __end, unreachable_sentinel);
706 std::rotate(__pos, __end, end());
712 std::rotate(__pos, __end, end());
718 insert(const_iterator __position, initializer_list<_Tp> __il)
719 {
return insert(__position, __il.begin(), __il.end()); }
722 erase(const_iterator __position)
724 size_t __n = __position - cbegin();
725 __glibcxx_assert(__n < _M_size);
726 iterator __pos = begin() + __n;
733 erase(const_iterator __first, const_iterator __last)
735 size_t __n = __first - cbegin();
736 size_t __x = __last - __first;
737 __glibcxx_assert(__n <= _M_size);
738 __glibcxx_assert(__x <= _M_size);
739 iterator __pos = begin() + __n;
740 iterator __end =
std::move(__pos + __x, end(), __pos);
741 std::destroy_n(__end, __x);
747 swap(inplace_vector& __x)
748 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
751 const auto __smaller = __vs[__x.size() < size()];
752 const auto __bigger = __vs[__x.size() >= size()];
753 size_type __n = __smaller->size();
754 size_type __n2 = __bigger->size();
756 if constexpr (is_nothrow_move_constructible_v<_Tp>)
758 for (size_type __i = __n; __i < __n2; ++__i)
760 std::construct_at(__smaller->data() + __i,
762 std::destroy_at(__bigger->data() + __i);
768 __bigger->data() + __n2,
769 __smaller->data() + __n);
770 std::destroy(__bigger->data() + __n, __bigger->data() + __n2);
772 __smaller->_M_size = __n2;
773 __bigger->_M_size = __n;
776 for (size_type __i = 0; __i < __n; __i++)
777 swap(_M_elems[__i], __x._M_elems[__i]);
783 std::destroy_n(data(),
size_t(_M_size));
787 constexpr friend bool
788 operator==(
const inplace_vector& __x,
const inplace_vector& __y)
789 {
return std::equal(__x.begin(), __x.end(), __y.begin(), __y.end()); }
791 constexpr friend auto
792 operator<=>(
const inplace_vector& __x,
const inplace_vector& __y)
793 requires requires (
const _Tp __t) {
794 { __t < __t } -> __detail::__boolean_testable;
798 __y.begin(), __y.end(),
799 __detail::__synth3way);
803 constexpr friend void
804 swap(inplace_vector& __x, inplace_vector& __y)
805 noexcept(is_nothrow_swappable_v<_Tp> && is_nothrow_move_constructible_v<_Tp>)
815 template<
typename _UInt,
bool = (alignof(_Tp) <= sizeof(_UInt))>
816 static constexpr
bool __fits
817 = _Nm <= __gnu_cxx::__
int_traits<_UInt>::__max;
821 template<
typename _UInt>
822 static constexpr bool __fits<_UInt, false> =
false;
824 static consteval auto __select_size_type()
826 if constexpr (__fits<unsigned char>)
827 return (
unsigned char)0;
828#if __SHRT_WIDTH__ < __SIZE_WIDTH__
829 else if constexpr (__fits<unsigned short>)
830 return (
unsigned short)0;
832#if __INT_WIDTH__ < __SIZE_WIDTH__ && __INT_WIDTH__ > __SHRT_WIDTH__
833 else if constexpr (__fits<unsigned int>)
836#if __LONG_WIDTH__ < __SIZE_WIDTH__ && __LONG_WIDTH__ > __INT_WIDTH__
837 else if constexpr (__fits<unsigned long>)
843 decltype(__select_size_type()) _M_size = 0;
850#if __glibcxx_start_lifetime_as
851 std::start_lifetime_as_array<_Tp>(data(), _Nm);
857 if constexpr (is_trivial_v<_Tp>)
858 for (
size_t __i = 0; __i < _Nm; ++__i)
859 _M_elems[__i] = _Tp();
861 __builtin_unreachable();
865 static constexpr void
866 _S_reserve(
size_t __n)
872 template<
typename _InputIterator>
873 constexpr static auto
874 _S_distance(_InputIterator __first, _InputIterator __last)
876 if constexpr (sized_sentinel_for<_InputIterator, _InputIterator>
877 || forward_iterator<_InputIterator>)
878 return (size_type)ranges::distance(__first, __last);
879 else if constexpr (derived_from<__iter_category_t<_InputIterator>,
880 forward_iterator_tag>)
889 template<
typename _Tp>
890 class inplace_vector<_Tp, 0>
894 using value_type = _Tp;
895 using pointer = _Tp*;
896 using const_pointer =
const _Tp*;
897 using reference = value_type&;
898 using const_reference =
const value_type&;
899 using size_type = size_t;
900 using difference_type = ptrdiff_t;
902 = __gnu_cxx::__normal_iterator<_Tp*, inplace_vector>;
904 = __gnu_cxx::__normal_iterator<const _Tp*, inplace_vector>;
905 using reverse_iterator = std::reverse_iterator<iterator>;
906 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
909 inplace_vector() =
default;
912 inplace_vector(size_type __n)
919 inplace_vector(size_type __n,
const _Tp& __value)
925 template<__any_input_iterator _InputIterator>
927 inplace_vector(_InputIterator __first, _InputIterator __last)
929 if (__first != __last)
933 template <__detail::__container_compatible_range<_Tp> _Rg>
935 inplace_vector(from_range_t, _Rg&& __rg)
937 if (ranges::begin(__rg) != ranges::end(__rg))
942 inplace_vector(initializer_list<_Tp> __il)
944 if (__il.size() != 0)
948 inplace_vector(
const inplace_vector&) =
default;
949 inplace_vector(inplace_vector&&) =
default;
952 ~inplace_vector() =
default;
955 operator=(
const inplace_vector&) =
default;
958 operator=(inplace_vector&&) =
default;
960 constexpr inplace_vector&
961 operator=(initializer_list<_Tp> __il)
963 if (__il.size() != 0)
968 template<__any_input_iterator _InputIterator>
970 assign(_InputIterator __first, _InputIterator __last)
972 if (__first != __last)
976 template<__detail::__container_compatible_range<_Tp> _Rg>
978 assign_range(_Rg&& __rg)
980 if (ranges::begin(__rg) != ranges::end(__rg))
985 assign(size_type __n,
const _Tp& __u)
992 assign(initializer_list<_Tp> __il)
994 if (__il.size() != 0)
1001 begin() noexcept {
return iterator(
nullptr); }
1004 constexpr const_iterator
1005 begin() const noexcept {
return const_iterator(
nullptr); }
1009 end() noexcept {
return iterator(
nullptr); }
1012 constexpr const_iterator
1013 end() const noexcept {
return const_iterator(
nullptr); }
1016 constexpr reverse_iterator
1018 {
return reverse_iterator(end()); }
1021 constexpr const_reverse_iterator
1022 rbegin() const noexcept
1023 {
return const_reverse_iterator(end()); }
1026 constexpr reverse_iterator
1027 rend() noexcept {
return reverse_iterator(begin()); }
1030 constexpr const_reverse_iterator
1031 rend() const noexcept {
return const_reverse_iterator(begin()); }
1034 constexpr const_iterator
1035 cbegin() const noexcept {
return begin(); }
1038 constexpr const_iterator
1039 cend() const noexcept {
return end(); }
1042 constexpr const_reverse_iterator
1043 crbegin() const noexcept {
return rbegin(); }
1046 constexpr const_reverse_iterator
1047 crend() const noexcept {
return rend(); }
1052 empty() const noexcept {
return true; }
1056 size() const noexcept {
return 0; }
1059 static constexpr size_type
1060 max_size() noexcept {
return 0; }
1063 static constexpr size_type
1064 capacity() noexcept {
return 0; }
1067 resize(size_type __n)
1070 __throw_bad_alloc();
1074 resize(size_type __n,
const _Tp&)
1077 __throw_bad_alloc();
1080 static constexpr void
1081 reserve(size_type __n)
1084 __throw_bad_alloc();
1087 static constexpr void
1091 [[nodiscard,noreturn]]
1093 operator[](size_type)
1094 { __builtin_trap(); }
1096 [[nodiscard,noreturn]]
1097 constexpr const_reference
1098 operator[](size_type)
const
1099 { __builtin_trap(); }
1101 [[nodiscard,noreturn]]
1102 constexpr const_reference
1103 at(size_type __n)
const
1105 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1107 ">= size() (which is 0)"),
1111 [[nodiscard,noreturn]]
1115 std::__throw_out_of_range_fmt(__N(
"inplace_vector::at: __n "
1117 ">= size() (which is 0)"),
1121 [[nodiscard,noreturn]]
1124 { __builtin_trap(); }
1126 [[nodiscard,noreturn]]
1127 constexpr const_reference
1129 { __builtin_trap(); }
1131 [[nodiscard,noreturn]]
1134 { __builtin_trap(); }
1136 [[nodiscard,noreturn]]
1137 constexpr const_reference
1139 { __builtin_trap(); }
1149 constexpr const _Tp*
1150 data() const noexcept
1154 template<
typename... _Args>
1157 emplace_back(_Args&&...)
1158 { __throw_bad_alloc(); }
1162 push_back(
const _Tp&)
1163 { __throw_bad_alloc(); }
1168 { __throw_bad_alloc(); }
1170 template<__detail::__container_compatible_range<_Tp> _Rg>
1172 append_range(_Rg&& __rg)
1174 if (ranges::begin(__rg) != ranges::end(__rg))
1175 __throw_bad_alloc();
1181 { __builtin_trap(); }
1183 template<
typename... _Args>
1184 constexpr optional<_Tp&>
1185 try_emplace_back(_Args&&...)
1188 constexpr optional<_Tp&>
1189 try_push_back(
const _Tp&)
1192 constexpr optional<_Tp&>
1193 try_push_back(_Tp&&)
1196 template<
typename... _Args>
1199 unchecked_emplace_back(_Args&&...)
1200 { __builtin_trap(); }
1204 unchecked_push_back(
const _Tp&)
1205 { __builtin_trap(); }
1209 unchecked_push_back(_Tp&&)
1210 { __builtin_trap(); }
1212 template<
typename... _Args>
1215 emplace(const_iterator, _Args&&...)
1216 { __throw_bad_alloc(); }
1220 insert(const_iterator,
const _Tp&)
1221 { __throw_bad_alloc(); }
1225 insert(const_iterator, _Tp&&)
1226 { __throw_bad_alloc(); }
1229 insert(const_iterator, size_type __n,
const _Tp&)
1232 __throw_bad_alloc();
1236 template<
typename _InputIterator>
1238 insert(const_iterator, _InputIterator __first, _InputIterator __last)
1240 if (__first != __last)
1241 __throw_bad_alloc();
1245 template<__detail::__container_compatible_range<_Tp> _Rg>
1247 insert_range(const_iterator, _Rg&& __rg)
1249 if (ranges::begin(__rg) != ranges::end(__rg))
1250 __throw_bad_alloc();
1255 insert(const_iterator, initializer_list<_Tp> __il)
1257 if (__il.size() != 0)
1258 __throw_bad_alloc();
1264 erase(const_iterator)
1265 { __builtin_trap(); }
1268 erase(const_iterator __first, const_iterator __last)
1270 __glibcxx_assert(__first == __last);
1275 swap(inplace_vector& __x)
1283 constexpr friend bool
1284 operator==(
const inplace_vector&,
const inplace_vector&)
1287 constexpr friend auto
1288 operator<=>(
const inplace_vector&,
const inplace_vector&)
1289 requires requires (
const _Tp __t) {
1290 { __t < __t } -> __detail::__boolean_testable;
1292 {
return std::strong_ordering::equal; }
1298 constexpr friend void
1299 swap(inplace_vector&, inplace_vector&)
noexcept
1303_GLIBCXX_END_NAMESPACE_CONTAINER
1305 template<
typename _Tp,
size_t _Nm,
typename _Predicate>
1307 erase_if(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
1310 if constexpr (_Nm != 0)
1311 return __detail::__erase_if(__cont, __cont,
std::move(__pred));
1316 template<
typename _Tp,
size_t _Nm,
typename _Up = _Tp>
1318 erase(_GLIBCXX_STD_C::inplace_vector<_Tp, _Nm>& __cont,
const _Up& __value)
1319 {
return std::erase_if(__cont, __gnu_cxx::__ops::__equal_to(__value)); }
1321_GLIBCXX_END_NAMESPACE_VERSION
1324#ifdef _GLIBCXX_DEBUG
1325# 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)