140 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			140 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | /*============================================================================== | ||
|  |     Copyright (c) 2001-2010 Joel de Guzman | ||
|  |     Copyright (c) 2010 Thomas Heller | ||
|  | 
 | ||
|  |     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_VALUE_HPP | ||
|  | #define BOOST_PHOENIX_CORE_VALUE_HPP | ||
|  | 
 | ||
|  | #include <boost/phoenix/core/limits.hpp> | ||
|  | #include <boost/phoenix/core/actor.hpp> | ||
|  | #include <boost/phoenix/core/as_actor.hpp> | ||
|  | #include <boost/phoenix/core/terminal.hpp> | ||
|  | #include <boost/phoenix/core/is_value.hpp> | ||
|  | #include <boost/utility/result_of.hpp> | ||
|  | 
 | ||
|  | namespace boost { namespace phoenix | ||
|  | { | ||
|  |     //////////////////////////////////////////////////////////////////////////// | ||
|  |     // | ||
|  |     // values | ||
|  |     // | ||
|  |     //      function for evaluating values, e.g. val(123) | ||
|  |     // | ||
|  |     //////////////////////////////////////////////////////////////////////////// | ||
|  |   | ||
|  |     namespace expression | ||
|  |     { | ||
|  |         template <typename T> | ||
|  |         struct value | ||
|  |             : expression::terminal<T> | ||
|  |         { | ||
|  |             typedef | ||
|  |                 typename expression::terminal<T>::type | ||
|  |                 type; | ||
|  |            /* | ||
|  |             static const type make(T & t) | ||
|  |             { | ||
|  |                 typename value<T>::type const e = {{t}}; | ||
|  |                 return e; | ||
|  |             } | ||
|  |            */ | ||
|  |         }; | ||
|  |     } | ||
|  | 
 | ||
|  |     template <typename T> | ||
|  |     inline | ||
|  |     typename expression::value<T>::type const | ||
|  |     val(T t) | ||
|  |     { | ||
|  |         return expression::value<T>::make(t); | ||
|  |     } | ||
|  | 
 | ||
|  |     // Identifies this Expr as a value. | ||
|  |     // I think this is wrong. It is identifying all actors as values. | ||
|  |     // Yes, it is giving false positives and needs a rethink. | ||
|  |     // And this gives no positives. | ||
|  |     //template <typename T> | ||
|  |     //struct is_value<expression::value<T> > | ||
|  |     //    : mpl::true_ | ||
|  |     //{}; | ||
|  | 
 | ||
|  |     // Call out actor for special handling | ||
|  |   // Is this correct? It applies to any actor. | ||
|  |   // In which case why is it here? | ||
|  |     template<typename Expr> | ||
|  |     struct is_custom_terminal<actor<Expr> > | ||
|  |       : mpl::true_ | ||
|  |     {}; | ||
|  |      | ||
|  |     // Special handling for actor | ||
|  |     template<typename Expr> | ||
|  |     struct custom_terminal<actor<Expr> > | ||
|  |     { | ||
|  |         template <typename Sig> | ||
|  |         struct result; | ||
|  | 
 | ||
|  |         template <typename This, typename Actor, typename Context> | ||
|  |         struct result<This(Actor, Context)> | ||
|  |             : boost::remove_const< | ||
|  |                     typename boost::remove_reference< | ||
|  |                     typename evaluator::impl<Actor, Context, proto::empty_env>::result_type | ||
|  |                  >::type | ||
|  |              > | ||
|  |         {}; | ||
|  | 
 | ||
|  |         template <typename Context> | ||
|  |         typename result<custom_terminal(actor<Expr> const &, Context &)>::type | ||
|  |         operator()(actor<Expr> const & expr, Context & ctx) const | ||
|  |         { | ||
|  |           typedef typename result<custom_terminal(actor<Expr> const &, Context &)>::type result_type; | ||
|  |           result_type r = boost::phoenix::eval(expr, ctx); | ||
|  |           // std::cout << "Evaluating val() = " << r << std::endl; | ||
|  |           return r; | ||
|  |         } | ||
|  |     }; | ||
|  | 
 | ||
|  |     namespace meta | ||
|  |     { | ||
|  |         template<typename T> | ||
|  |         struct const_ref | ||
|  |             : add_reference<typename add_const<T>::type> | ||
|  |         {}; | ||
|  | 
 | ||
|  |         template<typename T> | ||
|  |         struct argument_type | ||
|  |             : mpl::eval_if_c< | ||
|  |                 is_function<typename remove_pointer<T>::type>::value | ||
|  |               , mpl::identity<T> | ||
|  |               , const_ref<T> | ||
|  |             > | ||
|  |         { | ||
|  |             typedef T type; | ||
|  |         }; | ||
|  | 
 | ||
|  |         template <typename T> | ||
|  |         struct decay | ||
|  |         { | ||
|  |             typedef T type; | ||
|  |         }; | ||
|  |         template <typename T, int N> | ||
|  |         struct decay<T[N]> : decay<T const *> {}; | ||
|  |     } | ||
|  |      | ||
|  |     template <typename T> | ||
|  |     struct as_actor<T, mpl::false_> | ||
|  |     { | ||
|  |         typedef typename expression::value<typename meta::decay<T>::type >::type type; | ||
|  | 
 | ||
|  |         static type | ||
|  |         convert(typename meta::argument_type<typename meta::decay<T>::type>::type t) | ||
|  |         { | ||
|  |             return expression::value<typename meta::decay<T>::type >::make(t); | ||
|  |         } | ||
|  |     }; | ||
|  | }} | ||
|  | 
 | ||
|  | #endif |