diff --git a/sketch.cpp b/sketch.cpp index 016de22..f01f8b2 100644 --- a/sketch.cpp +++ b/sketch.cpp @@ -1160,90 +1160,6 @@ void user_eval_expression_as () std::cout << "\n"; } -namespace user_2 { - - struct number - { - double value; - }; - - number naxpy (number a, number x, number y) - { return number{a.value * x.value + y.value}; } - -#if 0 - auto eval_expression_as ( - bp17::expression< - bp17::expr_kind::plus, - bp17::expression< - bp17::expr_kind::multiplies, - term, - term - >, - term - > const & expr, - boost::hana::basic_type) - { - std::cout << "User naxpy! "; - using namespace boost::hana::literals; - return naxpy( - expr.elements[0_c].elements[0_c].elements[0_c], - expr.elements[0_c].elements[1_c].elements[0_c], - expr.elements[1_c].elements[0_c] - ); - } -#else - auto eval_expression_as ( - decltype(term{{0.0}} * number{} + number{}) const & expr, - boost::hana::basic_type, - boost::hana::tuple<>) - { - std::cout << "User naxpy! "; - return naxpy( - expr.left().left().value(), - expr.left().right().value(), - expr.right().value() - ); - } -#endif - -} - -void user_expression_transform () -{ - std::cout << "\nuser_expression_transform()\n"; - - term a{{1.0}}; - term x{{42.0}}; - term y{{3.0}}; - - bp17::expression< - bp17::expr_kind::plus, - bp17::expression< - bp17::expr_kind::multiplies, - term, - term - >, - term - > expr = a * x + y; - - // TODO: This was an error (user:: vs. user_2::). Document for users that - // they should catch an expression in an auto var to diagnose these sorts - // of things. -#if 0 - bp17::expression< - bp17::expr_kind::multiplies, - term, - term - > expr = a * x; -#endif - - user_2::number result = expr; - - std::cout << "expr=" << result.value << "\n"; // 45 - - std::cout << "\n"; -} - int main () { term_plus_x(); @@ -1257,5 +1173,4 @@ int main () default_eval(); user_eval_expression_as(); user_operator_eval(); - user_expression_transform(); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 4a0c7a7..ab1fbf0 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -16,6 +16,7 @@ macro(add_test_executable name) endmacro() add_test_executable(print) +add_test_executable(user_expression_transform) add_test_executable(placeholder_eval) add_test_executable(call_expr) add_test_executable(reference_returns) diff --git a/test/user_expression_transform.cpp b/test/user_expression_transform.cpp new file mode 100644 index 0000000..806fdb4 --- /dev/null +++ b/test/user_expression_transform.cpp @@ -0,0 +1,92 @@ +#define BOOST_PROTO17_CONVERSION_OPERATOR_TEMPLATE +#include "expression.hpp" + +#include + +#include + + +template +using term = boost::proto17::terminal; + +namespace bp17 = boost::proto17; + + +namespace user_2 { + + struct number + { + double value; + }; + + number naxpy (number a, number x, number y) + { return number{a.value * x.value + y.value}; } + +#if 0 + auto eval_expression_as ( + bp17::expression< + bp17::expr_kind::plus, + bp17::expression< + bp17::expr_kind::multiplies, + term, + term + >, + term + > const & expr, + boost::hana::basic_type) + { + std::cout << "User naxpy! "; + using namespace boost::hana::literals; + return naxpy( + expr.elements[0_c].elements[0_c].elements[0_c], + expr.elements[0_c].elements[1_c].elements[0_c], + expr.elements[1_c].elements[0_c] + ); + } +#else + auto eval_expression_as ( + decltype(term{{0.0}} * number{} + number{}) const & expr, + boost::hana::basic_type, + boost::hana::tuple<>) + { + std::cout << "User naxpy! "; + return naxpy( + expr.left().left().value(), + expr.left().right().value(), + expr.right().value() + ); + } +#endif + +} + +TEST(user_expression_transform, test_user_expression_transform) +{ + term a{{1.0}}; + term x{{42.0}}; + term y{{3.0}}; + + bp17::expression< + bp17::expr_kind::plus, + bp17::expression< + bp17::expr_kind::multiplies, + term, + term + >, + term + > expr = a * x + y; + + // TODO: This was an error (user:: vs. user_2::). Document for users that + // they should catch an expression in an auto var to diagnose these sorts + // of things. +#if 0 + bp17::expression< + bp17::expr_kind::multiplies, + term, + term + > expr = a * x; +#endif + + user_2::number result = expr; + EXPECT_EQ(result.value, 45); +}