// Copyright (C) 2016-2018 T. Zachary Laine // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include template using term = boost::yap::terminal; template using term_ref = boost::yap::expression_ref &>; template using term_cref = boost::yap::expression_ref const &>; namespace yap = boost::yap; namespace bh = boost::hana; TEST(numeric, operators_unary_test) { term x{{2u}}; term const cx{{3u}}; { yap::expression>> term_expr = +term{{1u}}; yap::expression< yap::expr_kind::unary_plus, bh::tuple>> term_ref_expr = +x; yap::expression< yap::expr_kind::unary_plus, bh::tuple>> term_const_ref_expr = +cx; EXPECT_EQ(evaluate(term_expr), 1u); EXPECT_EQ(evaluate(term_ref_expr), 2u); EXPECT_EQ(evaluate(term_const_ref_expr), 3u); } { yap::expression>> term_expr = -term{{1u}}; yap::expression>> term_ref_expr = -x; yap::expression>> term_const_ref_expr = -cx; EXPECT_EQ(evaluate(term_expr), 0u - 1u); EXPECT_EQ(evaluate(term_ref_expr), 0u - 2u); EXPECT_EQ(evaluate(term_const_ref_expr), 0u - 3u); } { yap::expression>> term_expr = ~term{{1u}}; yap::expression< yap::expr_kind::complement, bh::tuple>> term_ref_expr = ~x; yap::expression< yap::expr_kind::complement, bh::tuple>> term_const_ref_expr = ~cx; EXPECT_EQ(evaluate(term_expr), 0xfffffffe); EXPECT_EQ(evaluate(term_ref_expr), 0xfffffffd); EXPECT_EQ(evaluate(term_const_ref_expr), 0xfffffffc); } { yap::expression>> term_expr = !term{{1u}}; yap::expression< yap::expr_kind::logical_not, bh::tuple>> term_ref_expr = !x; yap::expression< yap::expr_kind::logical_not, bh::tuple>> term_const_ref_expr = !cx; EXPECT_EQ(evaluate(term_expr), false); EXPECT_EQ(evaluate(term_ref_expr), false); EXPECT_EQ(evaluate(term_const_ref_expr), false); } { yap::expression>> term_expr = ++term{{1u}}; yap::expression>> term_ref_expr = ++x; yap::expression>> term_const_ref_expr = ++cx; (void)term_const_ref_expr; EXPECT_EQ(evaluate(term_expr), 2u); EXPECT_EQ(evaluate(term_ref_expr), 3u); } } TEST(address_dereference, operators_unary_test) { { uint32_t i = 1, j = 2, k = 3; term x{{j}}; term const cx{{k}}; yap::expression>> term_expr = &term{{i}}; yap::expression< yap::expr_kind::address_of, bh::tuple>> term_ref_expr = &x; yap::expression< yap::expr_kind::address_of, bh::tuple>> term_const_ref_expr = &cx; EXPECT_EQ(evaluate(term_expr), &i); EXPECT_EQ(evaluate(term_ref_expr), &j); EXPECT_EQ(evaluate(term_const_ref_expr), &k); } { uint32_t i = 1, j = 2, k = 3; term x{{&j}}; term const cx{{&k}}; yap:: expression>> term_expr = *term{{&i}}; yap::expression< yap::expr_kind::dereference, bh::tuple>> term_ref_expr = *x; yap::expression< yap::expr_kind::dereference, bh::tuple>> term_const_ref_expr = *cx; EXPECT_EQ(evaluate(term_expr), i); EXPECT_EQ(evaluate(term_ref_expr), j); EXPECT_EQ(evaluate(term_const_ref_expr), k); } }