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:
@@ -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
|
||||
);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
12
sketch.cpp
12
sketch.cpp
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user