boost/xpressive/proto/eval.hpp
///////////////////////////////////////////////////////////////////////////////
/// \file eval.hpp
/// Contains the eval() expression evaluator.
//
// Copyright 2007 Eric Niebler. 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_PROTO_EVAL_HPP_EAN_03_29_2007
#define BOOST_PROTO_EVAL_HPP_EAN_03_29_2007
#include <boost/xpressive/proto/detail/prefix.hpp> // must be first include
#include <boost/type_traits/remove_reference.hpp>
#include <boost/xpressive/proto/detail/suffix.hpp> // must be last include
namespace boost { namespace proto
{
namespace result_of
{
template<typename Expr, typename Context>
struct eval
{
typedef typename Context::template eval<Expr>::result_type type;
};
}
namespace functional
{
struct eval
{
template<typename Sig>
struct result;
template<typename This, typename Expr, typename Context>
struct result<This(Expr, Context)>
: proto::result_of::eval<
typename remove_reference<Expr>::type
, typename remove_reference<Context>::type
>
{};
template<typename Expr, typename Context>
typename proto::result_of::eval<Expr, Context>::type
operator ()(Expr &expr, Context &context) const
{
return typename Context::template eval<Expr>()(expr, context);
}
template<typename Expr, typename Context>
typename proto::result_of::eval<Expr, Context>::type
operator ()(Expr &expr, Context const &context) const
{
return typename Context::template eval<Expr>()(expr, context);
}
};
}
functional::eval const eval = {};
}}
#endif