diff --git a/doc/ranges.md b/doc/ranges.md index ef210f9..7478058 100644 --- a/doc/ranges.md +++ b/doc/ranges.md @@ -493,11 +493,8 @@ returning a lambda: ~~~{.cc} template void my_generic_algorithm(T &&arg) { - return [arg = std::forward(arg)](auto &&range) { - my_generic_algorithm( - std::forward(range), - std::forward(arg) - ); + return [arg = std::forward(arg)](auto &range) { + my_generic_algorithm(range, std::forward(arg)); }; } ~~~ diff --git a/ostd/algorithm.hh b/ostd/algorithm.hh index 6bcf556..7a3e0f4 100644 --- a/ostd/algorithm.hh +++ b/ostd/algorithm.hh @@ -33,10 +33,8 @@ inline R partition(R range, U pred) { template inline auto partition(F &&func) { - return [func = std::forward(func)](auto &&obj) mutable { - return partition( - std::forward(obj), std::forward(func) - ); + return [func = std::forward(func)](auto &obj) mutable { + return partition(obj, std::forward(func)); }; } @@ -53,10 +51,8 @@ inline bool is_partitioned(R range, P pred) { template inline auto is_partitioned(F &&func) { - return [func = std::forward(func)](auto &&obj) mutable { - return is_partitioned( - std::forward(obj), std::forward(func) - ); + return [func = std::forward(func)](auto &obj) mutable { + return is_partitioned(obj, std::forward(func)); }; } @@ -160,10 +156,8 @@ inline R sort_cmp(R range, C compare) { } template inline auto sort_cmp(C &&compare) { - return [compare = std::forward(compare)](auto &&obj) mutable { - return sort_cmp( - std::forward(obj), std::forward(compare) - ); + return [compare = std::forward(compare)](auto &obj) mutable { + return sort_cmp(obj, std::forward(compare)); }; } @@ -172,7 +166,7 @@ inline R sort(R range) { return sort_cmp(range, std::less>()); } inline auto sort() { - return [](auto &&obj) { return sort(std::forward(obj)); }; + return [](auto &obj) { return sort(obj); }; } /* min/max(_element) */ @@ -198,16 +192,14 @@ inline R min_element_cmp(R range, C compare) { return r; } inline auto min_element() { - return [](auto &&obj) { - return min_element(std::forward(obj)); + return [](auto &obj) { + return min_element(obj); }; } template inline auto min_element_cmp(C &&compare) { - return [compare = std::forward(compare)](auto &&obj) mutable { - return min_element_cmp( - std::forward(obj), std::forward(compare) - ); + return [compare = std::forward(compare)](auto &obj) mutable { + return min_element_cmp(obj, std::forward(compare)); }; } @@ -232,16 +224,14 @@ inline R max_element_cmp(R range, C compare) { return r; } inline auto max_element() { - return [](auto &&obj) { - return max_element(std::forward(obj)); + return [](auto &obj) { + return max_element(obj); }; } template inline auto max_element_cmp(C &&compare) { - return [compare = std::forward(compare)](auto &&obj) mutable { - return max_element_cmp( - std::forward(obj), std::forward(compare) - ); + return [compare = std::forward(compare)](auto &obj) mutable { + return max_element_cmp(obj, std::forward(compare)); }; } @@ -263,10 +253,8 @@ inline bool lexicographical_compare(R1 range1, R2 range2) { } template inline auto lexicographical_compare(R &&range) { - return [range = std::forward(range)](auto &&obj) mutable { - return lexicographical_compare( - std::forward(obj), std::forward(range) - ); + return [range = std::forward(range)](auto &obj) mutable { + return lexicographical_compare(obj, std::forward(range)); }; } @@ -288,10 +276,9 @@ template inline auto lexicographical_compare_cmp(R &&range, C &&compare) { return [ range = std::forward(range), compare = std::forward(compare) - ](auto &&obj) mutable { + ](auto &obj) mutable { return lexicographical_compare_cmp( - std::forward(obj), std::forward(range), - std::forward(compare) + obj, std::forward(range), std::forward(compare) ); }; } @@ -308,8 +295,8 @@ inline F for_each(R range, F func) { template inline auto for_each(F &&func) { - return [func = std::forward(func)](auto &&obj) mutable { - return for_each(std::forward(obj), std::forward(func)); + return [func = std::forward(func)](auto &obj) mutable { + return for_each(obj, std::forward(func)); }; } @@ -325,8 +312,8 @@ inline bool all_of(R range, P pred) { template inline auto all_of(F &&func) { - return [func = std::forward(func)](auto &&obj) mutable { - return all_of(std::forward(obj), std::forward(func)); + return [func = std::forward(func)](auto &obj) mutable { + return all_of(obj, std::forward(func)); }; } @@ -339,8 +326,8 @@ inline bool any_of(R range, P pred) { template inline auto any_of(F &&func) { - return [func = std::forward(func)](auto &&obj) mutable { - return any_of(std::forward(obj), std::forward(func)); + return [func = std::forward(func)](auto &obj) mutable { + return any_of(obj, std::forward(func)); }; } @@ -353,8 +340,8 @@ inline bool none_of(R range, P pred) { template inline auto none_of(F &&func) { - return [func = std::forward(func)](auto &&obj) mutable { - return none_of(std::forward(obj), std::forward(func)); + return [func = std::forward(func)](auto &obj) mutable { + return none_of(obj, std::forward(func)); }; } @@ -370,8 +357,8 @@ inline R find(R range, T const &v) { template inline auto find(T &&v) { - return [v = std::forward(v)](auto &&obj) mutable { - return find(std::forward(obj), std::forward(v)); + return [v = std::forward(v)](auto &obj) mutable { + return find(obj, std::forward(v)); }; } @@ -394,8 +381,8 @@ inline R find_last(R range, T const &v) { template inline auto find_last(T &&v) { - return [v = std::forward(v)](auto &&obj) mutable { - return find_last(std::forward(obj), std::forward(v)); + return [v = std::forward(v)](auto &obj) mutable { + return find_last(obj, std::forward(v)); }; } @@ -411,8 +398,8 @@ inline R find_if(R range, P pred) { template inline auto find_if(F &&func) { - return [func = std::forward(func)](auto &&obj) mutable { - return find_if(std::forward(obj), std::forward(func)); + return [func = std::forward(func)](auto &obj) mutable { + return find_if(obj, std::forward(func)); }; } @@ -428,10 +415,8 @@ inline R find_if_not(R range, P pred) { template inline auto find_if_not(F &&func) { - return [func = std::forward(func)](auto &&obj) mutable { - return find_if_not( - std::forward(obj), std::forward(func) - ); + return [func = std::forward(func)](auto &obj) mutable { + return find_if_not(obj, std::forward(func)); }; } @@ -450,10 +435,9 @@ template inline auto find_one_of_cmp(R &&values, C &&compare) { return [ values = std::forward(values), compare = std::forward(compare) - ](auto &&obj) mutable { + ](auto &obj) mutable { return find_one_of_cmp( - std::forward(obj), std::forward(values), - std::forward(compare) + obj, std::forward(values), std::forward(compare) ); }; } @@ -471,10 +455,8 @@ inline R1 find_one_of(R1 range, R2 values) { } template inline auto find_one_of(R &&values) { - return [values = std::forward(values)](auto &&obj) mutable { - return find_one_of( - std::forward(obj), std::forward(values) - ); + return [values = std::forward(values)](auto &obj) mutable { + return find_one_of(obj, std::forward(values)); }; } @@ -491,8 +473,8 @@ inline range_size_t count(R range, T const &v) { template inline auto count(T &&v) { - return [v = std::forward(v)](auto &&obj) mutable { - return count(std::forward(obj), std::forward(v)); + return [v = std::forward(v)](auto &obj) mutable { + return count(obj, std::forward(v)); }; } @@ -509,8 +491,8 @@ inline range_size_t count_if(R range, P pred) { template inline auto count_if(F &&func) { - return [func = std::forward(func)](auto &&obj) mutable { - return count_if(std::forward(obj), std::forward(func)); + return [func = std::forward(func)](auto &obj) mutable { + return count_if(obj, std::forward(func)); }; } @@ -527,10 +509,8 @@ inline range_size_t count_if_not(R range, P pred) { template inline auto count_if_not(F &&func) { - return [func = std::forward(func)](auto &&obj) mutable { - return count_if_not( - std::forward(obj), std::forward(func) - ); + return [func = std::forward(func)](auto &obj) mutable { + return count_if_not(obj, std::forward(func)); }; } @@ -547,8 +527,8 @@ inline bool equal(R range1, R range2) { template inline auto equal(R &&range) { - return [range = std::forward(range)](auto &&obj) mutable { - return equal(std::forward(obj), std::forward(range)); + return [range = std::forward(range)](auto &obj) mutable { + return equal(obj, std::forward(range)); }; } @@ -656,19 +636,16 @@ inline T foldl_f(R range, T init, F func) { template inline auto foldl(T &&init) { - return [init = std::forward(init)](auto &&obj) mutable { - return foldl(std::forward(obj), std::forward(init)); + return [init = std::forward(init)](auto &obj) mutable { + return foldl(obj, std::forward(init)); }; } template inline auto foldl_f(T &&init, F &&func) { return [ init = std::forward(init), func = std::forward(func) - ](auto &&obj) mutable { - return foldl_f( - std::forward(obj), std::forward(init), - std::forward(func) - ); + ](auto &obj) mutable { + return foldl_f(obj, std::forward(init), std::forward(func)); }; } @@ -690,19 +667,16 @@ inline T foldr_f(R range, T init, F func) { template inline auto foldr(T &&init) { - return [init = std::forward(init)](auto &&obj) mutable { - return foldr(std::forward(obj), std::forward(init)); + return [init = std::forward(init)](auto &obj) mutable { + return foldr(obj, std::forward(init)); }; } template inline auto foldr_f(T &&init, F &&func) { return [ init = std::forward(init), func = std::forward(func) - ](auto &&obj) mutable { - return foldr_f( - std::forward(obj), std::forward(init), - std::forward(func) - ); + ](auto &obj) mutable { + return foldr_f(obj, std::forward(init), std::forward(func)); }; } @@ -776,8 +750,8 @@ inline map_range> map(R range, F func) { template inline auto map(F &&func) { - return [func = std::forward(func)](auto &&obj) mutable { - return map(std::forward(obj), std::forward(func)); + return [func = std::forward(func)](auto &obj) mutable { + return map(obj, std::forward(func)); }; } @@ -857,8 +831,8 @@ inline filter_range> filter(R range, P pred) { template inline auto filter(F &&func) { - return [func = std::forward(func)](auto &&obj) mutable { - return filter(std::forward(obj), std::forward(func)); + return [func = std::forward(func)](auto &obj) mutable { + return filter(obj, std::forward(func)); }; } diff --git a/ostd/range.hh b/ostd/range.hh index 7e535a7..11c3c16 100644 --- a/ostd/range.hh +++ b/ostd/range.hh @@ -708,28 +708,16 @@ struct input_range { /** @brief A necessary overload for pipeable algorithm support. */ template - auto operator|(F &&func) & { + auto operator|(F &&func) { return func(*static_cast(this)); } /** @brief A necessary overload for pipeable algorithm support. */ template - auto operator|(F &&func) const & { + auto operator|(F &&func) const { return func(*static_cast(this)); } - /** @brief A necessary overload for pipeable algorithm support. */ - template - auto operator|(F &&func) && { - return func(std::move(*static_cast(this))); - } - - /** @brief A necessary overload for pipeable algorithm support. */ - template - auto operator|(F &&func) const && { - return func(std::move(*static_cast(this))); - } - /* universal bool operator */ /** @brief Checks if the range is not empty. */ @@ -826,35 +814,35 @@ inline counting_output_range range_counter(R const &range) { /** @brief A pipeable version of ostd::input_range::reverse(). */ inline auto reverse() { - return [](auto &&obj) { return obj.reverse(); }; + return [](auto &obj) { return obj.reverse(); }; } /** @brief A pipeable version of ostd::input_range::movable(). */ inline auto movable() { - return [](auto &&obj) { return obj.movable(); }; + return [](auto &obj) { return obj.movable(); }; } /** @brief A pipeable version of ostd::input_range::enumerate(). */ inline auto enumerate() { - return [](auto &&obj) { return obj.enumerate(); }; + return [](auto &obj) { return obj.enumerate(); }; } /** @brief A pipeable version of ostd::input_range::take(). */ template inline auto take(T n) { - return [n](auto &&obj) { return obj.take(n); }; + return [n](auto &obj) { return obj.take(n); }; } /** @brief A pipeable version of ostd::input_range::chunks(). */ template inline auto chunks(T n) { - return [n](auto &&obj) { return obj.chunks(n); }; + return [n](auto &obj) { return obj.chunks(n); }; } /** @brief A pipeable version of ostd::input_range::join(). */ template inline auto join(R &&range) { - return [range = std::forward(range)](auto &&obj) mutable { + return [range = std::forward(range)](auto &obj) mutable { return obj.join(std::forward(range)); }; } @@ -866,7 +854,7 @@ inline auto join(R1 &&r1, R &&...rr) { ranges = std::forward_as_tuple( std::forward(r1), std::forward(rr)... ) - ] (auto &&obj) mutable { + ] (auto &obj) mutable { return std::apply([&obj](auto &&...args) mutable { return obj.join(std::forward(args)...); }, std::move(ranges)); @@ -876,7 +864,7 @@ inline auto join(R1 &&r1, R &&...rr) { /** @brief A pipeable version of ostd::input_range::zip(). */ template inline auto zip(R &&range) { - return [range = std::forward(range)](auto &&obj) mutable { + return [range = std::forward(range)](auto &obj) mutable { return obj.zip(std::forward(range)); }; } @@ -888,7 +876,7 @@ inline auto zip(R1 &&r1, R &&...rr) { ranges = std::forward_as_tuple( std::forward(r1), std::forward(rr)... ) - ] (auto &&obj) mutable { + ] (auto &obj) mutable { return std::apply([&obj](auto &&...args) mutable { return obj.zip(std::forward(args)...); }, std::move(ranges));