#define BOOST_YAP_CONVERSION_OPERATOR_TEMPLATE 1 #include #include #include template using term = boost::yap::terminal; namespace yap = boost::yap; namespace bh = boost::hana; namespace user { struct number { double value; friend number operator+ (number lhs, number rhs) { return number{lhs.value + rhs.value}; } friend number operator* (number lhs, number rhs) { return number{lhs.value * rhs.value}; } }; number naxpy (number a, number x, number y) { return number{a.value * x.value + y.value + 10.0}; } //[ naxpy_transform_decl template decltype(auto) transform_expression ( boost::yap::expression< boost::yap::expr_kind::plus, boost::hana::tuple< boost::yap::expression< boost::yap::expr_kind::multiplies, boost::hana::tuple< Expr1, Expr2 > >, Expr3 > > const & expr ) { return naxpy( evaluate(expr.left().left()), evaluate(expr.left().right()), evaluate(expr.right()) ); } //] } TEST(user_expression_transform_2, test_user_expression_transform_2) { term k{{2.0}}; term a{{1.0}}; term x{{42.0}}; term y{{3.0}}; { //[ naxpy_transform_use auto expr = (a * x + y) * (a * x + y) + (a * x + y); user::number result = expr; //] EXPECT_EQ(result.value, 55 * 55 + 55 + 10); } }