diff --git a/ostd/range.hh b/ostd/range.hh index 2f2f559..272a711 100644 --- a/ostd/range.hh +++ b/ostd/range.hh @@ -691,6 +691,25 @@ struct InputRange { return *static_cast(this); } + /* pipe op, must be a member to work for user ranges automagically */ + + template + auto operator|(F &&func) & { + return func(*static_cast(this)); + } + template + auto operator|(F &&func) const & { + return func(*static_cast(this)); + } + template + auto operator|(F &&func) && { + return func(std::move(*static_cast(this))); + } + template + auto operator|(F &&func) const && { + return func(std::move(*static_cast(this))); + } + /* universal bool operator */ explicit operator bool() const { @@ -698,13 +717,6 @@ struct InputRange { } }; -template -inline auto operator|(R &&range, F &&func) -> - std::enable_if_t, decltype(func(std::forward(range)))> -{ - return func(std::forward(range)); -} - inline auto reverse() { return [](auto &&obj) { return obj.reverse(); }; }