31#define _RANGES_ALGO_H 1
33#if __cplusplus > 201703L
35#if __cplusplus > 202002L
43namespace std _GLIBCXX_VISIBILITY(default)
45_GLIBCXX_BEGIN_NAMESPACE_VERSION
50 template<
typename _Comp,
typename _Proj>
52 __make_comp_proj(_Comp& __comp, _Proj& __proj)
54 return [&] (
auto&& __lhs,
auto&& __rhs) ->
bool {
55 using _TL =
decltype(__lhs);
56 using _TR =
decltype(__rhs);
63 template<
typename _Pred,
typename _Proj>
65 __make_pred_proj(_Pred& __pred, _Proj& __proj)
67 return [&] <
typename _Tp> (_Tp&& __arg) ->
bool {
76 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
77 typename _Proj =
identity,
78 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
80 operator()(_Iter __first, _Sent __last,
81 _Pred __pred, _Proj __proj = {})
const
83 for (; __first != __last; ++__first)
89 template<input_range _Range,
typename _Proj = identity,
90 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>>
93 operator()(_Range&& __r, _Pred __pred, _Proj __proj = {})
const
95 return (*
this)(ranges::begin(__r), ranges::end(__r),
100 inline constexpr __all_of_fn all_of{};
104 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
105 typename _Proj =
identity,
106 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
108 operator()(_Iter __first, _Sent __last,
109 _Pred __pred, _Proj __proj = {})
const
111 for (; __first != __last; ++__first)
117 template<input_range _Range,
typename _Proj = identity,
118 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>>
121 operator()(_Range&& __r, _Pred __pred, _Proj __proj = {})
const
123 return (*
this)(ranges::begin(__r), ranges::end(__r),
128 inline constexpr __any_of_fn any_of{};
132 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
133 typename _Proj =
identity,
134 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
136 operator()(_Iter __first, _Sent __last,
137 _Pred __pred, _Proj __proj = {})
const
139 for (; __first != __last; ++__first)
145 template<input_range _Range,
typename _Proj = identity,
146 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>>
149 operator()(_Range&& __r, _Pred __pred, _Proj __proj = {})
const
151 return (*
this)(ranges::begin(__r), ranges::end(__r),
156 inline constexpr __none_of_fn none_of{};
158 template<
typename _Iter,
typename _Fp>
161 [[no_unique_address]] _Iter in;
162 [[no_unique_address]] _Fp fun;
164 template<
typename _Iter2,
typename _F2p>
165 requires convertible_to<const _Iter&, _Iter2>
166 && convertible_to<const _Fp&, _F2p>
168 operator in_fun_result<_Iter2, _F2p>() const &
169 {
return {in, fun}; }
171 template<
typename _Iter2,
typename _F2p>
172 requires convertible_to<_Iter, _Iter2> && convertible_to<_Fp, _F2p>
174 operator in_fun_result<_Iter2, _F2p>() &&
178 template<
typename _Iter,
typename _Fp>
179 using for_each_result = in_fun_result<_Iter, _Fp>;
183 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
184 typename _Proj =
identity,
185 indirectly_unary_invocable<projected<_Iter, _Proj>> _Fun>
186 constexpr for_each_result<_Iter, _Fun>
187 operator()(_Iter __first, _Sent __last, _Fun __f, _Proj __proj = {})
const
189 for (; __first != __last; ++__first)
194 template<input_range _Range,
typename _Proj = identity,
195 indirectly_unary_invocable<projected<iterator_t<_Range>, _Proj>>
197 constexpr for_each_result<borrowed_iterator_t<_Range>, _Fun>
198 operator()(_Range&& __r, _Fun __f, _Proj __proj = {})
const
200 return (*
this)(ranges::begin(__r), ranges::end(__r),
205 inline constexpr __for_each_fn for_each{};
207 template<
typename _Iter,
typename _Fp>
208 using for_each_n_result = in_fun_result<_Iter, _Fp>;
210 struct __for_each_n_fn
212 template<input_iterator _Iter,
typename _Proj = identity,
213 indirectly_unary_invocable<projected<_Iter, _Proj>> _Fun>
214 constexpr for_each_n_result<_Iter, _Fun>
215 operator()(_Iter __first, iter_difference_t<_Iter> __n,
216 _Fun __f, _Proj __proj = {})
const
218 if constexpr (random_access_iterator<_Iter>)
222 auto __last = __first + __n;
238 inline constexpr __for_each_n_fn for_each_n{};
242 struct __find_first_of_fn
244 template<input_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
245 forward_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
246 typename _Pred = ranges::equal_to,
247 typename _Proj1 =
identity,
typename _Proj2 =
identity>
248 requires indirectly_comparable<_Iter1, _Iter2, _Pred, _Proj1, _Proj2>
250 operator()(_Iter1 __first1, _Sent1 __last1,
251 _Iter2 __first2, _Sent2 __last2, _Pred __pred = {},
252 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
254 for (; __first1 != __last1; ++__first1)
255 for (
auto __iter = __first2; __iter != __last2; ++__iter)
263 template<input_range _Range1, forward_range _Range2,
264 typename _Pred = ranges::equal_to,
265 typename _Proj1 = identity,
typename _Proj2 = identity>
266 requires indirectly_comparable<iterator_t<_Range1>, iterator_t<_Range2>,
267 _Pred, _Proj1, _Proj2>
268 constexpr borrowed_iterator_t<_Range1>
269 operator()(_Range1&& __r1, _Range2&& __r2, _Pred __pred = {},
270 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
272 return (*
this)(ranges::begin(__r1), ranges::end(__r1),
273 ranges::begin(__r2), ranges::end(__r2),
279 inline constexpr __find_first_of_fn find_first_of{};
283 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
284 typename _Tp,
typename _Proj =
identity>
285 requires indirect_binary_predicate<ranges::equal_to,
288 constexpr iter_difference_t<_Iter>
289 operator()(_Iter __first, _Sent __last,
290 const _Tp& __value, _Proj __proj = {})
const
292 iter_difference_t<_Iter> __n = 0;
293 for (; __first != __last; ++__first)
299 template<input_range _Range,
typename _Tp,
typename _Proj =
identity>
300 requires indirect_binary_predicate<ranges::equal_to,
303 constexpr range_difference_t<_Range>
304 operator()(_Range&& __r,
const _Tp& __value, _Proj __proj = {})
const
306 return (*
this)(ranges::begin(__r), ranges::end(__r),
311 inline constexpr __count_fn count{};
315 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
316 typename _Proj =
identity,
317 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
318 constexpr iter_difference_t<_Iter>
319 operator()(_Iter __first, _Sent __last,
320 _Pred __pred, _Proj __proj = {})
const
322 iter_difference_t<_Iter> __n = 0;
323 for (; __first != __last; ++__first)
329 template<input_range _Range,
330 typename _Proj = identity,
331 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>>
333 constexpr range_difference_t<_Range>
334 operator()(_Range&& __r, _Pred __pred, _Proj __proj = {})
const
336 return (*
this)(ranges::begin(__r), ranges::end(__r),
341 inline constexpr __count_if_fn count_if{};
347 template<forward_iterator _Iter, sentinel_for<_Iter> _Sent,
typename _Tp,
348 typename _Pred = ranges::equal_to,
typename _Proj =
identity>
349 requires indirectly_comparable<_Iter, const _Tp*, _Pred, _Proj>
350 constexpr subrange<_Iter>
351 operator()(_Iter __first, _Sent __last, iter_difference_t<_Iter> __count,
352 const _Tp& __value, _Pred __pred = {}, _Proj __proj = {})
const
355 return {__first, __first};
357 auto __value_comp = [&] <
typename _Rp> (_Rp&& __arg) ->
bool {
362 __first = ranges::find_if(
std::move(__first), __last,
365 if (__first == __last)
366 return {__first, __first};
369 auto __end = __first;
370 return {__first, ++__end};
374 if constexpr (sized_sentinel_for<_Sent, _Iter>
375 && random_access_iterator<_Iter>)
377 auto __tail_size = __last - __first;
378 auto __remainder = __count;
380 while (__remainder <= __tail_size)
382 __first += __remainder;
383 __tail_size -= __remainder;
384 auto __backtrack = __first;
387 if (--__remainder == 0)
388 return {__first - __count, __first};
390 __remainder = __count + 1 - (__first - __backtrack);
392 auto __i = __first + __tail_size;
397 __first = ranges::find_if(__first, __last, __value_comp, __proj);
398 while (__first != __last)
403 while (__i != __last && __n != 1
410 return {__first, __i};
413 __first = ranges::find_if(++__i, __last, __value_comp, __proj);
415 return {__first, __first};
419 template<forward_range _Range,
typename _Tp,
420 typename _Pred = ranges::equal_to,
typename _Proj = identity>
421 requires indirectly_comparable<iterator_t<_Range>,
const _Tp*,
423 constexpr borrowed_subrange_t<_Range>
424 operator()(_Range&& __r, range_difference_t<_Range> __count,
425 const _Tp& __value, _Pred __pred = {}, _Proj __proj = {})
const
427 return (*
this)(ranges::begin(__r), ranges::end(__r),
433 inline constexpr __search_n_fn search_n{};
437 template<forward_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
438 forward_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
439 typename _Pred = ranges::equal_to,
440 typename _Proj1 =
identity,
typename _Proj2 =
identity>
441 requires indirectly_comparable<_Iter1, _Iter2, _Pred, _Proj1, _Proj2>
442 constexpr subrange<_Iter1>
443 operator()(_Iter1 __first1, _Sent1 __last1,
444 _Iter2 __first2, _Sent2 __last2, _Pred __pred = {},
445 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
447 if constexpr (bidirectional_iterator<_Iter1>
448 && bidirectional_iterator<_Iter2>)
450 auto __i1 = ranges::next(__first1, __last1);
451 auto __i2 = ranges::next(__first2, __last2);
453 = ranges::search(reverse_iterator<_Iter1>{__i1},
454 reverse_iterator<_Iter1>{__first1},
455 reverse_iterator<_Iter2>{__i2},
456 reverse_iterator<_Iter2>{__first2},
459 auto __result_first = ranges::end(__rresult).base();
460 auto __result_last = ranges::begin(__rresult).base();
461 if (__result_last == __first1)
464 return {__result_first, __result_last};
468 auto __i = ranges::next(__first1, __last1);
469 if (__first2 == __last2)
472 auto __result_begin = __i;
473 auto __result_end = __i;
476 auto __new_range = ranges::search(__first1, __last1,
478 __pred, __proj1, __proj2);
479 auto __new_result_begin = ranges::begin(__new_range);
480 auto __new_result_end = ranges::end(__new_range);
481 if (__new_result_begin == __last1)
482 return {__result_begin, __result_end};
485 __result_begin = __new_result_begin;
486 __result_end = __new_result_end;
487 __first1 = __result_begin;
494 template<forward_range _Range1, forward_range _Range2,
495 typename _Pred = ranges::equal_to,
496 typename _Proj1 = identity,
typename _Proj2 = identity>
497 requires indirectly_comparable<iterator_t<_Range1>, iterator_t<_Range2>,
498 _Pred, _Proj1, _Proj2>
499 constexpr borrowed_subrange_t<_Range1>
500 operator()(_Range1&& __r1, _Range2&& __r2, _Pred __pred = {},
501 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
503 return (*
this)(ranges::begin(__r1), ranges::end(__r1),
504 ranges::begin(__r2), ranges::end(__r2),
510 inline constexpr __find_end_fn find_end{};
514 struct __is_permutation_fn
516 template<forward_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
517 forward_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
518 typename _Proj1 =
identity,
typename _Proj2 =
identity,
519 indirect_equivalence_relation<projected<_Iter1, _Proj1>,
520 projected<_Iter2, _Proj2>> _Pred
523 operator()(_Iter1 __first1, _Sent1 __last1,
524 _Iter2 __first2, _Sent2 __last2, _Pred __pred = {},
525 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
527 constexpr bool __sized_iters
528 = (sized_sentinel_for<_Sent1, _Iter1>
529 && sized_sentinel_for<_Sent2, _Iter2>);
530 if constexpr (__sized_iters)
532 auto __d1 = ranges::distance(__first1, __last1);
533 auto __d2 = ranges::distance(__first2, __last2);
540 for (; __first1 != __last1 && __first2 != __last2;
541 ++__first1, (void)++__first2)
547 if constexpr (__sized_iters)
549 if (__first1 == __last1)
554 auto __d1 = ranges::distance(__first1, __last1);
555 auto __d2 = ranges::distance(__first2, __last2);
556 if (__d1 == 0 && __d2 == 0)
562 for (
auto __scan = __first1; __scan != __last1; ++__scan)
564 auto&& __scan_deref = *__scan;
567 auto __comp_scan = [&] <
typename _Tp> (_Tp&& __arg) ->
bool {
572 if (__scan != ranges::find_if(__first1, __scan,
573 __comp_scan, __proj1))
576 auto __matches = ranges::count_if(__first2, __last2,
577 __comp_scan, __proj2);
579 || ranges::count_if(__scan, __last1,
580 __comp_scan, __proj1) != __matches)
586 template<forward_range _Range1, forward_range _Range2,
587 typename _Proj1 = identity,
typename _Proj2 = identity,
588 indirect_equivalence_relation<
592 operator()(_Range1&& __r1, _Range2&& __r2, _Pred __pred = {},
593 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
595 return (*
this)(ranges::begin(__r1), ranges::end(__r1),
596 ranges::begin(__r2), ranges::end(__r2),
602 inline constexpr __is_permutation_fn is_permutation{};
604 template<
typename _Iter,
typename _Out>
605 using copy_if_result = in_out_result<_Iter, _Out>;
609 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
610 weakly_incrementable _Out,
typename _Proj =
identity,
611 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
612 requires indirectly_copyable<_Iter, _Out>
613 constexpr copy_if_result<_Iter, _Out>
614 operator()(_Iter __first, _Sent __last, _Out __result,
615 _Pred __pred, _Proj __proj = {})
const
617 for (; __first != __last; ++__first)
620 *__result = *__first;
626 template<input_range _Range, weakly_incrementable _Out,
627 typename _Proj = identity,
628 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>>
630 requires indirectly_copyable<iterator_t<_Range>, _Out>
631 constexpr copy_if_result<borrowed_iterator_t<_Range>, _Out>
632 operator()(_Range&& __r, _Out __result,
633 _Pred __pred, _Proj __proj = {})
const
635 return (*
this)(ranges::begin(__r), ranges::end(__r),
641 inline constexpr __copy_if_fn copy_if{};
643 template<
typename _Iter1,
typename _Iter2>
644 using swap_ranges_result = in_in_result<_Iter1, _Iter2>;
646 struct __swap_ranges_fn
648 template<input_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
649 input_iterator _Iter2, sentinel_for<_Iter2> _Sent2>
650 requires indirectly_swappable<_Iter1, _Iter2>
651 constexpr swap_ranges_result<_Iter1, _Iter2>
652 operator()(_Iter1 __first1, _Sent1 __last1,
653 _Iter2 __first2, _Sent2 __last2)
const
655 for (; __first1 != __last1 && __first2 != __last2;
656 ++__first1, (void)++__first2)
657 ranges::iter_swap(__first1, __first2);
661 template<input_range _Range1, input_range _Range2>
662 requires indirectly_swappable<iterator_t<_Range1>, iterator_t<_Range2>>
663 constexpr swap_ranges_result<borrowed_iterator_t<_Range1>,
664 borrowed_iterator_t<_Range2>>
665 operator()(_Range1&& __r1, _Range2&& __r2)
const
667 return (*
this)(ranges::begin(__r1), ranges::end(__r1),
668 ranges::begin(__r2), ranges::end(__r2));
672 inline constexpr __swap_ranges_fn swap_ranges{};
674 template<
typename _Iter,
typename _Out>
675 using unary_transform_result = in_out_result<_Iter, _Out>;
677 template<
typename _Iter1,
typename _Iter2,
typename _Out>
678 struct in_in_out_result
680 [[no_unique_address]] _Iter1 in1;
681 [[no_unique_address]] _Iter2 in2;
682 [[no_unique_address]] _Out out;
684 template<
typename _IIter1,
typename _IIter2,
typename _OOut>
685 requires convertible_to<const _Iter1&, _IIter1>
686 && convertible_to<const _Iter2&, _IIter2>
687 && convertible_to<const _Out&, _OOut>
689 operator in_in_out_result<_IIter1, _IIter2, _OOut>() const &
690 {
return {in1, in2, out}; }
692 template<
typename _IIter1,
typename _IIter2,
typename _OOut>
693 requires convertible_to<_Iter1, _IIter1>
694 && convertible_to<_Iter2, _IIter2>
695 && convertible_to<_Out, _OOut>
697 operator in_in_out_result<_IIter1, _IIter2, _OOut>() &&
701 template<
typename _Iter1,
typename _Iter2,
typename _Out>
702 using binary_transform_result = in_in_out_result<_Iter1, _Iter2, _Out>;
704 struct __transform_fn
706 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
707 weakly_incrementable _Out,
708 copy_constructible _Fp,
typename _Proj =
identity>
709 requires indirectly_writable<_Out,
710 indirect_result_t<_Fp&,
712 constexpr unary_transform_result<_Iter, _Out>
713 operator()(_Iter __first1, _Sent __last1, _Out __result,
714 _Fp __op, _Proj __proj = {})
const
716 for (; __first1 != __last1; ++__first1, (void)++__result)
721 template<input_range _Range, weakly_incrementable _Out,
722 copy_constructible _Fp,
typename _Proj = identity>
723 requires indirectly_writable<_Out,
724 indirect_result_t<_Fp&,
726 constexpr unary_transform_result<borrowed_iterator_t<_Range>, _Out>
727 operator()(_Range&& __r, _Out __result, _Fp __op, _Proj __proj = {})
const
729 return (*
this)(ranges::begin(__r), ranges::end(__r),
734 template<input_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
735 input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
736 weakly_incrementable _Out, copy_constructible _Fp,
737 typename _Proj1 =
identity,
typename _Proj2 =
identity>
738 requires indirectly_writable<_Out,
739 indirect_result_t<_Fp&,
742 constexpr binary_transform_result<_Iter1, _Iter2, _Out>
743 operator()(_Iter1 __first1, _Sent1 __last1,
744 _Iter2 __first2, _Sent2 __last2,
745 _Out __result, _Fp __binary_op,
746 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
748 for (; __first1 != __last1 && __first2 != __last2;
749 ++__first1, (void)++__first2, ++__result)
756 template<input_range _Range1, input_range _Range2,
757 weakly_incrementable _Out, copy_constructible _Fp,
758 typename _Proj1 = identity,
typename _Proj2 = identity>
759 requires indirectly_writable<_Out,
760 indirect_result_t<_Fp&,
763 constexpr binary_transform_result<borrowed_iterator_t<_Range1>,
764 borrowed_iterator_t<_Range2>, _Out>
765 operator()(_Range1&& __r1, _Range2&& __r2, _Out __result, _Fp __binary_op,
766 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
768 return (*
this)(ranges::begin(__r1), ranges::end(__r1),
769 ranges::begin(__r2), ranges::end(__r2),
775 inline constexpr __transform_fn transform{};
779 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
780 typename _Tp1,
typename _Tp2,
typename _Proj =
identity>
781 requires indirectly_writable<_Iter, const _Tp2&>
782 && indirect_binary_predicate<ranges::equal_to, projected<_Iter, _Proj>,
785 operator()(_Iter __first, _Sent __last,
786 const _Tp1& __old_value,
const _Tp2& __new_value,
787 _Proj __proj = {})
const
789 for (; __first != __last; ++__first)
791 *__first = __new_value;
795 template<input_range _Range,
796 typename _Tp1,
typename _Tp2,
typename _Proj = identity>
797 requires indirectly_writable<iterator_t<_Range>,
const _Tp2&>
798 && indirect_binary_predicate<ranges::equal_to,
801 constexpr borrowed_iterator_t<_Range>
802 operator()(_Range&& __r,
803 const _Tp1& __old_value,
const _Tp2& __new_value,
804 _Proj __proj = {})
const
806 return (*
this)(ranges::begin(__r), ranges::end(__r),
807 __old_value, __new_value,
std::move(__proj));
811 inline constexpr __replace_fn replace{};
813 struct __replace_if_fn
815 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
816 typename _Tp,
typename _Proj =
identity,
817 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
818 requires indirectly_writable<_Iter, const _Tp&>
820 operator()(_Iter __first, _Sent __last,
821 _Pred __pred,
const _Tp& __new_value, _Proj __proj = {})
const
823 for (; __first != __last; ++__first)
825 *__first = __new_value;
829 template<input_range _Range,
typename _Tp,
typename _Proj = identity,
830 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>>
832 requires indirectly_writable<iterator_t<_Range>,
const _Tp&>
833 constexpr borrowed_iterator_t<_Range>
834 operator()(_Range&& __r,
835 _Pred __pred,
const _Tp& __new_value, _Proj __proj = {})
const
837 return (*
this)(ranges::begin(__r), ranges::end(__r),
842 inline constexpr __replace_if_fn replace_if{};
844 template<
typename _Iter,
typename _Out>
845 using replace_copy_result = in_out_result<_Iter, _Out>;
847 struct __replace_copy_fn
849 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
850 typename _Tp1,
typename _Tp2, output_iterator<const _Tp2&> _Out,
851 typename _Proj =
identity>
852 requires indirectly_copyable<_Iter, _Out>
853 && indirect_binary_predicate<ranges::equal_to,
855 constexpr replace_copy_result<_Iter, _Out>
856 operator()(_Iter __first, _Sent __last, _Out __result,
857 const _Tp1& __old_value,
const _Tp2& __new_value,
858 _Proj __proj = {})
const
860 for (; __first != __last; ++__first, (void)++__result)
862 *__result = __new_value;
864 *__result = *__first;
868 template<input_range _Range,
typename _Tp1,
typename _Tp2,
869 output_iterator<const _Tp2&> _Out,
typename _Proj = identity>
870 requires indirectly_copyable<iterator_t<_Range>, _Out>
871 && indirect_binary_predicate<ranges::equal_to,
874 constexpr replace_copy_result<borrowed_iterator_t<_Range>, _Out>
875 operator()(_Range&& __r, _Out __result,
876 const _Tp1& __old_value,
const _Tp2& __new_value,
877 _Proj __proj = {})
const
879 return (*
this)(ranges::begin(__r), ranges::end(__r),
885 inline constexpr __replace_copy_fn replace_copy{};
887 template<
typename _Iter,
typename _Out>
888 using replace_copy_if_result = in_out_result<_Iter, _Out>;
890 struct __replace_copy_if_fn
892 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
893 typename _Tp, output_iterator<const _Tp&> _Out,
894 typename _Proj =
identity,
895 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
896 requires indirectly_copyable<_Iter, _Out>
897 constexpr replace_copy_if_result<_Iter, _Out>
898 operator()(_Iter __first, _Sent __last, _Out __result,
899 _Pred __pred,
const _Tp& __new_value, _Proj __proj = {})
const
901 for (; __first != __last; ++__first, (void)++__result)
903 *__result = __new_value;
905 *__result = *__first;
909 template<input_range _Range,
910 typename _Tp, output_iterator<const _Tp&> _Out,
911 typename _Proj = identity,
912 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>>
914 requires indirectly_copyable<iterator_t<_Range>, _Out>
915 constexpr replace_copy_if_result<borrowed_iterator_t<_Range>, _Out>
916 operator()(_Range&& __r, _Out __result,
917 _Pred __pred,
const _Tp& __new_value, _Proj __proj = {})
const
919 return (*
this)(ranges::begin(__r), ranges::end(__r),
925 inline constexpr __replace_copy_if_fn replace_copy_if{};
927 struct __generate_n_fn
929 template<input_or_output_iterator _Out, copy_constructible _Fp>
930 requires invocable<_Fp&>
931 && indirectly_writable<_Out, invoke_result_t<_Fp&>>
933 operator()(_Out __first, iter_difference_t<_Out> __n, _Fp __gen)
const
935 for (; __n > 0; --__n, (void)++__first)
941 inline constexpr __generate_n_fn generate_n{};
945 template<input_or_output_iterator _Out, sentinel_for<_Out> _Sent,
946 copy_constructible _Fp>
947 requires invocable<_Fp&>
948 && indirectly_writable<_Out, invoke_result_t<_Fp&>>
950 operator()(_Out __first, _Sent __last, _Fp __gen)
const
952 for (; __first != __last; ++__first)
957 template<
typename _Range, copy_constructible _Fp>
958 requires invocable<_Fp&> && output_range<_Range, invoke_result_t<_Fp&>>
959 constexpr borrowed_iterator_t<_Range>
960 operator()(_Range&& __r, _Fp __gen)
const
962 return (*
this)(ranges::begin(__r), ranges::end(__r),
std::move(__gen));
966 inline constexpr __generate_fn generate{};
968 struct __remove_if_fn
970 template<permutable _Iter, sentinel_for<_Iter> _Sent,
971 typename _Proj =
identity,
972 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
973 constexpr subrange<_Iter>
974 operator()(_Iter __first, _Sent __last,
975 _Pred __pred, _Proj __proj = {})
const
977 __first = ranges::find_if(__first, __last, __pred, __proj);
978 if (__first == __last)
979 return {__first, __first};
981 auto __result = __first;
983 for (; __first != __last; ++__first)
990 return {__result, __first};
993 template<forward_range _Range,
typename _Proj = identity,
994 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>>
996 requires permutable<iterator_t<_Range>>
997 constexpr borrowed_subrange_t<_Range>
998 operator()(_Range&& __r, _Pred __pred, _Proj __proj = {})
const
1000 return (*
this)(ranges::begin(__r), ranges::end(__r),
1005 inline constexpr __remove_if_fn remove_if{};
1009 template<permutable _Iter, sentinel_for<_Iter> _Sent,
1010 typename _Tp,
typename _Proj =
identity>
1011 requires indirect_binary_predicate<ranges::equal_to,
1014 constexpr subrange<_Iter>
1015 operator()(_Iter __first, _Sent __last,
1016 const _Tp& __value, _Proj __proj = {})
const
1018 auto __pred = [&] (
auto&& __arg) ->
bool {
1021 return ranges::remove_if(__first, __last,
1025 template<forward_range _Range,
typename _Tp,
typename _Proj =
identity>
1026 requires permutable<iterator_t<_Range>>
1027 && indirect_binary_predicate<ranges::equal_to,
1030 constexpr borrowed_subrange_t<_Range>
1031 operator()(_Range&& __r,
const _Tp& __value, _Proj __proj = {})
const
1033 return (*
this)(ranges::begin(__r), ranges::end(__r),
1038 inline constexpr __remove_fn remove{};
1040 template<
typename _Iter,
typename _Out>
1041 using remove_copy_if_result = in_out_result<_Iter, _Out>;
1043 struct __remove_copy_if_fn
1045 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
1046 weakly_incrementable _Out,
typename _Proj =
identity,
1047 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
1048 requires indirectly_copyable<_Iter, _Out>
1049 constexpr remove_copy_if_result<_Iter, _Out>
1050 operator()(_Iter __first, _Sent __last, _Out __result,
1051 _Pred __pred, _Proj __proj = {})
const
1053 for (; __first != __last; ++__first)
1056 *__result = *__first;
1062 template<input_range _Range, weakly_incrementable _Out,
1063 typename _Proj = identity,
1064 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>>
1066 requires indirectly_copyable<iterator_t<_Range>, _Out>
1067 constexpr remove_copy_if_result<borrowed_iterator_t<_Range>, _Out>
1068 operator()(_Range&& __r, _Out __result,
1069 _Pred __pred, _Proj __proj = {})
const
1071 return (*
this)(ranges::begin(__r), ranges::end(__r),
1077 inline constexpr __remove_copy_if_fn remove_copy_if{};
1079 template<
typename _Iter,
typename _Out>
1080 using remove_copy_result = in_out_result<_Iter, _Out>;
1082 struct __remove_copy_fn
1084 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
1085 weakly_incrementable _Out,
typename _Tp,
typename _Proj =
identity>
1086 requires indirectly_copyable<_Iter, _Out>
1087 && indirect_binary_predicate<ranges::equal_to,
1090 constexpr remove_copy_result<_Iter, _Out>
1091 operator()(_Iter __first, _Sent __last, _Out __result,
1092 const _Tp& __value, _Proj __proj = {})
const
1094 for (; __first != __last; ++__first)
1097 *__result = *__first;
1103 template<input_range _Range, weakly_incrementable _Out,
1104 typename _Tp,
typename _Proj = identity>
1105 requires indirectly_copyable<iterator_t<_Range>, _Out>
1106 && indirect_binary_predicate<ranges::equal_to,
1109 constexpr remove_copy_result<borrowed_iterator_t<_Range>, _Out>
1110 operator()(_Range&& __r, _Out __result,
1111 const _Tp& __value, _Proj __proj = {})
const
1113 return (*
this)(ranges::begin(__r), ranges::end(__r),
1118 inline constexpr __remove_copy_fn remove_copy{};
1122 template<permutable _Iter, sentinel_for<_Iter> _Sent,
1123 typename _Proj =
identity,
1124 indirect_equivalence_relation<
1125 projected<_Iter, _Proj>> _Comp = ranges::equal_to>
1126 constexpr subrange<_Iter>
1127 operator()(_Iter __first, _Sent __last,
1128 _Comp __comp = {}, _Proj __proj = {})
const
1130 __first = ranges::adjacent_find(__first, __last, __comp, __proj);
1131 if (__first == __last)
1132 return {__first, __first};
1134 auto __dest = __first;
1136 while (++__first != __last)
1141 return {++__dest, __first};
1144 template<forward_range _Range,
typename _Proj = identity,
1145 indirect_equivalence_relation<
1147 requires permutable<iterator_t<_Range>>
1148 constexpr borrowed_subrange_t<_Range>
1149 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
1151 return (*
this)(ranges::begin(__r), ranges::end(__r),
1156 inline constexpr __unique_fn unique{};
1160 template<
typename _Out,
typename _Tp>
1161 concept __can_reread_output = input_iterator<_Out>
1162 && same_as<_Tp, iter_value_t<_Out>>;
1165 template<
typename _Iter,
typename _Out>
1166 using unique_copy_result = in_out_result<_Iter, _Out>;
1168 struct __unique_copy_fn
1170 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
1171 weakly_incrementable _Out,
typename _Proj =
identity,
1172 indirect_equivalence_relation<
1173 projected<_Iter, _Proj>> _Comp = ranges::equal_to>
1174 requires indirectly_copyable<_Iter, _Out>
1175 && (forward_iterator<_Iter>
1176 || __detail::__can_reread_output<_Out, iter_value_t<_Iter>>
1177 || indirectly_copyable_storable<_Iter, _Out>)
1178 constexpr unique_copy_result<_Iter, _Out>
1179 operator()(_Iter __first, _Sent __last, _Out __result,
1180 _Comp __comp = {}, _Proj __proj = {})
const
1182 if (__first == __last)
1186 if constexpr (forward_iterator<_Iter>)
1188 auto __next = __first;
1189 *__result = *__next;
1190 while (++__next != __last)
1196 *++__result = *__first;
1200 else if constexpr (__detail::__can_reread_output<_Out, iter_value_t<_Iter>>)
1202 *__result = *__first;
1203 while (++__first != __last)
1207 *++__result = *__first;
1212 auto __value = *__first;
1213 *__result = __value;
1214 while (++__first != __last)
1221 *++__result = __value;
1228 template<input_range _Range,
1229 weakly_incrementable _Out,
typename _Proj = identity,
1230 indirect_equivalence_relation<
1232 requires indirectly_copyable<iterator_t<_Range>, _Out>
1233 && (forward_iterator<iterator_t<_Range>>
1234 || __detail::__can_reread_output<_Out, range_value_t<_Range>>
1235 || indirectly_copyable_storable<iterator_t<_Range>, _Out>)
1236 constexpr unique_copy_result<borrowed_iterator_t<_Range>, _Out>
1237 operator()(_Range&& __r, _Out __result,
1238 _Comp __comp = {}, _Proj __proj = {})
const
1240 return (*
this)(ranges::begin(__r), ranges::end(__r),
1246 inline constexpr __unique_copy_fn unique_copy{};
1250 template<b
idirectional_iterator _Iter, sentinel_for<_Iter> _Sent>
1251 requires permutable<_Iter>
1253 operator()(_Iter __first, _Sent __last)
const
1255 auto __i = ranges::next(__first, __last);
1258 if constexpr (random_access_iterator<_Iter>)
1260 if (__first != __last)
1263 while (__first < __tail)
1265 ranges::iter_swap(__first, __tail);
1275 if (__first == __tail || __first == --__tail)
1279 ranges::iter_swap(__first, __tail);
1286 template<b
idirectional_range _Range>
1287 requires permutable<iterator_t<_Range>>
1288 constexpr borrowed_iterator_t<_Range>
1289 operator()(_Range&& __r)
const
1291 return (*
this)(ranges::begin(__r), ranges::end(__r));
1295 inline constexpr __reverse_fn reverse{};
1297 template<
typename _Iter,
typename _Out>
1298 using reverse_copy_result = in_out_result<_Iter, _Out>;
1300 struct __reverse_copy_fn
1302 template<b
idirectional_iterator _Iter, sentinel_for<_Iter> _Sent,
1303 weakly_incrementable _Out>
1304 requires indirectly_copyable<_Iter, _Out>
1305 constexpr reverse_copy_result<_Iter, _Out>
1306 operator()(_Iter __first, _Sent __last, _Out __result)
const
1308 auto __i = ranges::next(__first, __last);
1310 while (__first != __tail)
1313 *__result = *__tail;
1319 template<b
idirectional_range _Range, weakly_incrementable _Out>
1320 requires indirectly_copyable<iterator_t<_Range>, _Out>
1321 constexpr reverse_copy_result<borrowed_iterator_t<_Range>, _Out>
1322 operator()(_Range&& __r, _Out __result)
const
1324 return (*
this)(ranges::begin(__r), ranges::end(__r),
1329 inline constexpr __reverse_copy_fn reverse_copy{};
1333 template<permutable _Iter, sentinel_for<_Iter> _Sent>
1334 constexpr subrange<_Iter>
1335 operator()(_Iter __first, _Iter __middle, _Sent __last)
const
1337 auto __lasti = ranges::next(__first, __last);
1338 if (__first == __middle)
1339 return {__lasti, __lasti};
1340 if (__last == __middle)
1343 if constexpr (random_access_iterator<_Iter>)
1345 auto __n = __lasti - __first;
1346 auto __k = __middle - __first;
1348 if (__k == __n - __k)
1350 ranges::swap_ranges(__first, __middle, __middle, __middle + __k);
1355 auto __ret = __first + (__lasti - __middle);
1359 if (__k < __n - __k)
1363 if constexpr (__is_pod(iter_value_t<_Iter>))
1367 ranges::move(__p + 1, __p + __n, __p);
1371 auto __q = __p + __k;
1372 for (
decltype(__n) __i = 0; __i < __n - __k; ++ __i)
1374 ranges::iter_swap(__p, __q);
1381 ranges::swap(__n, __k);
1389 if constexpr (__is_pod(iter_value_t<_Iter>))
1393 ranges::move_backward(__p, __p + __n - 1, __p + __n);
1397 auto __q = __p + __n;
1399 for (
decltype(__n) __i = 0; __i < __n - __k; ++ __i)
1403 ranges::iter_swap(__p, __q);
1412 else if constexpr (bidirectional_iterator<_Iter>)
1414 auto __tail = __lasti;
1416 ranges::reverse(__first, __middle);
1417 ranges::reverse(__middle, __tail);
1419 while (__first != __middle && __middle != __tail)
1421 ranges::iter_swap(__first, --__tail);
1425 if (__first == __middle)
1427 ranges::reverse(__middle, __tail);
1432 ranges::reverse(__first, __middle);
1438 auto __first2 = __middle;
1441 ranges::iter_swap(__first, __first2);
1444 if (__first == __middle)
1445 __middle = __first2;
1446 }
while (__first2 != __last);
1448 auto __ret = __first;
1450 __first2 = __middle;
1452 while (__first2 != __last)
1454 ranges::iter_swap(__first, __first2);
1457 if (__first == __middle)
1458 __middle = __first2;
1459 else if (__first2 == __last)
1460 __first2 = __middle;
1466 template<forward_range _Range>
1467 requires permutable<iterator_t<_Range>>
1468 constexpr borrowed_subrange_t<_Range>
1469 operator()(_Range&& __r, iterator_t<_Range> __middle)
const
1471 return (*
this)(ranges::begin(__r),
std::move(__middle),
1476 inline constexpr __rotate_fn rotate{};
1478 template<
typename _Iter,
typename _Out>
1479 using rotate_copy_result = in_out_result<_Iter, _Out>;
1481 struct __rotate_copy_fn
1483 template<forward_iterator _Iter, sentinel_for<_Iter> _Sent,
1484 weakly_incrementable _Out>
1485 requires indirectly_copyable<_Iter, _Out>
1486 constexpr rotate_copy_result<_Iter, _Out>
1487 operator()(_Iter __first, _Iter __middle, _Sent __last,
1488 _Out __result)
const
1490 auto __copy1 = ranges::copy(__middle,
1493 auto __copy2 = ranges::copy(
std::move(__first),
1499 template<forward_range _Range, weakly_incrementable _Out>
1500 requires indirectly_copyable<iterator_t<_Range>, _Out>
1501 constexpr rotate_copy_result<borrowed_iterator_t<_Range>, _Out>
1502 operator()(_Range&& __r, iterator_t<_Range> __middle, _Out __result)
const
1504 return (*
this)(ranges::begin(__r),
std::move(__middle),
1509 inline constexpr __rotate_copy_fn rotate_copy{};
1513 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
1514 weakly_incrementable _Out,
typename _Gen>
1515 requires (forward_iterator<_Iter> || random_access_iterator<_Out>)
1516 && indirectly_copyable<_Iter, _Out>
1519 operator()(_Iter __first, _Sent __last, _Out __out,
1520 iter_difference_t<_Iter> __n, _Gen&& __g)
const
1522 if constexpr (forward_iterator<_Iter>)
1526 auto __lasti = ranges::next(__first, __last);
1527 return _GLIBCXX_STD_A::
1533 using __distrib_type
1534 = uniform_int_distribution<iter_difference_t<_Iter>>;
1535 using __param_type =
typename __distrib_type::param_type;
1536 __distrib_type __d{};
1537 iter_difference_t<_Iter> __sample_sz = 0;
1538 while (__first != __last && __sample_sz != __n)
1540 __out[__sample_sz++] = *__first;
1543 for (
auto __pop_sz = __sample_sz; __first != __last;
1544 ++__first, (void) ++__pop_sz)
1546 const auto __k = __d(__g, __param_type{0, __pop_sz});
1548 __out[__k] = *__first;
1550 return __out + __sample_sz;
1554 template<input_range _Range, weakly_incrementable _Out,
typename _Gen>
1555 requires (forward_range<_Range> || random_access_iterator<_Out>)
1556 && indirectly_copyable<iterator_t<_Range>, _Out>
1559 operator()(_Range&& __r, _Out __out,
1560 range_difference_t<_Range> __n, _Gen&& __g)
const
1562 return (*
this)(ranges::begin(__r), ranges::end(__r),
1568 inline constexpr __sample_fn sample{};
1570#ifdef _GLIBCXX_USE_C99_STDINT_TR1
1573 template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
1575 requires permutable<_Iter>
1576 && uniform_random_bit_generator<remove_reference_t<_Gen>>
1578 operator()(_Iter __first, _Sent __last, _Gen&& __g)
const
1580 auto __lasti = ranges::next(__first, __last);
1585 template<random_access_range _Range,
typename _Gen>
1586 requires permutable<iterator_t<_Range>>
1587 && uniform_random_bit_generator<remove_reference_t<_Gen>>
1588 borrowed_iterator_t<_Range>
1589 operator()(_Range&& __r, _Gen&& __g)
const
1591 return (*
this)(ranges::begin(__r), ranges::end(__r),
1596 inline constexpr __shuffle_fn shuffle{};
1599 struct __push_heap_fn
1601 template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
1602 typename _Comp = ranges::less,
typename _Proj =
identity>
1603 requires sortable<_Iter, _Comp, _Proj>
1605 operator()(_Iter __first, _Sent __last,
1606 _Comp __comp = {}, _Proj __proj = {})
const
1608 auto __lasti = ranges::next(__first, __last);
1609 std::push_heap(__first, __lasti,
1610 __detail::__make_comp_proj(__comp, __proj));
1614 template<random_access_range _Range,
1615 typename _Comp = ranges::less,
typename _Proj = identity>
1616 requires sortable<iterator_t<_Range>, _Comp, _Proj>
1617 constexpr borrowed_iterator_t<_Range>
1618 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
1620 return (*
this)(ranges::begin(__r), ranges::end(__r),
1625 inline constexpr __push_heap_fn push_heap{};
1627 struct __pop_heap_fn
1629 template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
1630 typename _Comp = ranges::less,
typename _Proj =
identity>
1631 requires sortable<_Iter, _Comp, _Proj>
1633 operator()(_Iter __first, _Sent __last,
1634 _Comp __comp = {}, _Proj __proj = {})
const
1636 auto __lasti = ranges::next(__first, __last);
1637 std::pop_heap(__first, __lasti,
1638 __detail::__make_comp_proj(__comp, __proj));
1642 template<random_access_range _Range,
1643 typename _Comp = ranges::less,
typename _Proj = identity>
1644 requires sortable<iterator_t<_Range>, _Comp, _Proj>
1645 constexpr borrowed_iterator_t<_Range>
1646 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
1648 return (*
this)(ranges::begin(__r), ranges::end(__r),
1653 inline constexpr __pop_heap_fn pop_heap{};
1655 struct __make_heap_fn
1657 template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
1658 typename _Comp = ranges::less,
typename _Proj =
identity>
1659 requires sortable<_Iter, _Comp, _Proj>
1661 operator()(_Iter __first, _Sent __last,
1662 _Comp __comp = {}, _Proj __proj = {})
const
1664 auto __lasti = ranges::next(__first, __last);
1665 std::make_heap(__first, __lasti,
1666 __detail::__make_comp_proj(__comp, __proj));
1670 template<random_access_range _Range,
1671 typename _Comp = ranges::less,
typename _Proj = identity>
1672 requires sortable<iterator_t<_Range>, _Comp, _Proj>
1673 constexpr borrowed_iterator_t<_Range>
1674 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
1676 return (*
this)(ranges::begin(__r), ranges::end(__r),
1681 inline constexpr __make_heap_fn make_heap{};
1683 struct __sort_heap_fn
1685 template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
1686 typename _Comp = ranges::less,
typename _Proj =
identity>
1687 requires sortable<_Iter, _Comp, _Proj>
1689 operator()(_Iter __first, _Sent __last,
1690 _Comp __comp = {}, _Proj __proj = {})
const
1692 auto __lasti = ranges::next(__first, __last);
1693 std::sort_heap(__first, __lasti,
1694 __detail::__make_comp_proj(__comp, __proj));
1698 template<random_access_range _Range,
1699 typename _Comp = ranges::less,
typename _Proj = identity>
1700 requires sortable<iterator_t<_Range>, _Comp, _Proj>
1701 constexpr borrowed_iterator_t<_Range>
1702 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
1704 return (*
this)(ranges::begin(__r), ranges::end(__r),
1709 inline constexpr __sort_heap_fn sort_heap{};
1711 struct __is_heap_until_fn
1713 template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
1714 typename _Proj =
identity,
1715 indirect_strict_weak_order<projected<_Iter, _Proj>>
1716 _Comp = ranges::less>
1718 operator()(_Iter __first, _Sent __last,
1719 _Comp __comp = {}, _Proj __proj = {})
const
1721 iter_difference_t<_Iter> __n = ranges::distance(__first, __last);
1722 iter_difference_t<_Iter> __parent = 0, __child = 1;
1723 for (; __child < __n; ++__child)
1727 return __first + __child;
1728 else if ((__child & 1) == 0)
1731 return __first + __n;
1734 template<random_access_range _Range,
1735 typename _Proj = identity,
1736 indirect_strict_weak_order<projected<iterator_t<_Range>, _Proj>>
1737 _Comp = ranges::less>
1738 constexpr borrowed_iterator_t<_Range>
1739 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
1741 return (*
this)(ranges::begin(__r), ranges::end(__r),
1746 inline constexpr __is_heap_until_fn is_heap_until{};
1750 template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
1751 typename _Proj =
identity,
1752 indirect_strict_weak_order<projected<_Iter, _Proj>>
1753 _Comp = ranges::less>
1755 operator()(_Iter __first, _Sent __last,
1756 _Comp __comp = {}, _Proj __proj = {})
const
1759 == ranges::is_heap_until(__first, __last,
1764 template<random_access_range _Range,
1765 typename _Proj = identity,
1766 indirect_strict_weak_order<projected<iterator_t<_Range>, _Proj>>
1767 _Comp = ranges::less>
1769 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
1771 return (*
this)(ranges::begin(__r), ranges::end(__r),
1776 inline constexpr __is_heap_fn is_heap{};
1780 template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
1781 typename _Comp = ranges::less,
typename _Proj =
identity>
1782 requires sortable<_Iter, _Comp, _Proj>
1784 operator()(_Iter __first, _Sent __last,
1785 _Comp __comp = {}, _Proj __proj = {})
const
1787 auto __lasti = ranges::next(__first, __last);
1788 _GLIBCXX_STD_A::sort(
std::move(__first), __lasti,
1789 __detail::__make_comp_proj(__comp, __proj));
1793 template<random_access_range _Range,
1794 typename _Comp = ranges::less,
typename _Proj = identity>
1795 requires sortable<iterator_t<_Range>, _Comp, _Proj>
1796 constexpr borrowed_iterator_t<_Range>
1797 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
1799 return (*
this)(ranges::begin(__r), ranges::end(__r),
1804 inline constexpr __sort_fn sort{};
1806 struct __stable_sort_fn
1808 template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
1809 typename _Comp = ranges::less,
typename _Proj =
identity>
1810 requires sortable<_Iter, _Comp, _Proj>
1812 operator()(_Iter __first, _Sent __last,
1813 _Comp __comp = {}, _Proj __proj = {})
const
1815 auto __lasti = ranges::next(__first, __last);
1816 std::stable_sort(
std::move(__first), __lasti,
1817 __detail::__make_comp_proj(__comp, __proj));
1821 template<random_access_range _Range,
1822 typename _Comp = ranges::less,
typename _Proj = identity>
1823 requires sortable<iterator_t<_Range>, _Comp, _Proj>
1824 borrowed_iterator_t<_Range>
1825 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
1827 return (*
this)(ranges::begin(__r), ranges::end(__r),
1832 inline constexpr __stable_sort_fn stable_sort{};
1834 struct __partial_sort_fn
1836 template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
1837 typename _Comp = ranges::less,
typename _Proj =
identity>
1838 requires sortable<_Iter, _Comp, _Proj>
1840 operator()(_Iter __first, _Iter __middle, _Sent __last,
1841 _Comp __comp = {}, _Proj __proj = {})
const
1843 if (__first == __middle)
1844 return ranges::next(__first, __last);
1846 ranges::make_heap(__first, __middle, __comp, __proj);
1847 auto __i = __middle;
1848 for (; __i != __last; ++__i)
1853 ranges::pop_heap(__first, __middle, __comp, __proj);
1854 ranges::iter_swap(__middle-1, __i);
1855 ranges::push_heap(__first, __middle, __comp, __proj);
1857 ranges::sort_heap(__first, __middle, __comp, __proj);
1862 template<random_access_range _Range,
1863 typename _Comp = ranges::less,
typename _Proj = identity>
1864 requires sortable<iterator_t<_Range>, _Comp, _Proj>
1865 constexpr borrowed_iterator_t<_Range>
1866 operator()(_Range&& __r, iterator_t<_Range> __middle,
1867 _Comp __comp = {}, _Proj __proj = {})
const
1869 return (*
this)(ranges::begin(__r),
std::move(__middle),
1875 inline constexpr __partial_sort_fn partial_sort{};
1877 template<
typename _Iter,
typename _Out>
1878 using partial_sort_copy_result = in_out_result<_Iter, _Out>;
1880 struct __partial_sort_copy_fn
1882 template<input_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
1883 random_access_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
1884 typename _Comp = ranges::less,
1885 typename _Proj1 =
identity,
typename _Proj2 =
identity>
1886 requires indirectly_copyable<_Iter1, _Iter2>
1887 && sortable<_Iter2, _Comp, _Proj2>
1888 && indirect_strict_weak_order<_Comp,
1891 constexpr partial_sort_copy_result<_Iter1, _Iter2>
1892 operator()(_Iter1 __first, _Sent1 __last,
1893 _Iter2 __result_first, _Sent2 __result_last,
1895 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
1897 if (__result_first == __result_last)
1900 auto __lasti = ranges::next(
std::move(__first),
1905 auto __result_real_last = __result_first;
1906 while (__first != __last && __result_real_last != __result_last)
1908 *__result_real_last = *__first;
1909 ++__result_real_last;
1913 ranges::make_heap(__result_first, __result_real_last, __comp, __proj2);
1914 for (; __first != __last; ++__first)
1919 ranges::pop_heap(__result_first, __result_real_last,
1921 *(__result_real_last-1) = *__first;
1922 ranges::push_heap(__result_first, __result_real_last,
1925 ranges::sort_heap(__result_first, __result_real_last, __comp, __proj2);
1930 template<input_range _Range1, random_access_range _Range2,
1931 typename _Comp = ranges::less,
1932 typename _Proj1 = identity,
typename _Proj2 = identity>
1933 requires indirectly_copyable<iterator_t<_Range1>, iterator_t<_Range2>>
1934 && sortable<iterator_t<_Range2>, _Comp, _Proj2>
1935 && indirect_strict_weak_order<_Comp,
1938 constexpr partial_sort_copy_result<borrowed_iterator_t<_Range1>,
1939 borrowed_iterator_t<_Range2>>
1940 operator()(_Range1&& __r, _Range2&& __out, _Comp __comp = {},
1941 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
1943 return (*
this)(ranges::begin(__r), ranges::end(__r),
1944 ranges::begin(__out), ranges::end(__out),
1950 inline constexpr __partial_sort_copy_fn partial_sort_copy{};
1952 struct __is_sorted_until_fn
1954 template<forward_iterator _Iter, sentinel_for<_Iter> _Sent,
1955 typename _Proj =
identity,
1956 indirect_strict_weak_order<projected<_Iter, _Proj>>
1957 _Comp = ranges::less>
1959 operator()(_Iter __first, _Sent __last,
1960 _Comp __comp = {}, _Proj __proj = {})
const
1962 if (__first == __last)
1965 auto __next = __first;
1966 for (++__next; __next != __last; __first = __next, (void)++__next)
1974 template<forward_range _Range,
typename _Proj = identity,
1975 indirect_strict_weak_order<projected<iterator_t<_Range>, _Proj>>
1976 _Comp = ranges::less>
1977 constexpr borrowed_iterator_t<_Range>
1978 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
1980 return (*
this)(ranges::begin(__r), ranges::end(__r),
1985 inline constexpr __is_sorted_until_fn is_sorted_until{};
1987 struct __is_sorted_fn
1989 template<forward_iterator _Iter, sentinel_for<_Iter> _Sent,
1990 typename _Proj =
identity,
1991 indirect_strict_weak_order<projected<_Iter, _Proj>>
1992 _Comp = ranges::less>
1994 operator()(_Iter __first, _Sent __last,
1995 _Comp __comp = {}, _Proj __proj = {})
const
1997 if (__first == __last)
2000 auto __next = __first;
2001 for (++__next; __next != __last; __first = __next, (void)++__next)
2009 template<forward_range _Range,
typename _Proj = identity,
2010 indirect_strict_weak_order<projected<iterator_t<_Range>, _Proj>>
2011 _Comp = ranges::less>
2013 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
2015 return (*
this)(ranges::begin(__r), ranges::end(__r),
2020 inline constexpr __is_sorted_fn is_sorted{};
2022 struct __nth_element_fn
2024 template<random_access_iterator _Iter, sentinel_for<_Iter> _Sent,
2025 typename _Comp = ranges::less,
typename _Proj =
identity>
2026 requires sortable<_Iter, _Comp, _Proj>
2028 operator()(_Iter __first, _Iter __nth, _Sent __last,
2029 _Comp __comp = {}, _Proj __proj = {})
const
2031 auto __lasti = ranges::next(__first, __last);
2034 __detail::__make_comp_proj(__comp, __proj));
2038 template<random_access_range _Range,
2039 typename _Comp = ranges::less,
typename _Proj = identity>
2040 requires sortable<iterator_t<_Range>, _Comp, _Proj>
2041 constexpr borrowed_iterator_t<_Range>
2042 operator()(_Range&& __r, iterator_t<_Range> __nth,
2043 _Comp __comp = {}, _Proj __proj = {})
const
2045 return (*
this)(ranges::begin(__r),
std::move(__nth),
2050 inline constexpr __nth_element_fn nth_element{};
2052 struct __lower_bound_fn
2054 template<forward_iterator _Iter, sentinel_for<_Iter> _Sent,
2055 typename _Tp,
typename _Proj =
identity,
2056 indirect_strict_weak_order<const _Tp*, projected<_Iter, _Proj>>
2057 _Comp = ranges::less>
2059 operator()(_Iter __first, _Sent __last,
2060 const _Tp& __value, _Comp __comp = {}, _Proj __proj = {})
const
2062 auto __len = ranges::distance(__first, __last);
2066 auto __half = __len / 2;
2067 auto __middle = __first;
2068 ranges::advance(__middle, __half);
2073 __len = __len - __half - 1;
2081 template<forward_range _Range,
typename _Tp,
typename _Proj = identity,
2082 indirect_strict_weak_order<
const _Tp*,
2084 _Comp = ranges::less>
2085 constexpr borrowed_iterator_t<_Range>
2086 operator()(_Range&& __r,
2087 const _Tp& __value, _Comp __comp = {}, _Proj __proj = {})
const
2089 return (*
this)(ranges::begin(__r), ranges::end(__r),
2094 inline constexpr __lower_bound_fn lower_bound{};
2096 struct __upper_bound_fn
2098 template<forward_iterator _Iter, sentinel_for<_Iter> _Sent,
2099 typename _Tp,
typename _Proj =
identity,
2100 indirect_strict_weak_order<const _Tp*, projected<_Iter, _Proj>>
2101 _Comp = ranges::less>
2103 operator()(_Iter __first, _Sent __last,
2104 const _Tp& __value, _Comp __comp = {}, _Proj __proj = {})
const
2106 auto __len = ranges::distance(__first, __last);
2110 auto __half = __len / 2;
2111 auto __middle = __first;
2112 ranges::advance(__middle, __half);
2119 __len = __len - __half - 1;
2125 template<forward_range _Range,
typename _Tp,
typename _Proj = identity,
2126 indirect_strict_weak_order<
const _Tp*,
2128 _Comp = ranges::less>
2129 constexpr borrowed_iterator_t<_Range>
2130 operator()(_Range&& __r,
2131 const _Tp& __value, _Comp __comp = {}, _Proj __proj = {})
const
2133 return (*
this)(ranges::begin(__r), ranges::end(__r),
2138 inline constexpr __upper_bound_fn upper_bound{};
2140 struct __equal_range_fn
2142 template<forward_iterator _Iter, sentinel_for<_Iter> _Sent,
2143 typename _Tp,
typename _Proj =
identity,
2144 indirect_strict_weak_order<const _Tp*, projected<_Iter, _Proj>>
2145 _Comp = ranges::less>
2146 constexpr subrange<_Iter>
2147 operator()(_Iter __first, _Sent __last,
2148 const _Tp& __value, _Comp __comp = {}, _Proj __proj = {})
const
2150 auto __len = ranges::distance(__first, __last);
2154 auto __half = __len / 2;
2155 auto __middle = __first;
2156 ranges::advance(__middle, __half);
2163 __len = __len - __half - 1;
2172 = ranges::lower_bound(__first, __middle,
2173 __value, __comp, __proj);
2174 ranges::advance(__first, __len);
2176 = ranges::upper_bound(++__middle, __first,
2177 __value, __comp, __proj);
2178 return {__left, __right};
2181 return {__first, __first};
2184 template<forward_range _Range,
2185 typename _Tp,
typename _Proj = identity,
2186 indirect_strict_weak_order<
const _Tp*,
2188 _Comp = ranges::less>
2189 constexpr borrowed_subrange_t<_Range>
2190 operator()(_Range&& __r,
const _Tp& __value,
2191 _Comp __comp = {}, _Proj __proj = {})
const
2193 return (*
this)(ranges::begin(__r), ranges::end(__r),
2198 inline constexpr __equal_range_fn equal_range{};
2200 struct __binary_search_fn
2202 template<forward_iterator _Iter, sentinel_for<_Iter> _Sent,
2203 typename _Tp,
typename _Proj =
identity,
2204 indirect_strict_weak_order<const _Tp*, projected<_Iter, _Proj>>
2205 _Comp = ranges::less>
2207 operator()(_Iter __first, _Sent __last,
2208 const _Tp& __value, _Comp __comp = {}, _Proj __proj = {})
const
2210 auto __i = ranges::lower_bound(__first, __last, __value, __comp, __proj);
2217 template<forward_range _Range,
2218 typename _Tp,
typename _Proj = identity,
2219 indirect_strict_weak_order<
const _Tp*,
2221 _Comp = ranges::less>
2223 operator()(_Range&& __r,
const _Tp& __value, _Comp __comp = {},
2224 _Proj __proj = {})
const
2226 return (*
this)(ranges::begin(__r), ranges::end(__r),
2231 inline constexpr __binary_search_fn binary_search{};
2233 struct __is_partitioned_fn
2235 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
2236 typename _Proj =
identity,
2237 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
2239 operator()(_Iter __first, _Sent __last,
2240 _Pred __pred, _Proj __proj = {})
const
2242 __first = ranges::find_if_not(
std::move(__first), __last,
2244 if (__first == __last)
2251 template<input_range _Range,
typename _Proj = identity,
2252 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>>
2255 operator()(_Range&& __r, _Pred __pred, _Proj __proj = {})
const
2257 return (*
this)(ranges::begin(__r), ranges::end(__r),
2262 inline constexpr __is_partitioned_fn is_partitioned{};
2264 struct __partition_fn
2266 template<permutable _Iter, sentinel_for<_Iter> _Sent,
2267 typename _Proj =
identity,
2268 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
2269 constexpr subrange<_Iter>
2270 operator()(_Iter __first, _Sent __last,
2271 _Pred __pred, _Proj __proj = {})
const
2273 if constexpr (bidirectional_iterator<_Iter>)
2275 auto __lasti = ranges::next(__first, __last);
2276 auto __tail = __lasti;
2280 if (__first == __tail)
2289 if (__first == __tail)
2296 ranges::iter_swap(__first, __tail);
2302 if (__first == __last)
2303 return {__first, __first};
2306 if (++__first == __last)
2307 return {__first, __first};
2309 auto __next = __first;
2310 while (++__next != __last)
2313 ranges::iter_swap(__first, __next);
2321 template<forward_range _Range,
typename _Proj = identity,
2322 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>>
2324 requires permutable<iterator_t<_Range>>
2325 constexpr borrowed_subrange_t<_Range>
2326 operator()(_Range&& __r, _Pred __pred, _Proj __proj = {})
const
2328 return (*
this)(ranges::begin(__r), ranges::end(__r),
2333 inline constexpr __partition_fn partition{};
2336 struct __stable_partition_fn
2338 template<b
idirectional_iterator _Iter, sentinel_for<_Iter> _Sent,
2339 typename _Proj =
identity,
2340 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
2341 requires permutable<_Iter>
2343 operator()(_Iter __first, _Sent __last,
2344 _Pred __pred, _Proj __proj = {})
const
2346 auto __lasti = ranges::next(__first, __last);
2348 = std::stable_partition(
std::move(__first), __lasti,
2349 __detail::__make_pred_proj(__pred, __proj));
2353 template<bidirectional_range _Range,
typename _Proj = identity,
2354 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>>
2356 requires permutable<iterator_t<_Range>>
2357 borrowed_subrange_t<_Range>
2358 operator()(_Range&& __r, _Pred __pred, _Proj __proj = {})
const
2360 return (*
this)(ranges::begin(__r), ranges::end(__r),
2365 inline constexpr __stable_partition_fn stable_partition{};
2368 template<
typename _Iter,
typename _Out1,
typename _Out2>
2369 struct in_out_out_result
2371 [[no_unique_address]] _Iter in;
2372 [[no_unique_address]] _Out1 out1;
2373 [[no_unique_address]] _Out2 out2;
2375 template<
typename _IIter,
typename _OOut1,
typename _OOut2>
2376 requires convertible_to<const _Iter&, _IIter>
2377 && convertible_to<const _Out1&, _OOut1>
2378 && convertible_to<const _Out2&, _OOut2>
2380 operator in_out_out_result<_IIter, _OOut1, _OOut2>() const &
2381 {
return {in, out1, out2}; }
2383 template<
typename _IIter,
typename _OOut1,
typename _OOut2>
2384 requires convertible_to<_Iter, _IIter>
2385 && convertible_to<_Out1, _OOut1>
2386 && convertible_to<_Out2, _OOut2>
2388 operator in_out_out_result<_IIter, _OOut1, _OOut2>() &&
2392 template<
typename _Iter,
typename _Out1,
typename _Out2>
2393 using partition_copy_result = in_out_out_result<_Iter, _Out1, _Out2>;
2395 struct __partition_copy_fn
2397 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
2398 weakly_incrementable _Out1, weakly_incrementable _Out2,
2399 typename _Proj =
identity,
2400 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
2401 requires indirectly_copyable<_Iter, _Out1>
2402 && indirectly_copyable<_Iter, _Out2>
2403 constexpr partition_copy_result<_Iter, _Out1, _Out2>
2404 operator()(_Iter __first, _Sent __last,
2405 _Out1 __out_true, _Out2 __out_false,
2406 _Pred __pred, _Proj __proj = {})
const
2408 for (; __first != __last; ++__first)
2411 *__out_true = *__first;
2416 *__out_false = *__first;
2424 template<input_range _Range, weakly_incrementable _Out1,
2425 weakly_incrementable _Out2,
2426 typename _Proj = identity,
2427 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>>
2429 requires indirectly_copyable<iterator_t<_Range>, _Out1>
2430 && indirectly_copyable<iterator_t<_Range>, _Out2>
2431 constexpr partition_copy_result<borrowed_iterator_t<_Range>, _Out1, _Out2>
2432 operator()(_Range&& __r, _Out1 __out_true, _Out2 __out_false,
2433 _Pred __pred, _Proj __proj = {})
const
2435 return (*
this)(ranges::begin(__r), ranges::end(__r),
2441 inline constexpr __partition_copy_fn partition_copy{};
2443 struct __partition_point_fn
2445 template<forward_iterator _Iter, sentinel_for<_Iter> _Sent,
2446 typename _Proj =
identity,
2447 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
2449 operator()(_Iter __first, _Sent __last,
2450 _Pred __pred, _Proj __proj = {})
const
2452 auto __len = ranges::distance(__first, __last);
2456 auto __half = __len / 2;
2457 auto __middle = __first;
2458 ranges::advance(__middle, __half);
2463 __len = __len - __half - 1;
2471 template<forward_range _Range,
typename _Proj = identity,
2472 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>>
2474 constexpr borrowed_iterator_t<_Range>
2475 operator()(_Range&& __r, _Pred __pred, _Proj __proj = {})
const
2477 return (*
this)(ranges::begin(__r), ranges::end(__r),
2482 inline constexpr __partition_point_fn partition_point{};
2484 template<
typename _Iter1,
typename _Iter2,
typename _Out>
2485 using merge_result = in_in_out_result<_Iter1, _Iter2, _Out>;
2489 template<input_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
2490 input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
2491 weakly_incrementable _Out,
typename _Comp = ranges::less,
2492 typename _Proj1 =
identity,
typename _Proj2 =
identity>
2493 requires mergeable<_Iter1, _Iter2, _Out, _Comp, _Proj1, _Proj2>
2494 constexpr merge_result<_Iter1, _Iter2, _Out>
2495 operator()(_Iter1 __first1, _Sent1 __last1,
2496 _Iter2 __first2, _Sent2 __last2, _Out __result,
2498 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
2500 while (__first1 != __last1 && __first2 != __last2)
2506 *__result = *__first2;
2511 *__result = *__first1;
2524 template<input_range _Range1, input_range _Range2, weakly_incrementable _Out,
2525 typename _Comp = ranges::less,
2526 typename _Proj1 = identity,
typename _Proj2 = identity>
2527 requires mergeable<iterator_t<_Range1>, iterator_t<_Range2>, _Out,
2528 _Comp, _Proj1, _Proj2>
2529 constexpr merge_result<borrowed_iterator_t<_Range1>,
2530 borrowed_iterator_t<_Range2>,
2532 operator()(_Range1&& __r1, _Range2&& __r2, _Out __result,
2534 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
2536 return (*
this)(ranges::begin(__r1), ranges::end(__r1),
2537 ranges::begin(__r2), ranges::end(__r2),
2543 inline constexpr __merge_fn merge{};
2545 struct __inplace_merge_fn
2547 template<b
idirectional_iterator _Iter, sentinel_for<_Iter> _Sent,
2548 typename _Comp = ranges::less,
2549 typename _Proj =
identity>
2550 requires sortable<_Iter, _Comp, _Proj>
2552 operator()(_Iter __first, _Iter __middle, _Sent __last,
2553 _Comp __comp = {}, _Proj __proj = {})
const
2555 auto __lasti = ranges::next(__first, __last);
2557 __detail::__make_comp_proj(__comp, __proj));
2561 template<bidirectional_range _Range,
2562 typename _Comp = ranges::less,
typename _Proj = identity>
2563 requires sortable<iterator_t<_Range>, _Comp, _Proj>
2564 borrowed_iterator_t<_Range>
2565 operator()(_Range&& __r, iterator_t<_Range> __middle,
2566 _Comp __comp = {}, _Proj __proj = {})
const
2568 return (*
this)(ranges::begin(__r),
std::move(__middle),
2574 inline constexpr __inplace_merge_fn inplace_merge{};
2576 struct __includes_fn
2578 template<input_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
2579 input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
2580 typename _Proj1 =
identity,
typename _Proj2 =
identity,
2581 indirect_strict_weak_order<projected<_Iter1, _Proj1>,
2582 projected<_Iter2, _Proj2>>
2583 _Comp = ranges::less>
2585 operator()(_Iter1 __first1, _Sent1 __last1,
2586 _Iter2 __first2, _Sent2 __last2,
2588 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
2590 while (__first1 != __last1 && __first2 != __last2)
2605 return __first2 == __last2;
2608 template<input_range _Range1, input_range _Range2,
2609 typename _Proj1 = identity,
typename _Proj2 = identity,
2610 indirect_strict_weak_order<projected<iterator_t<_Range1>, _Proj1>,
2612 _Comp = ranges::less>
2614 operator()(_Range1&& __r1, _Range2&& __r2, _Comp __comp = {},
2615 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
2617 return (*
this)(ranges::begin(__r1), ranges::end(__r1),
2618 ranges::begin(__r2), ranges::end(__r2),
2624 inline constexpr __includes_fn includes{};
2626 template<
typename _Iter1,
typename _Iter2,
typename _Out>
2627 using set_union_result = in_in_out_result<_Iter1, _Iter2, _Out>;
2629 struct __set_union_fn
2631 template<input_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
2632 input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
2633 weakly_incrementable _Out,
typename _Comp = ranges::less,
2634 typename _Proj1 =
identity,
typename _Proj2 =
identity>
2635 requires mergeable<_Iter1, _Iter2, _Out, _Comp, _Proj1, _Proj2>
2636 constexpr set_union_result<_Iter1, _Iter2, _Out>
2637 operator()(_Iter1 __first1, _Sent1 __last1,
2638 _Iter2 __first2, _Sent2 __last2,
2639 _Out __result, _Comp __comp = {},
2640 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
2642 while (__first1 != __last1 && __first2 != __last2)
2648 *__result = *__first1;
2655 *__result = *__first2;
2660 *__result = *__first1;
2674 template<input_range _Range1, input_range _Range2, weakly_incrementable _Out,
2675 typename _Comp = ranges::less,
2676 typename _Proj1 = identity,
typename _Proj2 = identity>
2677 requires mergeable<iterator_t<_Range1>, iterator_t<_Range2>, _Out,
2678 _Comp, _Proj1, _Proj2>
2679 constexpr set_union_result<borrowed_iterator_t<_Range1>,
2680 borrowed_iterator_t<_Range2>, _Out>
2681 operator()(_Range1&& __r1, _Range2&& __r2,
2682 _Out __result, _Comp __comp = {},
2683 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
2685 return (*
this)(ranges::begin(__r1), ranges::end(__r1),
2686 ranges::begin(__r2), ranges::end(__r2),
2692 inline constexpr __set_union_fn set_union{};
2694 template<
typename _Iter1,
typename _Iter2,
typename _Out>
2695 using set_intersection_result = in_in_out_result<_Iter1, _Iter2, _Out>;
2697 struct __set_intersection_fn
2699 template<input_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
2700 input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
2701 weakly_incrementable _Out,
typename _Comp = ranges::less,
2702 typename _Proj1 =
identity,
typename _Proj2 =
identity>
2703 requires mergeable<_Iter1, _Iter2, _Out, _Comp, _Proj1, _Proj2>
2704 constexpr set_intersection_result<_Iter1, _Iter2, _Out>
2705 operator()(_Iter1 __first1, _Sent1 __last1,
2706 _Iter2 __first2, _Sent2 __last2, _Out __result,
2708 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
2710 while (__first1 != __last1 && __first2 != __last2)
2721 *__result = *__first1;
2732 template<input_range _Range1, input_range _Range2, weakly_incrementable _Out,
2733 typename _Comp = ranges::less,
2734 typename _Proj1 = identity,
typename _Proj2 = identity>
2735 requires mergeable<iterator_t<_Range1>, iterator_t<_Range2>, _Out,
2736 _Comp, _Proj1, _Proj2>
2737 constexpr set_intersection_result<borrowed_iterator_t<_Range1>,
2738 borrowed_iterator_t<_Range2>, _Out>
2739 operator()(_Range1&& __r1, _Range2&& __r2, _Out __result,
2741 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
2743 return (*
this)(ranges::begin(__r1), ranges::end(__r1),
2744 ranges::begin(__r2), ranges::end(__r2),
2750 inline constexpr __set_intersection_fn set_intersection{};
2752 template<
typename _Iter,
typename _Out>
2753 using set_difference_result = in_out_result<_Iter, _Out>;
2755 struct __set_difference_fn
2757 template<input_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
2758 input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
2759 weakly_incrementable _Out,
typename _Comp = ranges::less,
2760 typename _Proj1 =
identity,
typename _Proj2 =
identity>
2761 requires mergeable<_Iter1, _Iter2, _Out, _Comp, _Proj1, _Proj2>
2762 constexpr set_difference_result<_Iter1, _Out>
2763 operator()(_Iter1 __first1, _Sent1 __last1,
2764 _Iter2 __first2, _Sent2 __last2, _Out __result,
2766 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
2768 while (__first1 != __last1 && __first2 != __last2)
2773 *__result = *__first1;
2790 template<input_range _Range1, input_range _Range2, weakly_incrementable _Out,
2791 typename _Comp = ranges::less,
2792 typename _Proj1 = identity,
typename _Proj2 = identity>
2793 requires mergeable<iterator_t<_Range1>, iterator_t<_Range2>, _Out,
2794 _Comp, _Proj1, _Proj2>
2795 constexpr set_difference_result<borrowed_iterator_t<_Range1>, _Out>
2796 operator()(_Range1&& __r1, _Range2&& __r2, _Out __result,
2798 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
2800 return (*
this)(ranges::begin(__r1), ranges::end(__r1),
2801 ranges::begin(__r2), ranges::end(__r2),
2807 inline constexpr __set_difference_fn set_difference{};
2809 template<
typename _Iter1,
typename _Iter2,
typename _Out>
2810 using set_symmetric_difference_result
2811 = in_in_out_result<_Iter1, _Iter2, _Out>;
2813 struct __set_symmetric_difference_fn
2815 template<input_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
2816 input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
2817 weakly_incrementable _Out,
typename _Comp = ranges::less,
2818 typename _Proj1 =
identity,
typename _Proj2 =
identity>
2819 requires mergeable<_Iter1, _Iter2, _Out, _Comp, _Proj1, _Proj2>
2820 constexpr set_symmetric_difference_result<_Iter1, _Iter2, _Out>
2821 operator()(_Iter1 __first1, _Sent1 __last1,
2822 _Iter2 __first2, _Sent2 __last2,
2823 _Out __result, _Comp __comp = {},
2824 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
2826 while (__first1 != __last1 && __first2 != __last2)
2831 *__result = *__first1;
2839 *__result = *__first2;
2856 template<input_range _Range1, input_range _Range2, weakly_incrementable _Out,
2857 typename _Comp = ranges::less,
2858 typename _Proj1 = identity,
typename _Proj2 = identity>
2859 requires mergeable<iterator_t<_Range1>, iterator_t<_Range2>, _Out,
2860 _Comp, _Proj1, _Proj2>
2861 constexpr set_symmetric_difference_result<borrowed_iterator_t<_Range1>,
2862 borrowed_iterator_t<_Range2>,
2864 operator()(_Range1&& __r1, _Range2&& __r2, _Out __result,
2866 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
2868 return (*
this)(ranges::begin(__r1), ranges::end(__r1),
2869 ranges::begin(__r2), ranges::end(__r2),
2875 inline constexpr __set_symmetric_difference_fn set_symmetric_difference{};
2881 template<
typename _Tp,
typename _Proj = identity,
2882 indirect_strict_weak_order<projected<const _Tp*, _Proj>>
2883 _Comp = ranges::less>
2884 constexpr const _Tp&
2885 operator()(
const _Tp& __a,
const _Tp& __b,
2886 _Comp __comp = {}, _Proj __proj = {})
const
2896 template<input_range _Range,
typename _Proj = identity,
2897 indirect_strict_weak_order<projected<iterator_t<_Range>, _Proj>>
2898 _Comp = ranges::less>
2899 requires indirectly_copyable_storable<iterator_t<_Range>,
2900 range_value_t<_Range>*>
2901 constexpr range_value_t<_Range>
2902 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
2904 auto __first = ranges::begin(__r);
2905 auto __last = ranges::end(__r);
2906 __glibcxx_assert(__first != __last);
2907 auto __result = *__first;
2908 while (++__first != __last)
2910 auto __tmp = *__first;
2919 template<copyable _Tp,
typename _Proj = identity,
2920 indirect_strict_weak_order<projected<const _Tp*, _Proj>>
2921 _Comp = ranges::less>
2923 operator()(initializer_list<_Tp> __r,
2924 _Comp __comp = {}, _Proj __proj = {})
const
2926 return (*
this)(ranges::subrange(__r),
2931 inline constexpr __max_fn max{};
2935 template<
typename _Tp,
typename _Proj = identity,
2936 indirect_strict_weak_order<projected<const _Tp*, _Proj>> _Comp
2938 constexpr const _Tp&
2939 operator()(
const _Tp& __val,
const _Tp& __lo,
const _Tp& __hi,
2940 _Comp __comp = {}, _Proj __proj = {})
const
2955 inline constexpr __clamp_fn clamp{};
2957 template<
typename _Tp>
2958 struct min_max_result
2960 [[no_unique_address]] _Tp min;
2961 [[no_unique_address]] _Tp max;
2963 template<
typename _Tp2>
2964 requires convertible_to<const _Tp&, _Tp2>
2966 operator min_max_result<_Tp2>() const &
2967 {
return {min, max}; }
2969 template<
typename _Tp2>
2970 requires convertible_to<_Tp, _Tp2>
2972 operator min_max_result<_Tp2>() &&
2976 template<
typename _Tp>
2977 using minmax_result = min_max_result<_Tp>;
2981 template<
typename _Tp,
typename _Proj = identity,
2982 indirect_strict_weak_order<projected<const _Tp*, _Proj>>
2983 _Comp = ranges::less>
2984 constexpr minmax_result<const _Tp&>
2985 operator()(
const _Tp& __a,
const _Tp& __b,
2986 _Comp __comp = {}, _Proj __proj = {})
const
2996 template<input_range _Range,
typename _Proj = identity,
2997 indirect_strict_weak_order<projected<iterator_t<_Range>, _Proj>>
2998 _Comp = ranges::less>
2999 requires indirectly_copyable_storable<iterator_t<_Range>, range_value_t<_Range>*>
3000 constexpr minmax_result<range_value_t<_Range>>
3001 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
3003 auto __first = ranges::begin(__r);
3004 auto __last = ranges::end(__r);
3005 __glibcxx_assert(__first != __last);
3006 auto __comp_proj = __detail::__make_comp_proj(__comp, __proj);
3007 minmax_result<range_value_t<_Range>> __result = {*__first, __result.min};
3008 if (++__first == __last)
3014 auto&& __val = *__first;
3015 if (__comp_proj(__val, __result.min))
3020 while (++__first != __last)
3025 range_value_t<_Range> __val1 = *__first;
3026 if (++__first == __last)
3031 if (__comp_proj(__val1, __result.min))
3033 else if (!__comp_proj(__val1, __result.max))
3037 auto&& __val2 = *__first;
3038 if (!__comp_proj(__val2, __val1))
3040 if (__comp_proj(__val1, __result.min))
3042 if (!__comp_proj(__val2, __result.max))
3047 if (__comp_proj(__val2, __result.min))
3049 if (!__comp_proj(__val1, __result.max))
3056 template<copyable _Tp,
typename _Proj = identity,
3057 indirect_strict_weak_order<projected<const _Tp*, _Proj>>
3058 _Comp = ranges::less>
3059 constexpr minmax_result<_Tp>
3060 operator()(initializer_list<_Tp> __r,
3061 _Comp __comp = {}, _Proj __proj = {})
const
3063 return (*
this)(ranges::subrange(__r),
3068 inline constexpr __minmax_fn minmax{};
3070 struct __min_element_fn
3072 template<forward_iterator _Iter, sentinel_for<_Iter> _Sent,
3073 typename _Proj =
identity,
3074 indirect_strict_weak_order<projected<_Iter, _Proj>>
3075 _Comp = ranges::less>
3077 operator()(_Iter __first, _Sent __last,
3078 _Comp __comp = {}, _Proj __proj = {})
const
3080 if (__first == __last)
3084 while (++__i != __last)
3094 template<forward_range _Range,
typename _Proj = identity,
3095 indirect_strict_weak_order<projected<iterator_t<_Range>, _Proj>>
3096 _Comp = ranges::less>
3097 constexpr borrowed_iterator_t<_Range>
3098 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
3100 return (*
this)(ranges::begin(__r), ranges::end(__r),
3105 inline constexpr __min_element_fn min_element{};
3107 struct __max_element_fn
3109 template<forward_iterator _Iter, sentinel_for<_Iter> _Sent,
3110 typename _Proj =
identity,
3111 indirect_strict_weak_order<projected<_Iter, _Proj>>
3112 _Comp = ranges::less>
3114 operator()(_Iter __first, _Sent __last,
3115 _Comp __comp = {}, _Proj __proj = {})
const
3117 if (__first == __last)
3121 while (++__i != __last)
3131 template<forward_range _Range,
typename _Proj = identity,
3132 indirect_strict_weak_order<projected<iterator_t<_Range>, _Proj>>
3133 _Comp = ranges::less>
3134 constexpr borrowed_iterator_t<_Range>
3135 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
3137 return (*
this)(ranges::begin(__r), ranges::end(__r),
3142 inline constexpr __max_element_fn max_element{};
3144 template<
typename _Iter>
3145 using minmax_element_result = min_max_result<_Iter>;
3147 struct __minmax_element_fn
3149 template<forward_iterator _Iter, sentinel_for<_Iter> _Sent,
3150 typename _Proj =
identity,
3151 indirect_strict_weak_order<projected<_Iter, _Proj>>
3152 _Comp = ranges::less>
3153 constexpr minmax_element_result<_Iter>
3154 operator()(_Iter __first, _Sent __last,
3155 _Comp __comp = {}, _Proj __proj = {})
const
3157 auto __comp_proj = __detail::__make_comp_proj(__comp, __proj);
3158 minmax_element_result<_Iter> __result = {__first, __first};
3159 if (__first == __last || ++__first == __last)
3165 if (__comp_proj(*__first, *__result.min))
3166 __result.min = __first;
3168 __result.max = __first;
3170 while (++__first != __last)
3175 auto __prev = __first;
3176 if (++__first == __last)
3181 if (__comp_proj(*__prev, *__result.min))
3182 __result.min = __prev;
3183 else if (!__comp_proj(*__prev, *__result.max))
3184 __result.max = __prev;
3187 if (!__comp_proj(*__first, *__prev))
3189 if (__comp_proj(*__prev, *__result.min))
3190 __result.min = __prev;
3191 if (!__comp_proj(*__first, *__result.max))
3192 __result.max = __first;
3196 if (__comp_proj(*__first, *__result.min))
3197 __result.min = __first;
3198 if (!__comp_proj(*__prev, *__result.max))
3199 __result.max = __prev;
3205 template<forward_range _Range,
typename _Proj = identity,
3206 indirect_strict_weak_order<projected<iterator_t<_Range>, _Proj>>
3207 _Comp = ranges::less>
3208 constexpr minmax_element_result<borrowed_iterator_t<_Range>>
3209 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
3211 return (*
this)(ranges::begin(__r), ranges::end(__r),
3216 inline constexpr __minmax_element_fn minmax_element{};
3218 struct __lexicographical_compare_fn
3220 template<input_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
3221 input_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
3222 typename _Proj1 =
identity,
typename _Proj2 =
identity,
3223 indirect_strict_weak_order<projected<_Iter1, _Proj1>,
3224 projected<_Iter2, _Proj2>>
3225 _Comp = ranges::less>
3227 operator()(_Iter1 __first1, _Sent1 __last1,
3228 _Iter2 __first2, _Sent2 __last2,
3230 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
3232 if constexpr (__detail::__is_normal_iterator<_Iter1>
3233 && same_as<_Iter1, _Sent1>)
3234 return (*
this)(__first1.base(), __last1.base(),
3238 else if constexpr (__detail::__is_normal_iterator<_Iter2>
3239 && same_as<_Iter2, _Sent2>)
3241 __first2.base(), __last2.base(),
3246 constexpr bool __sized_iters
3247 = (sized_sentinel_for<_Sent1, _Iter1>
3248 && sized_sentinel_for<_Sent2, _Iter2>);
3249 if constexpr (__sized_iters)
3251 using _ValueType1 = iter_value_t<_Iter1>;
3252 using _ValueType2 = iter_value_t<_Iter2>;
3255 constexpr bool __use_memcmp
3256 = (__is_memcmp_ordered_with<_ValueType1, _ValueType2>::__value
3257 && __ptr_to_nonvolatile<_Iter1>
3258 && __ptr_to_nonvolatile<_Iter2>
3259 && (is_same_v<_Comp, ranges::less>
3260 || is_same_v<_Comp, ranges::greater>)
3261 && is_same_v<_Proj1, identity>
3262 && is_same_v<_Proj2, identity>);
3263 if constexpr (__use_memcmp)
3265 const auto __d1 = __last1 - __first1;
3266 const auto __d2 = __last2 - __first2;
3268 if (
const auto __len =
std::min(__d1, __d2))
3271 = std::__memcmp(__first1, __first2, __len);
3272 if constexpr (is_same_v<_Comp, ranges::less>)
3279 else if constexpr (is_same_v<_Comp, ranges::greater>)
3291 for (; __first1 != __last1 && __first2 != __last2;
3292 ++__first1, (void) ++__first2)
3303 return __first1 == __last1 && __first2 != __last2;
3307 template<input_range _Range1, input_range _Range2,
3308 typename _Proj1 = identity,
typename _Proj2 = identity,
3309 indirect_strict_weak_order<projected<iterator_t<_Range1>, _Proj1>,
3311 _Comp = ranges::less>
3313 operator()(_Range1&& __r1, _Range2&& __r2, _Comp __comp = {},
3314 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
3316 return (*
this)(ranges::begin(__r1), ranges::end(__r1),
3317 ranges::begin(__r2), ranges::end(__r2),
3323 template<
typename _Iter,
typename _Ref = iter_reference_t<_Iter>>
3324 static constexpr bool __ptr_to_nonvolatile
3325 = is_pointer_v<_Iter> && !is_volatile_v<remove_reference_t<_Ref>>;
3328 inline constexpr __lexicographical_compare_fn lexicographical_compare;
3330 template<
typename _Iter>
3331 struct in_found_result
3333 [[no_unique_address]] _Iter in;
3336 template<
typename _Iter2>
3337 requires convertible_to<const _Iter&, _Iter2>
3339 operator in_found_result<_Iter2>() const &
3340 {
return {in, found}; }
3342 template<
typename _Iter2>
3343 requires convertible_to<_Iter, _Iter2>
3345 operator in_found_result<_Iter2>() &&
3349 template<
typename _Iter>
3350 using next_permutation_result = in_found_result<_Iter>;
3352 struct __next_permutation_fn
3354 template<b
idirectional_iterator _Iter, sentinel_for<_Iter> _Sent,
3355 typename _Comp = ranges::less,
typename _Proj =
identity>
3356 requires sortable<_Iter, _Comp, _Proj>
3357 constexpr next_permutation_result<_Iter>
3358 operator()(_Iter __first, _Sent __last,
3359 _Comp __comp = {}, _Proj __proj = {})
const
3361 if (__first == __last)
3369 auto __lasti = ranges::next(__first, __last);
3386 ranges::iter_swap(__i, __j);
3387 ranges::reverse(__ii, __last);
3392 ranges::reverse(__first, __last);
3398 template<bidirectional_range _Range,
typename _Comp = ranges::less,
3399 typename _Proj = identity>
3400 requires sortable<iterator_t<_Range>, _Comp, _Proj>
3401 constexpr next_permutation_result<borrowed_iterator_t<_Range>>
3402 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
3404 return (*
this)(ranges::begin(__r), ranges::end(__r),
3409 inline constexpr __next_permutation_fn next_permutation{};
3411 template<
typename _Iter>
3412 using prev_permutation_result = in_found_result<_Iter>;
3414 struct __prev_permutation_fn
3416 template<b
idirectional_iterator _Iter, sentinel_for<_Iter> _Sent,
3417 typename _Comp = ranges::less,
typename _Proj =
identity>
3418 requires sortable<_Iter, _Comp, _Proj>
3419 constexpr prev_permutation_result<_Iter>
3420 operator()(_Iter __first, _Sent __last,
3421 _Comp __comp = {}, _Proj __proj = {})
const
3423 if (__first == __last)
3431 auto __lasti = ranges::next(__first, __last);
3448 ranges::iter_swap(__i, __j);
3449 ranges::reverse(__ii, __last);
3454 ranges::reverse(__first, __last);
3460 template<bidirectional_range _Range,
typename _Comp = ranges::less,
3461 typename _Proj = identity>
3462 requires sortable<iterator_t<_Range>, _Comp, _Proj>
3463 constexpr prev_permutation_result<borrowed_iterator_t<_Range>>
3464 operator()(_Range&& __r, _Comp __comp = {}, _Proj __proj = {})
const
3466 return (*
this)(ranges::begin(__r), ranges::end(__r),
3471 inline constexpr __prev_permutation_fn prev_permutation{};
3473#if __cplusplus > 202002L
3475#define __cpp_lib_ranges_contains 202207L
3477 struct __contains_fn
3479 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
3480 typename _Tp,
typename _Proj =
identity>
3481 requires indirect_binary_predicate<ranges::equal_to,
3482 projected<_Iter, _Proj>,
const _Tp*>
3484 operator()(_Iter __first, _Sent __last,
const _Tp& __value, _Proj __proj = {})
const
3485 {
return ranges::find(
std::move(__first), __last, __value,
std::move(__proj)) != __last; }
3487 template<input_range _Range,
typename _Tp,
typename _Proj =
identity>
3488 requires indirect_binary_predicate<ranges::equal_to,
3489 projected<iterator_t<_Range>, _Proj>,
const _Tp*>
3491 operator()(_Range&& __r,
const _Tp& __value, _Proj __proj = {})
const
3492 {
return (*
this)(ranges::begin(__r), ranges::end(__r), __value,
std::move(__proj)); }
3495 inline constexpr __contains_fn contains{};
3497 struct __contains_subrange_fn
3499 template<forward_iterator _Iter1, sentinel_for<_Iter1> _Sent1,
3500 forward_iterator _Iter2, sentinel_for<_Iter2> _Sent2,
3501 typename _Pred = ranges::equal_to,
3502 typename _Proj1 =
identity,
typename _Proj2 =
identity>
3503 requires indirectly_comparable<_Iter1, _Iter2, _Pred, _Proj1, _Proj2>
3505 operator()(_Iter1 __first1, _Sent1 __last1, _Iter2 __first2, _Sent2 __last2,
3506 _Pred __pred = {}, _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
3508 return __first2 == __last2
3509 || !ranges::search(__first1, __last1, __first2, __last2,
3513 template<forward_range _Range1, forward_range _Range2,
3514 typename _Pred = ranges::equal_to,
3515 typename _Proj1 = identity,
typename _Proj2 = identity>
3516 requires indirectly_comparable<iterator_t<_Range1>, iterator_t<_Range2>,
3517 _Pred, _Proj1, _Proj2>
3519 operator()(_Range1&& __r1, _Range2&& __r2, _Pred __pred = {},
3520 _Proj1 __proj1 = {}, _Proj2 __proj2 = {})
const
3522 return (*
this)(ranges::begin(__r1), ranges::end(__r1),
3523 ranges::begin(__r2), ranges::end(__r2),
3528 inline constexpr __contains_subrange_fn contains_subrange{};
3530#define __cpp_lib_ranges_find_last 202207L
3532 struct __find_last_fn
3534 template<forward_iterator _Iter, sentinel_for<_Iter> _Sent,
typename _Tp,
typename _Proj =
identity>
3535 requires indirect_binary_predicate<ranges::equal_to, projected<_Iter, _Proj>,
const _Tp*>
3536 constexpr subrange<_Iter>
3537 operator()(_Iter __first, _Sent __last,
const _Tp& __value, _Proj __proj = {})
const
3539 if constexpr (same_as<_Iter, _Sent> && bidirectional_iterator<_Iter>)
3541 _Iter __found = ranges::find(reverse_iterator<_Iter>{__last},
3542 reverse_iterator<_Iter>{__first},
3544 if (__found == __first)
3545 return {__last, __last};
3547 return {ranges::prev(__found), __last};
3551 _Iter __found = ranges::find(__first, __last, __value, __proj);
3552 if (__found == __last)
3553 return {__found, __found};
3557 __first = ranges::find(ranges::next(__first), __last, __value, __proj);
3558 if (__first == __last)
3559 return {__found, __first};
3565 template<forward_range _Range,
typename _Tp,
typename _Proj =
identity>
3566 requires indirect_binary_predicate<ranges::equal_to, projected<iterator_t<_Range>, _Proj>,
const _Tp*>
3567 constexpr borrowed_subrange_t<_Range>
3568 operator()(_Range&& __r,
const _Tp& __value, _Proj __proj = {})
const
3569 {
return (*
this)(ranges::begin(__r), ranges::end(__r), __value,
std::move(__proj)); }
3572 inline constexpr __find_last_fn find_last{};
3574 struct __find_last_if_fn
3576 template<forward_iterator _Iter, sentinel_for<_Iter> _Sent,
typename _Proj =
identity,
3577 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
3578 constexpr subrange<_Iter>
3579 operator()(_Iter __first, _Sent __last, _Pred __pred, _Proj __proj = {})
const
3581 if constexpr (same_as<_Iter, _Sent> && bidirectional_iterator<_Iter>)
3583 _Iter __found = ranges::find_if(reverse_iterator<_Iter>{__last},
3584 reverse_iterator<_Iter>{__first},
3586 if (__found == __first)
3587 return {__last, __last};
3589 return {ranges::prev(__found), __last};
3593 _Iter __found = ranges::find_if(__first, __last, __pred, __proj);
3594 if (__found == __last)
3595 return {__found, __found};
3599 __first = ranges::find_if(ranges::next(__first), __last, __pred, __proj);
3600 if (__first == __last)
3601 return {__found, __first};
3607 template<forward_range _Range,
typename _Proj = identity,
3608 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>> _Pred>
3609 constexpr borrowed_subrange_t<_Range>
3610 operator()(_Range&& __r, _Pred __pred, _Proj __proj = {})
const
3611 {
return (*
this)(ranges::begin(__r), ranges::end(__r),
std::move(__pred),
std::move(__proj)); }
3614 inline constexpr __find_last_if_fn find_last_if{};
3616 struct __find_last_if_not_fn
3618 template<forward_iterator _Iter, sentinel_for<_Iter> _Sent,
typename _Proj =
identity,
3619 indirect_unary_predicate<projected<_Iter, _Proj>> _Pred>
3620 constexpr subrange<_Iter>
3621 operator()(_Iter __first, _Sent __last, _Pred __pred, _Proj __proj = {})
const
3623 if constexpr (same_as<_Iter, _Sent> && bidirectional_iterator<_Iter>)
3625 _Iter __found = ranges::find_if_not(reverse_iterator<_Iter>{__last},
3626 reverse_iterator<_Iter>{__first},
3628 if (__found == __first)
3629 return {__last, __last};
3631 return {ranges::prev(__found), __last};
3635 _Iter __found = ranges::find_if_not(__first, __last, __pred, __proj);
3636 if (__found == __last)
3637 return {__found, __found};
3641 __first = ranges::find_if_not(ranges::next(__first), __last, __pred, __proj);
3642 if (__first == __last)
3643 return {__found, __first};
3649 template<forward_range _Range,
typename _Proj = identity,
3650 indirect_unary_predicate<projected<iterator_t<_Range>, _Proj>> _Pred>
3651 constexpr borrowed_subrange_t<_Range>
3652 operator()(_Range&& __r, _Pred __pred, _Proj __proj = {})
const
3653 {
return (*
this)(ranges::begin(__r), ranges::end(__r),
std::move(__pred),
std::move(__proj)); }
3656 inline constexpr __find_last_if_not_fn find_last_if_not{};
3658#define __cpp_lib_ranges_fold 202207L
3660 template<
typename _Iter,
typename _Tp>
3661 struct in_value_result
3663 [[no_unique_address]] _Iter in;
3664 [[no_unique_address]] _Tp value;
3666 template<
typename _Iter2,
typename _Tp2>
3667 requires convertible_to<const _Iter&, _Iter2>
3668 && convertible_to<const _Tp&, _Tp2>
3670 operator in_value_result<_Iter2, _Tp2>() const &
3671 {
return {in, value}; }
3673 template<
typename _Iter2,
typename _Tp2>
3674 requires convertible_to<_Iter, _Iter2>
3675 && convertible_to<_Tp, _Tp2>
3677 operator in_value_result<_Iter2, _Tp2>() &&
3683 template<
typename _Fp>
3689 template<
typename _Tp,
typename _Up>
3690 requires invocable<_Fp&, _Up, _Tp>
3691 invoke_result_t<_Fp&, _Up, _Tp>
3692 operator()(_Tp&&, _Up&&);
3695 template<
typename _Fp,
typename _Tp,
typename _Iter,
typename _Up>
3696 concept __indirectly_binary_left_foldable_impl = movable<_Tp> && movable<_Up>
3697 && convertible_to<_Tp, _Up>
3698 && invocable<_Fp&, _Up, iter_reference_t<_Iter>>
3699 && assignable_from<_Up&, invoke_result_t<_Fp&, _Up, iter_reference_t<_Iter>>>;
3701 template<
typename _Fp,
typename _Tp,
typename _Iter>
3702 concept __indirectly_binary_left_foldable = copy_constructible<_Fp>
3703 && indirectly_readable<_Iter>
3704 && invocable<_Fp&, _Tp, iter_reference_t<_Iter>>
3705 && convertible_to<invoke_result_t<_Fp&, _Tp, iter_reference_t<_Iter>>,
3707 && __indirectly_binary_left_foldable_impl
3710 template <
typename _Fp,
typename _Tp,
typename _Iter>
3711 concept __indirectly_binary_right_foldable
3712 = __indirectly_binary_left_foldable<__flipped<_Fp>, _Tp, _Iter>;
3715 template<
typename _Iter,
typename _Tp>
3716 using fold_left_with_iter_result = in_value_result<_Iter, _Tp>;
3718 struct __fold_left_with_iter_fn
3720 template<
typename _Ret_iter,
3721 typename _Iter,
typename _Sent,
typename _Tp,
typename _Fp>
3722 static constexpr auto
3723 _S_impl(_Iter __first, _Sent __last, _Tp __init, _Fp __f)
3725 using _Up = decay_t<invoke_result_t<_Fp&, _Tp, iter_reference_t<_Iter>>>;
3726 using _Ret = fold_left_with_iter_result<_Ret_iter, _Up>;
3728 if (__first == __last)
3732 for (++__first; __first != __last; ++__first)
3737 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
typename _Tp,
3738 __detail::__indirectly_binary_left_foldable<_Tp, _Iter> _Fp>
3740 operator()(_Iter __first, _Sent __last, _Tp __init, _Fp __f)
const
3742 using _Ret_iter = _Iter;
3743 return _S_impl<_Ret_iter>(
std::move(__first), __last,
3747 template<input_range _Range,
typename _Tp,
3748 __detail::__indirectly_binary_left_foldable<_Tp, iterator_t<_Range>> _Fp>
3750 operator()(_Range&& __r, _Tp __init, _Fp __f)
const
3752 using _Ret_iter = borrowed_iterator_t<_Range>;
3753 return _S_impl<_Ret_iter>(ranges::begin(__r), ranges::end(__r),
3758 inline constexpr __fold_left_with_iter_fn fold_left_with_iter{};
3760 struct __fold_left_fn
3762 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
typename _Tp,
3763 __detail::__indirectly_binary_left_foldable<_Tp, _Iter> _Fp>
3765 operator()(_Iter __first, _Sent __last, _Tp __init, _Fp __f)
const
3767 return ranges::fold_left_with_iter(
std::move(__first), __last,
3771 template<input_range _Range,
typename _Tp,
3772 __detail::__indirectly_binary_left_foldable<_Tp, iterator_t<_Range>> _Fp>
3774 operator()(_Range&& __r, _Tp __init, _Fp __f)
const
3775 {
return (*
this)(ranges::begin(__r), ranges::end(__r),
std::move(__init),
std::move(__f)); }
3778 inline constexpr __fold_left_fn fold_left{};
3780 template<
typename _Iter,
typename _Tp>
3781 using fold_left_first_with_iter_result = in_value_result<_Iter, _Tp>;
3783 struct __fold_left_first_with_iter_fn
3785 template<
typename _Ret_iter,
typename _Iter,
typename _Sent,
typename _Fp>
3786 static constexpr auto
3787 _S_impl(_Iter __first, _Sent __last, _Fp __f)
3789 using _Up =
decltype(ranges::fold_left(
std::move(__first), __last,
3790 iter_value_t<_Iter>(*__first), __f));
3791 using _Ret = fold_left_first_with_iter_result<_Ret_iter, optional<_Up>>;
3793 if (__first == __last)
3794 return _Ret{
std::move(__first), optional<_Up>()};
3796 optional<_Up> __init(in_place, *__first);
3797 for (++__first; __first != __last; ++__first)
3802 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
3803 __detail::__indirectly_binary_left_foldable<iter_value_t<_Iter>, _Iter> _Fp>
3804 requires constructible_from<iter_value_t<_Iter>, iter_reference_t<_Iter>>
3806 operator()(_Iter __first, _Sent __last, _Fp __f)
const
3808 using _Ret_iter = _Iter;
3812 template<input_range _Range,
3813 __detail::__indirectly_binary_left_foldable<range_value_t<_Range>, iterator_t<_Range>> _Fp>
3814 requires constructible_from<range_value_t<_Range>, range_reference_t<_Range>>
3816 operator()(_Range&& __r, _Fp __f)
const
3818 using _Ret_iter = borrowed_iterator_t<_Range>;
3819 return _S_impl<_Ret_iter>(ranges::begin(__r), ranges::end(__r),
std::move(__f));
3823 inline constexpr __fold_left_first_with_iter_fn fold_left_first_with_iter{};
3825 struct __fold_left_first_fn
3827 template<input_iterator _Iter, sentinel_for<_Iter> _Sent,
3828 __detail::__indirectly_binary_left_foldable<iter_value_t<_Iter>, _Iter> _Fp>
3829 requires constructible_from<iter_value_t<_Iter>, iter_reference_t<_Iter>>
3831 operator()(_Iter __first, _Sent __last, _Fp __f)
const
3833 return ranges::fold_left_first_with_iter(
std::move(__first), __last,
3837 template<input_range _Range,
3838 __detail::__indirectly_binary_left_foldable<range_value_t<_Range>, iterator_t<_Range>> _Fp>
3839 requires constructible_from<range_value_t<_Range>, range_reference_t<_Range>>
3841 operator()(_Range&& __r, _Fp __f)
const
3842 {
return (*
this)(ranges::begin(__r), ranges::end(__r),
std::move(__f)); }
3845 inline constexpr __fold_left_first_fn fold_left_first{};
3847 struct __fold_right_fn
3849 template<b
idirectional_iterator _Iter, sentinel_for<_Iter> _Sent,
typename _Tp,
3850 __detail::__indirectly_binary_right_foldable<_Tp, _Iter> _Fp>
3852 operator()(_Iter __first, _Sent __last, _Tp __init, _Fp __f)
const
3854 using _Up = decay_t<invoke_result_t<_Fp&, iter_reference_t<_Iter>, _Tp>>;
3856 if (__first == __last)
3859 _Iter __tail = ranges::next(__first, __last);
3861 while (__first != __tail)
3866 template<bidirectional_range _Range,
typename _Tp,
3867 __detail::__indirectly_binary_right_foldable<_Tp, iterator_t<_Range>> _Fp>
3869 operator()(_Range&& __r, _Tp __init, _Fp __f)
const
3870 {
return (*
this)(ranges::begin(__r), ranges::end(__r),
std::move(__init),
std::move(__f)); }
3873 inline constexpr __fold_right_fn fold_right{};
3875 struct __fold_right_last_fn
3877 template<b
idirectional_iterator _Iter, sentinel_for<_Iter> _Sent,
3878 __detail::__indirectly_binary_right_foldable<iter_value_t<_Iter>, _Iter> _Fp>
3879 requires constructible_from<iter_value_t<_Iter>, iter_reference_t<_Iter>>
3881 operator()(_Iter __first, _Sent __last, _Fp __f)
const
3883 using _Up =
decltype(ranges::fold_right(__first, __last,
3884 iter_value_t<_Iter>(*__first), __f));
3886 if (__first == __last)
3887 return optional<_Up>();
3889 _Iter __tail = ranges::prev(ranges::next(__first,
std::move(__last)));
3890 return optional<_Up>(in_place,
3891 ranges::fold_right(
std::move(__first), __tail,
3892 iter_value_t<_Iter>(*__tail),
3896 template<bidirectional_range _Range,
3897 __detail::__indirectly_binary_right_foldable<range_value_t<_Range>, iterator_t<_Range>> _Fp>
3898 requires constructible_from<range_value_t<_Range>, range_reference_t<_Range>>
3900 operator()(_Range&& __r, _Fp __f)
const
3901 {
return (*
this)(ranges::begin(__r), ranges::end(__r),
std::move(__f)); }
3904 inline constexpr __fold_right_last_fn fold_right_last{};
3908#define __cpp_lib_shift 201806L
3909 template<
typename _ForwardIterator>
3910 constexpr _ForwardIterator
3911 shift_left(_ForwardIterator __first, _ForwardIterator __last,
3914 __glibcxx_assert(__n >= 0);
3918 auto __mid = ranges::next(__first, __n, __last);
3919 if (__mid == __last)
3924 template<
typename _ForwardIterator>
3925 constexpr _ForwardIterator
3926 shift_right(_ForwardIterator __first, _ForwardIterator __last,
3929 __glibcxx_assert(__n >= 0);
3937 auto __mid = ranges::next(__last, -__n, __first);
3938 if (__mid == __first)
3946 auto __result = ranges::next(__first, __n, __last);
3947 if (__result == __last)
3950 auto __dest_head = __first, __dest_tail = __result;
3951 while (__dest_head != __result)
3953 if (__dest_tail == __last)
3977 auto __cursor = __first;
3978 while (__cursor != __result)
3980 if (__dest_tail == __last)
3985 __dest_head =
std::move(__cursor, __result,
3991 std::iter_swap(__cursor, __dest_head);
4000_GLIBCXX_END_NAMESPACE_VERSION
typename remove_reference< _Tp >::type remove_reference_t
Alias template for remove_reference.
typename decay< _Tp >::type decay_t
Alias template for decay.
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr __invoke_result< _Callable, _Args... >::type __invoke(_Callable &&__fn, _Args &&... __args) noexcept(__is_nothrow_invocable< _Callable, _Args... >::value)
Invoke a callable object.
void swap(any &__x, any &__y) noexcept
Exchange the states of two any objects.
constexpr _Tp && forward(typename std::remove_reference< _Tp >::type &__t) noexcept
Forward an lvalue.
constexpr _BI2 move_backward(_BI1 __first, _BI1 __last, _BI2 __result)
Moves the range [first,last) into result.
constexpr const _Tp & min(const _Tp &, const _Tp &)
This does what you think it does.
ISO C++ entities toplevel namespace is std.
typename __detail::__projected< _Iter, _Proj >::__type projected
[projected], projected
Traits class for iterators.
[concept.derived], concept derived_from