| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 | /*!@fileDefines `boost::hana::flip`.@copyright Louis Dionne 2013-2017Distributed under the Boost Software License, Version 1.0.(See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt) */#ifndef BOOST_HANA_FUNCTIONAL_FLIP_HPP#define BOOST_HANA_FUNCTIONAL_FLIP_HPP#include <boost/hana/config.hpp>#include <boost/hana/detail/create.hpp>#include <utility>BOOST_HANA_NAMESPACE_BEGIN    //! @ingroup group-functional    //! Invoke a function with its two first arguments reversed.    //!    //! Specifically, `flip(f)` is a function such that    //! @code    //!     flip(f)(x, y, z...) == f(y, x, z...)    //! @endcode    //!    //! ### Example    //! @include example/functional/flip.cpp#ifdef BOOST_HANA_DOXYGEN_INVOKED    constexpr auto flip = [](auto&& f) {        return [perfect-capture](auto&& x, auto&& y, auto&& ...z) -> decltype(auto) {            return forwarded(f)(forwarded(y), forwarded(x), forwarded(z)...);        };    };#else    template <typename F>    struct flip_t {        F f;        template <typename X, typename Y, typename ...Z>        constexpr decltype(auto) operator()(X&& x, Y&& y, Z&& ...z) const& {            return f(                static_cast<Y&&>(y),                static_cast<X&&>(x),                static_cast<Z&&>(z)...            );        }        template <typename X, typename Y, typename ...Z>        constexpr decltype(auto) operator()(X&& x, Y&& y, Z&& ...z) & {            return f(                static_cast<Y&&>(y),                static_cast<X&&>(x),                static_cast<Z&&>(z)...            );        }        template <typename X, typename Y, typename ...Z>        constexpr decltype(auto) operator()(X&& x, Y&& y, Z&& ...z) && {            return std::move(f)(                static_cast<Y&&>(y),                static_cast<X&&>(x),                static_cast<Z&&>(z)...            );        }    };    constexpr detail::create<flip_t> flip{};#endifBOOST_HANA_NAMESPACE_END#endif // !BOOST_HANA_FUNCTIONAL_FLIP_HPP
 |