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
 |