2
0
mirror of https://github.com/boostorg/yap.git synced 2026-02-23 04:12:15 +00:00

Use eval_expression_as() in the recursive cases of default_eval_expression().

This commit is contained in:
Zach Laine
2016-11-08 18:56:43 -06:00
parent 8419dd32a9
commit d6df84fb84
4 changed files with 36 additions and 24 deletions

View File

@@ -16,6 +16,8 @@ namespace boost::proto17 {
template <typename Tuple, expr_kind Kind, typename ...T>
decltype(auto) default_eval_expr (expression<Kind, T...> const & expr, Tuple && args)
{
using void_type = hana::basic_type<void>;
using namespace hana::literals;
if constexpr (Kind == expr_kind::terminal) {
static_assert(sizeof...(T) == 1);
@@ -28,8 +30,8 @@ namespace boost::proto17 {
#define BOOST_PROTO17_UNARY_OPERATOR_CASE(op_name) \
else if constexpr (Kind == expr_kind:: op_name) { \
return \
eval_## op_name( \
default_eval_expr(expr.elements[0_c], static_cast<Tuple &&>(args)) \
eval_ ## op_name( \
eval_expression_as(expr.elements[0_c], void_type{}, static_cast<Tuple &&>(args)) \
); \
}
@@ -49,9 +51,9 @@ namespace boost::proto17 {
#define BOOST_PROTO17_BINARY_OPERATOR_CASE(op_name) \
else if constexpr (Kind == expr_kind:: op_name) { \
return \
eval_## op_name( \
default_eval_expr(expr.elements[0_c], static_cast<Tuple &&>(args)), \
default_eval_expr(expr.elements[1_c], static_cast<Tuple &&>(args)) \
eval_ ## op_name( \
eval_expression_as(expr.elements[0_c], void_type{}, static_cast<Tuple &&>(args)), \
eval_expression_as(expr.elements[1_c], void_type{}, static_cast<Tuple &&>(args)) \
); \
}
@@ -77,8 +79,8 @@ namespace boost::proto17 {
else if constexpr (Kind == expr_kind::comma) {
return
eval_comma(
default_eval_expr(expr.elements[0_c], static_cast<Tuple &&>(args)),
default_eval_expr(expr.elements[1_c], static_cast<Tuple &&>(args))
eval_expression_as(expr.elements[0_c], void_type{}, static_cast<Tuple &&>(args)),
eval_expression_as(expr.elements[1_c], void_type{}, static_cast<Tuple &&>(args))
);
}
@@ -101,7 +103,7 @@ namespace boost::proto17 {
else if constexpr (Kind == expr_kind::call) {
return hana::unpack(
hana::transform(expr.elements, [&args] (auto && element) {
return default_eval_expr(element, static_cast<Tuple &&>(args));
return eval_expression_as(element, void_type{}, static_cast<Tuple &&>(args));
}),
eval_call
);

View File

@@ -3,7 +3,6 @@
#include "expression_fwd.hpp"
#include "detail/expression.hpp"
#include "detail/default_eval.hpp"
#include <boost/hana/tuple.hpp>
#include <boost/hana/size.hpp>
@@ -14,15 +13,19 @@ namespace boost::proto17 {
namespace adl_detail {
template <typename R, typename E, typename ...T>
constexpr decltype(auto) eval_expression_as (E const & expr, hana::basic_type<R>, T && ...t)
{ return static_cast<R>(detail::default_eval_expr(expr, hana::make_tuple(static_cast<T &&>(t)...))); }
template <typename R, typename E, typename Tuple>
constexpr decltype(auto) eval_expression_as (E const & expr, hana::basic_type<R>, Tuple && args)
{ return static_cast<R>(detail::default_eval_expr(expr, static_cast<Tuple &&>(args))); }
template <typename E, typename Tuple>
constexpr decltype(auto) eval_expression_as (E const & expr, hana::basic_type<void>, Tuple && args)
{ return detail::default_eval_expr(expr, static_cast<Tuple &&>(args)); }
struct eval_expression_as_fn
{
template <typename R, typename E, typename ...T>
constexpr decltype(auto) operator() (E const & expr, hana::basic_type<R> rtype, T && ...t) const
{ return eval_expression_as(expr, rtype, static_cast<T &&>(t)...); }
template <typename R, typename E, typename Tuple>
constexpr decltype(auto) operator() (E const & expr, hana::basic_type<R> rtype, Tuple && args) const
{ return eval_expression_as(expr, rtype, static_cast<Tuple &&>(args)); }
};
}
@@ -43,7 +46,7 @@ namespace boost::proto17 {
// TODO: static assert/SFINAE sizeof...(T) >= highest-indexed placeholder + 1
template <typename R, typename Expr, typename ...T>
decltype(auto) evaluate_as (Expr const & expr, T && ...t)
{ return eval_expression_as(expr, hana::basic_type<R>{}, static_cast<T &&>(t)...); }
{ return eval_expression_as(expr, hana::basic_type<R>{}, hana::make_tuple(static_cast<T &&>(t)...)); }
template <expr_kind Kind, typename ...T>
struct expression
@@ -75,7 +78,7 @@ namespace boost::proto17 {
template <typename R>
operator R ()
{ return eval_expression_as(*this, hana::basic_type<R>{}); }
{ return eval_expression_as(*this, hana::basic_type<R>{}, hana::tuple<>{}); }
decltype(auto) value () const
{
@@ -232,4 +235,6 @@ namespace boost::proto17 {
}
#include "detail/default_eval.hpp"
#endif

View File

@@ -80,6 +80,13 @@ namespace boost::proto17 {
}
namespace detail {
template <typename Tuple, expr_kind Kind, typename ...T>
decltype(auto) default_eval_expr (expression<Kind, T...> const & expr, Tuple && args);
}
}
#endif

View File

@@ -923,18 +923,15 @@ namespace user {
inline auto eval_plus (A a, B b)
{ return number{a.value - b.value}; }
template <typename E, typename ...T>
template <typename E, typename Tuple>
constexpr auto eval_expression_as (
E const & expr,
boost::hana::basic_type<user::number>,
T && ...t)
Tuple && args)
{
std::cout << "User eval! ";
return static_cast<user::number>(
bp17::detail::default_eval_expr(
expr,
boost::hana::make_tuple(static_cast<T &&>(t)...)
)
bp17::detail::default_eval_expr(expr, static_cast<Tuple &&>(args))
);
}
@@ -1099,7 +1096,8 @@ namespace user_2 {
#else
auto eval_expression_as (
decltype(term<number>{{0.0}} * number{} + number{}) const & expr,
boost::hana::basic_type<number>)
boost::hana::basic_type<number>,
boost::hana::tuple<>)
{
std::cout << "User naxpy! ";
return naxpy(