55 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
		
		
			
		
	
	
			55 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
|  | /*!
 | ||
|  | @file | ||
|  | Defines `boost::hana::lift`. | ||
|  | 
 | ||
|  | @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_LIFT_HPP
 | ||
|  | #define BOOST_HANA_LIFT_HPP
 | ||
|  | 
 | ||
|  | #include <boost/hana/fwd/lift.hpp>
 | ||
|  | 
 | ||
|  | #include <boost/hana/concept/applicative.hpp>
 | ||
|  | #include <boost/hana/concept/sequence.hpp>
 | ||
|  | #include <boost/hana/config.hpp>
 | ||
|  | #include <boost/hana/core/dispatch.hpp>
 | ||
|  | #include <boost/hana/core/make.hpp>
 | ||
|  | 
 | ||
|  | 
 | ||
|  | BOOST_HANA_NAMESPACE_BEGIN | ||
|  |     template <typename A> | ||
|  |     struct lift_t { | ||
|  |     #ifndef BOOST_HANA_CONFIG_DISABLE_CONCEPT_CHECKS
 | ||
|  |         static_assert(hana::Applicative<A>::value, | ||
|  |         "hana::lift<A> requires 'A' to be an Applicative"); | ||
|  |     #endif
 | ||
|  | 
 | ||
|  |         template <typename X> | ||
|  |         constexpr auto operator()(X&& x) const { | ||
|  |             using Lift = BOOST_HANA_DISPATCH_IF(lift_impl<A>, | ||
|  |                 hana::Applicative<A>::value | ||
|  |             ); | ||
|  | 
 | ||
|  |             return Lift::apply(static_cast<X&&>(x)); | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     template <typename A, bool condition> | ||
|  |     struct lift_impl<A, when<condition>> : default_ { | ||
|  |         template <typename ...Args> | ||
|  |         static constexpr auto apply(Args&& ...args) = delete; | ||
|  |     }; | ||
|  | 
 | ||
|  |     template <typename S> | ||
|  |     struct lift_impl<S, when<Sequence<S>::value>> { | ||
|  |         template <typename X> | ||
|  |         static constexpr decltype(auto) apply(X&& x) | ||
|  |         { return hana::make<S>(static_cast<X&&>(x)); } | ||
|  |     }; | ||
|  | BOOST_HANA_NAMESPACE_END | ||
|  | 
 | ||
|  | #endif // !BOOST_HANA_LIFT_HPP
 |