From 21da5ec3d1c95c3a889eb19e33d10627dd10ab9d Mon Sep 17 00:00:00 2001 From: q66 Date: Mon, 13 Feb 2017 21:12:32 +0100 Subject: [PATCH] make the pipe op a member to make it to work automagically on user ranges --- ostd/range.hh | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) 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(); }; }