74 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | /*!
 | ||
|  | @file | ||
|  | Defines `boost::hana::flip`. | ||
|  | 
 | ||
|  | @copyright Louis Dionne 2013-2016 | ||
|  | Distributed 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{}; | ||
|  | #endif
 | ||
|  | BOOST_HANA_NAMESPACE_END | ||
|  | 
 | ||
|  | #endif // !BOOST_HANA_FUNCTIONAL_FLIP_HPP
 |