/*============================================================================= Copyright (c) 2014 Paul Fultz II tap.h Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #ifndef BOOST_HOF_GUARD_FUNCTION_TAP_H #define BOOST_HOF_GUARD_FUNCTION_TAP_H /// tap /// === /// /// Description /// ----------- /// /// The `tap` function invokes a function on the first argument passed in and /// then returns the first argument. This is useful in a chain of pipable /// function to perform operations on intermediate results. As a result, this /// function is [`pipable`](/include/boost/hof/pipable). /// /// Synopsis /// -------- /// /// template /// pipable constexpr T tap(T&& x, const F& f); /// /// Requirements /// ------------ /// /// F must be: /// /// * [UnaryInvocable](UnaryInvocable) /// /// Example /// ------- /// /// #include /// #include /// #include /// using namespace boost::hof; /// /// struct sum_f /// { /// template /// T operator()(T x, U y) const /// { /// return x+y; /// } /// }; /// /// const pipable_adaptor sum = {}; /// int main() { /// // Prints 3 /// int r = 1 | sum(2) | tap([](int i) { std::cout << i; }) | sum(2); /// assert(r == 5); /// } /// #include #include #include namespace boost { namespace hof { namespace detail { struct tap_f { template constexpr T operator()(T&& x, const F& f) const BOOST_HOF_RETURNS_DEDUCE_NOEXCEPT((boost::hof::apply(f, x), BOOST_HOF_FORWARD(T)(x))) { return boost::hof::apply(f, x), BOOST_HOF_FORWARD(T)(x); } }; } BOOST_HOF_DECLARE_STATIC_VAR(tap, pipable_adaptor); }} // namespace boost::hof #endif