#include #include template using term = boost::yap::terminal; template using ref = boost::yap::expression_ref; namespace yap = boost::yap; namespace bh = boost::hana; template struct user_expr { using this_type = user_expr; static boost::yap::expr_kind const kind = Kind; Tuple elements; BOOST_YAP_USER_BINARY_OPERATOR_MEMBER(plus, this_type, ::user_expr) }; template using user_term = boost::yap::terminal; template using user_ref = boost::yap::expression_ref; TEST(expression, test_right) { term unity = {{1.0}}; using plus_expr_type = yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, term > >; { plus_expr_type plus_expr = unity + term{{1}}; EXPECT_TRUE(( std::is_same &&>::value )); } { plus_expr_type plus_expr = unity + term{{1}}; EXPECT_TRUE(( std::is_same &>::value )); } { plus_expr_type const plus_expr = unity + term{{1}}; EXPECT_TRUE(( std::is_same const &>::value )); } { term unity = {{1.0}}; using plus_expr_type = yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, term > >; plus_expr_type plus_expr = unity + term{{1}}; using plus_plus_expr_type = yap::expression< yap::expr_kind::plus, bh::tuple< ref, term > >; { plus_plus_expr_type plus_plus_expr = plus_expr + term{{1}}; ref plus_expr_ref = bh::front(plus_plus_expr.elements); EXPECT_TRUE(( std::is_same &>::value )); } { plus_plus_expr_type plus_plus_expr = plus_expr + term{{1}}; ref plus_expr_ref = bh::front(plus_plus_expr.elements); EXPECT_TRUE(( std::is_same &>::value )); } { plus_plus_expr_type plus_plus_expr = plus_expr + term{{1}}; ref const plus_expr_ref = bh::front(plus_plus_expr.elements); EXPECT_TRUE(( std::is_same &>::value )); } } { term unity = {{1.0}}; using plus_expr_type = yap::expression< yap::expr_kind::plus, bh::tuple< ref &>, term > >; plus_expr_type const plus_expr = unity + term{{1}}; using plus_plus_expr_type = yap::expression< yap::expr_kind::plus, bh::tuple< ref, term > >; { plus_plus_expr_type plus_plus_expr = plus_expr + term{{1}}; ref plus_expr_ref = bh::front(plus_plus_expr.elements); EXPECT_TRUE(( std::is_same const &>::value )); } { plus_plus_expr_type plus_plus_expr = plus_expr + term{{1}}; ref plus_expr_ref = bh::front(plus_plus_expr.elements); EXPECT_TRUE(( std::is_same const &>::value )); } { plus_plus_expr_type plus_plus_expr = plus_expr + term{{1}}; ref const plus_expr_ref = bh::front(plus_plus_expr.elements); EXPECT_TRUE(( std::is_same const &>::value )); } } } TEST(user_expr, test_right) { user_term unity = {{1.0}}; using plus_expr_type = user_expr< yap::expr_kind::plus, bh::tuple< user_ref &>, user_term > >; { plus_expr_type plus_expr = unity + user_term{{1}}; EXPECT_TRUE(( std::is_same &&>::value )); } { plus_expr_type plus_expr = unity + user_term{{1}}; EXPECT_TRUE(( std::is_same &>::value )); } { plus_expr_type const plus_expr = unity + user_term{{1}}; EXPECT_TRUE(( std::is_same const &>::value )); } { user_term unity = {{1.0}}; using plus_expr_type = user_expr< yap::expr_kind::plus, bh::tuple< user_ref &>, user_term > >; plus_expr_type plus_expr = unity + user_term{{1}}; using plus_plus_expr_type = user_expr< yap::expr_kind::plus, bh::tuple< user_ref, user_term > >; { plus_plus_expr_type plus_plus_expr = plus_expr + user_term{{1}}; user_ref plus_expr_ref = bh::front(plus_plus_expr.elements); EXPECT_TRUE(( std::is_same &>::value )); } { plus_plus_expr_type plus_plus_expr = plus_expr + user_term{{1}}; user_ref plus_expr_ref = bh::front(plus_plus_expr.elements); EXPECT_TRUE(( std::is_same &>::value )); } { plus_plus_expr_type plus_plus_expr = plus_expr + user_term{{1}}; user_ref const plus_expr_ref = bh::front(plus_plus_expr.elements); EXPECT_TRUE(( std::is_same &>::value )); } } { user_term unity = {{1.0}}; using plus_expr_type = user_expr< yap::expr_kind::plus, bh::tuple< user_ref &>, user_term > >; plus_expr_type const plus_expr = unity + user_term{{1}}; using plus_plus_expr_type = user_expr< yap::expr_kind::plus, bh::tuple< user_ref, user_term > >; { plus_plus_expr_type plus_plus_expr = plus_expr + user_term{{1}}; user_ref plus_expr_ref = bh::front(plus_plus_expr.elements); EXPECT_TRUE(( std::is_same const &>::value )); } { plus_plus_expr_type plus_plus_expr = plus_expr + user_term{{1}}; user_ref plus_expr_ref = bh::front(plus_plus_expr.elements); EXPECT_TRUE(( std::is_same const &>::value )); } { plus_plus_expr_type plus_plus_expr = plus_expr + user_term{{1}}; user_ref const plus_expr_ref = bh::front(plus_plus_expr.elements); EXPECT_TRUE(( std::is_same const &>::value )); } } }