diff --git a/ostd/algorithm.hh b/ostd/algorithm.hh index 02ff8da..5c2d5d5 100644 --- a/ostd/algorithm.hh +++ b/ostd/algorithm.hh @@ -30,7 +30,7 @@ inline R partition(R range, U pred) { } template inline auto partition(F func) { - return [f = move(func)](auto obj) { return partition(obj, f); }; + return [&func](auto &obj) mutable { return partition(obj, func); }; } template @@ -42,7 +42,9 @@ inline bool is_partitioned(R range, P pred) { } template inline bool is_partitioned(F func) { - return [f = move(func)](auto obj) { return is_partitioned(obj, f); }; + return [&func](auto &obj) mutable { + return is_partitioned(obj, move(func)); + }; } /* sorting */ @@ -256,10 +258,10 @@ inline F for_each(R range, F func) { } template inline auto for_each(F func) { - return [f = move(func)](auto obj) { + return [&func](auto &obj) mutable { for (; !obj.empty(); obj.pop_front()) - f(obj.front()); - return move(f); + func(obj.front()); + return move(func); }; } @@ -271,7 +273,7 @@ inline bool all_of(R range, P pred) { } template inline auto all_of(F func) { - return [f = move(func)](auto obj) { return all_of(obj, f); }; + return [&func](auto &obj) mutable { return all_of(obj, move(func)); }; } template @@ -282,7 +284,7 @@ inline bool any_of(R range, P pred) { } template inline auto any_of(F func) { - return [f = move(func)](auto obj) { return any_of(obj, f); }; + return [&func](auto &obj) mutable { return any_of(obj, move(func)); }; } template @@ -293,7 +295,7 @@ inline bool none_of(R range, P pred) { } template inline auto none_of(F func) { - return [f = move(func)](auto obj) { return none_of(obj, f); }; + return [&func](auto &obj) mutable { return none_of(obj, move(func)); }; } template @@ -305,7 +307,7 @@ inline R find(R range, const T &v) { } template inline auto find(const T &v) { - return [v](auto obj) { return find(obj, v); }; + return [&v](auto &obj) { return find(obj, v); }; } template @@ -323,7 +325,7 @@ inline R find_last(R range, const T &v) { } template inline auto find_last(const T &v) { - return [v](auto obj) { return find_last(obj, v); }; + return [&v](auto &obj) { return find_last(obj, v); }; } template @@ -335,7 +337,7 @@ inline R find_if(R range, P pred) { } template inline auto find_if(F func) { - return [f = move(func)](auto obj) { return find_if(obj, f); }; + return [&func](auto &obj) mutable { return find_if(obj, move(func)); }; } template @@ -347,7 +349,7 @@ inline R find_if_not(R range, P pred) { } template inline auto find_if_not(F func) { - return [f = move(func)](auto obj) { return find_if_not(obj, f); }; + return [&func](auto &obj) mutable { return find_if_not(obj, move(func)); }; } template @@ -378,7 +380,7 @@ inline RangeSize count(R range, const T &v) { } template inline auto count(const T &v) { - return [v](auto obj) { return count(obj, v); }; + return [&v](auto &obj) { return count(obj, v); }; } template @@ -391,7 +393,7 @@ inline RangeSize count_if(R range, P pred) { } template inline auto count_if(F func) { - return [f = move(func)](auto obj) { return count_if(obj, f); }; + return [&func](auto &obj) mutable { return count_if(obj, move(func)); }; } template @@ -404,7 +406,7 @@ inline RangeSize count_if_not(R range, P pred) { } template inline auto count_if_not(F func) { - return [f = move(func)](auto obj) { return count_if_not(obj, f); }; + return [&func](auto &obj) mutable { return count_if_not(obj, move(func)); }; } template @@ -418,7 +420,7 @@ inline bool equal(R range1, R range2) { } template inline bool equal(R range) { - return [r = move(range)](auto obj) { return equal(obj, r); }; + return [&range](auto &obj) mutable { return equal(obj, move(range)); }; } template @@ -427,7 +429,7 @@ R slice_until(R range1, R range2) { } template inline auto slice_until(R range) { - return [r = move(range)](auto obj) { return slice_until(obj, r); }; + return [&range](auto &obj) mutable { return slice_until(obj, move(range)); }; } /* algos that modify ranges or work with output ranges */ @@ -521,7 +523,7 @@ inline T foldl(R range, T init, F func) { } template inline auto foldl(T init) { - return [v = move(init)](auto obj) { return foldl(obj, v); }; + return [&init](auto &obj) mutable { return foldl(obj, move(init)); }; } template @@ -539,7 +541,7 @@ inline T foldr(R range, T init, F func) { } template inline auto foldr(T init) { - return [v = move(init)](auto obj) { return foldr(obj, v); }; + return [&init](auto &obj) mutable { return foldr(obj, move(init)); }; } template @@ -631,7 +633,7 @@ inline MapRange> map(R range, F func) { } template inline auto map(F func) { - return [f = move(func)](auto obj) { return map(obj, f); }; + return [&func](auto &obj) mutable { return map(obj, move(func)); }; } template @@ -704,7 +706,7 @@ inline FilterRange> filter(R range, P pred) { } template inline auto filter(F func) { - return [f = move(func)](auto obj) { return filter(obj, f); }; + return [&func](auto &obj) mutable { return filter(obj, move(func)); }; } } /* namespace ostd */ diff --git a/ostd/range.hh b/ostd/range.hh index f545e71..113096e 100644 --- a/ostd/range.hh +++ b/ostd/range.hh @@ -485,12 +485,12 @@ template - JoinRange join(R1 r1, RR ...rr) { + JoinRange join(R1 r1, RR ...rr) const { return JoinRange(iter(), move(r1), move(rr)...); } template - ZipRange zip(R1 r1, RR ...rr) { + ZipRange zip(R1 r1, RR ...rr) const { return ZipRange(iter(), move(r1), move(rr)...); } @@ -585,36 +585,36 @@ inline auto operator|(const R &range, F &&func) -> decltype(func(range)) { } inline auto reverse() { - return [](auto obj) { return obj.reverse(); }; + return [](auto &obj) { return obj.reverse(); }; } inline auto movable() { - return [](auto obj) { return obj.movable(); }; + return [](auto &obj) { return obj.movable(); }; } inline auto enumerate() { - return [](auto obj) { return obj.enumerate(); }; + return [](auto &obj) { return obj.enumerate(); }; } template inline auto take(T n) { - return [n](auto obj) { return obj.take(n); }; + return [n](auto &obj) { return obj.take(n); }; } template inline auto chunks(T n) { - return [n](auto obj) { return obj.chunks(n); }; + return [n](auto &obj) { return obj.chunks(n); }; } /* TODO: can't use generalized captures on packs so gotta workaround */ template inline auto join(R1 r1, R ...rr) { - return [=](auto obj) mutable { return obj.join(move(r1), move(rr)...); }; + return [=](auto &obj) mutable { return obj.join(move(r1), move(rr)...); }; } template inline auto zip(R1 r1, R ...rr) { - return [=](auto obj) mutable { return obj.zip(move(r1), move(rr)...); }; + return [=](auto &obj) mutable { return obj.zip(move(r1), move(rr)...); }; } template