84 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			84 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /*============================================================================= | ||
|  |     Copyright (c) 2016 Kohei Takahashi | ||
|  | 
 | ||
|  |     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_PHOENIX_CORE_EXPRESSION_HPP | ||
|  | #define BOOST_PHOENIX_CORE_EXPRESSION_HPP | ||
|  | 
 | ||
|  | #include <boost/phoenix/core/limits.hpp> | ||
|  | #include <boost/call_traits.hpp> | ||
|  | #include <boost/fusion/sequence/intrinsic/at.hpp> | ||
|  | #include <boost/phoenix/core/as_actor.hpp> | ||
|  | #include <boost/phoenix/core/detail/expression.hpp> | ||
|  | #include <boost/phoenix/core/domain.hpp> | ||
|  | #include <boost/proto/domain.hpp> | ||
|  | #include <boost/proto/make_expr.hpp> | ||
|  | #include <boost/proto/transform/pass_through.hpp> | ||
|  | 
 | ||
|  | namespace boost { namespace phoenix | ||
|  | { | ||
|  |     template <typename Expr> struct actor; | ||
|  | 
 | ||
|  | #ifdef BOOST_PHOENIX_NO_VARIADIC_EXPRESSION | ||
|  |     #include <boost/phoenix/core/detail/cpp03/expression.hpp> | ||
|  | #else | ||
|  |     template <template <typename> class Actor, typename Tag, typename... A> | ||
|  |     struct expr_ext; | ||
|  | 
 | ||
|  |     // This void filter is necessary to avoid forming reference to void | ||
|  |     // because most of other expressions are not based on variadics. | ||
|  |     template <typename Tag, typename F, typename... T> | ||
|  |     struct expr_impl; | ||
|  | 
 | ||
|  |     template <typename Tag, typename... A> | ||
|  |     struct expr_impl<Tag, void(A...)> : expr_ext<actor, Tag, A...> {}; | ||
|  | 
 | ||
|  |     template <typename Tag, typename... A, typename... T> | ||
|  |     struct expr_impl<Tag, void(A...), void, T...> : expr_impl<Tag, void(A...)> {}; | ||
|  | 
 | ||
|  |     template <typename Tag, typename... A, typename H, typename... T> | ||
|  |     struct expr_impl<Tag, void(A...), H, T...> : expr_impl<Tag, void(A..., H), T...> {}; | ||
|  | 
 | ||
|  |     template <typename Tag, typename... A> | ||
|  |     struct expr : expr_impl<Tag, void(), A...> {}; | ||
|  | 
 | ||
|  |     template <template <typename> class Actor, typename Tag, typename... A> | ||
|  |     struct expr_ext | ||
|  |         : proto::transform<expr_ext<Actor, Tag, A...>, int> | ||
|  |     { | ||
|  |         typedef | ||
|  |             typename proto::result_of::make_expr< | ||
|  |                 Tag | ||
|  |               , phoenix_default_domain //proto::basic_default_domain | ||
|  |               , typename proto::detail::uncvref<typename call_traits<A>::value_type>::type... | ||
|  |             >::type | ||
|  |         base_type; | ||
|  | 
 | ||
|  |         typedef Actor<base_type> type; | ||
|  | 
 | ||
|  |         typedef typename proto::nary_expr<Tag, A...>::proto_grammar proto_grammar; | ||
|  | 
 | ||
|  |         static type make(typename call_traits<A>::param_type... a) | ||
|  |         { //?? actor or Actor?? | ||
|  |             //Actor<base_type> const e = | ||
|  |             actor<base_type> const e = | ||
|  |             { | ||
|  |                 proto::make_expr<Tag, phoenix_default_domain>(a...) | ||
|  |             }; | ||
|  |             return e; | ||
|  |         } | ||
|  | 
 | ||
|  |         template<typename Expr, typename State, typename Data> | ||
|  |         struct impl | ||
|  |             : proto::pass_through<expr_ext>::template impl<Expr, State, Data> | ||
|  |         {}; | ||
|  | 
 | ||
|  |         typedef Tag proto_tag; | ||
|  |     }; | ||
|  | #endif | ||
|  | }} | ||
|  | 
 | ||
|  | #endif |