#define BOOST_YAP_CONVERSION_OPERATOR_TEMPLATE #include #include template using term = boost::yap::terminal; namespace yap = boost::yap; namespace bh = boost::hana; TEST(default_eval, default_eval) { term unity{1.0}; int i_ = 42; term i{std::move(i_)}; yap::expression< yap::expr_kind::minus, bh::tuple< boost::yap::expression_ref &>, term > > expr = unity - std::move(i); yap::expression< yap::expr_kind::plus, bh::tuple< boost::yap::expression_ref &>, yap::expression< yap::expr_kind::minus, bh::tuple< boost::yap::expression_ref &>, term > > > > unevaluated_expr_1 = unity + std::move(expr); yap::expression< yap::expr_kind::plus, bh::tuple< boost::yap::expression_ref &>, boost::yap::expression_ref &> > > unevaluated_expr_2 = unity + unity; term const const_unity{1.0}; yap::expression< yap::expr_kind::plus, bh::tuple< boost::yap::expression_ref &>, boost::yap::expression_ref const &> > > unevaluated_expr_3 = unity + const_unity; { double result = unity; EXPECT_EQ(result, 1); } { double result = expr; EXPECT_EQ(result, -41); } { double result = unevaluated_expr_1; EXPECT_EQ(result, -40); } { double result = unevaluated_expr_2; EXPECT_EQ(result, 2); } { double result = unevaluated_expr_3; EXPECT_EQ(result, 2); } { double result = evaluate(unity, 5, 6, 7); EXPECT_EQ(result, 1); } { double result = evaluate(expr); EXPECT_EQ(result, -41); } { double result = evaluate(unevaluated_expr_1, std::string("15")); EXPECT_EQ(result, -40); } { double result = evaluate(unevaluated_expr_2, std::string("15")); EXPECT_EQ(result, 2); } { double result = evaluate(unevaluated_expr_3, std::string("15")); EXPECT_EQ(result, 2); } }