57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#ifndef BOOST_TYPE_TRAITS_DETAIL_MP_DEFER_HPP_INCLUDED
							 | 
						||
| 
								 | 
							
								#define BOOST_TYPE_TRAITS_DETAIL_MP_DEFER_HPP_INCLUDED
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//  Copyright 2015 Peter Dimov
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//  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
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/type_traits/integral_constant.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/type_traits/conditional.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace type_traits_detail
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// mp_valid
							 | 
						||
| 
								 | 
							
								// implementation by Bruno Dutra (by the name is_evaluable)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<template<class...> class F, class... T>
							 | 
						||
| 
								 | 
							
								struct mp_valid_impl
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    template<template<class...> class G, class = G<T...>>
							 | 
						||
| 
								 | 
							
								    static boost::true_type check_s(int);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    template<template<class...> class>
							 | 
						||
| 
								 | 
							
								    static boost::false_type check_s(...);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    using type = decltype(check_s<F>(0));
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<template<class...> class F, class... T>
							 | 
						||
| 
								 | 
							
								using mp_valid = typename mp_valid_impl<F, T...>::type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// mp_defer
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct mp_empty
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<template<class...> class F, class... T> struct mp_defer_impl
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    using type = F<T...>;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<template<class...> class F, class... T> using mp_defer = typename boost::conditional<mp_valid<F, T...>::value, mp_defer_impl<F, T...>, mp_empty>::type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // namespace type_traits_detail
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // namespace boost
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // #ifndef BOOST_TYPE_TRAITS_DETAIL_MP_DEFER_HPP_INCLUDED
							 |