17static void sort(R &&range, F key) {
19#if CYQLONE_WITH_SKA_SORT
20 ska_sort(std::ranges::begin(range), std::ranges::end(range), key);
22 std::sort(std::ranges::begin(range), std::ranges::end(range),
23 [&](
auto a,
auto b) {
return key(a) < key(b); });
30 std::nth_element(std::ranges::begin(range), mid, std::ranges::end(range),
31 [&](
auto a,
auto b) {
return key(a) < key(b); });
37static std::ranges::subrange<std::ranges::iterator_t<R>>
partition_min(R &&range, F pred, C cmp) {
39 auto first = std::ranges::begin(range);
40 const auto last = std::ranges::end(range);
41 const auto lasti = std::ranges::next(first, last);
42 auto tail = lasti, min_it = lasti;
47 if (min_it != first) {
50 std::ranges::iter_swap(min_it, first);
52 return std::ranges::subrange<std::ranges::iterator_t<R>>(first, lasti);
60 }
else if (pred(*first)) {
72 if (min_it == last || cmp(*tail, *min_it))
75 }
else if (pred(*tail)) {
79 if (min_it == last || cmp(*tail, *min_it))
84 std::ranges::iter_swap(first, tail);
85 if (min_it == last || cmp(*tail, *min_it))
98static decltype(
auto)
partition(I first, S last, F key) {
99 GUANAQO_TRACE(
"partition", 0, std::ranges::distance(first, last));
100 return std::ranges::partition(first, last, key);
111 GUANAQO_TRACE(
"transform_reduce", 0, std::ranges::distance(first, last));
112 return std::transform_reduce(first, last, init, binary_op, unary_op);
static std::ranges::subrange< std::ranges::iterator_t< R > > partition_min(R &&range, F pred, C cmp)
A variant of std::ranges::partition where the first element of the return value is the smallest eleme...