operators_unary.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. // Copyright (C) 2016-2018 T. Zachary Laine
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See
  4. // accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. #include <boost/yap/expression.hpp>
  7. #include <boost/test/minimal.hpp>
  8. #include <sstream>
  9. template<typename T>
  10. using term = boost::yap::terminal<boost::yap::expression, T>;
  11. template<typename T>
  12. using term_ref = boost::yap::expression_ref<boost::yap::expression, term<T> &>;
  13. template<typename T>
  14. using term_cref =
  15. boost::yap::expression_ref<boost::yap::expression, term<T> const &>;
  16. namespace yap = boost::yap;
  17. namespace bh = boost::hana;
  18. int test_main(int, char * [])
  19. {
  20. {
  21. term<uint32_t> x{{2u}};
  22. term<uint32_t> const cx{{3u}};
  23. {
  24. yap::expression<
  25. yap::expr_kind::unary_plus,
  26. bh::tuple<term<uint32_t>>>
  27. term_expr = +term<uint32_t>{{1u}};
  28. yap::expression<
  29. yap::expr_kind::unary_plus,
  30. bh::tuple<term_ref<uint32_t>>>
  31. term_ref_expr = +x;
  32. yap::expression<
  33. yap::expr_kind::unary_plus,
  34. bh::tuple<term_cref<uint32_t>>>
  35. term_const_ref_expr = +cx;
  36. BOOST_CHECK(evaluate(term_expr) == 1u);
  37. BOOST_CHECK(evaluate(term_ref_expr) == 2u);
  38. BOOST_CHECK(evaluate(term_const_ref_expr) == 3u);
  39. }
  40. {
  41. yap::expression<yap::expr_kind::negate, bh::tuple<term<uint32_t>>>
  42. term_expr = -term<uint32_t>{{1u}};
  43. yap::expression<
  44. yap::expr_kind::negate,
  45. bh::tuple<term_ref<uint32_t>>>
  46. term_ref_expr = -x;
  47. yap::expression<
  48. yap::expr_kind::negate,
  49. bh::tuple<term_cref<uint32_t>>>
  50. term_const_ref_expr = -cx;
  51. BOOST_CHECK(evaluate(term_expr) == 0u - 1u);
  52. BOOST_CHECK(evaluate(term_ref_expr) == 0u - 2u);
  53. BOOST_CHECK(evaluate(term_const_ref_expr) == 0u - 3u);
  54. }
  55. {
  56. yap::expression<
  57. yap::expr_kind::complement,
  58. bh::tuple<term<uint32_t>>>
  59. term_expr = ~term<uint32_t>{{1u}};
  60. yap::expression<
  61. yap::expr_kind::complement,
  62. bh::tuple<term_ref<uint32_t>>>
  63. term_ref_expr = ~x;
  64. yap::expression<
  65. yap::expr_kind::complement,
  66. bh::tuple<term_cref<uint32_t>>>
  67. term_const_ref_expr = ~cx;
  68. BOOST_CHECK(evaluate(term_expr) == 0xfffffffe);
  69. BOOST_CHECK(evaluate(term_ref_expr) == 0xfffffffd);
  70. BOOST_CHECK(evaluate(term_const_ref_expr) == 0xfffffffc);
  71. }
  72. {
  73. yap::expression<
  74. yap::expr_kind::logical_not,
  75. bh::tuple<term<uint32_t>>>
  76. term_expr = !term<uint32_t>{{1u}};
  77. yap::expression<
  78. yap::expr_kind::logical_not,
  79. bh::tuple<term_ref<uint32_t>>>
  80. term_ref_expr = !x;
  81. yap::expression<
  82. yap::expr_kind::logical_not,
  83. bh::tuple<term_cref<uint32_t>>>
  84. term_const_ref_expr = !cx;
  85. BOOST_CHECK(evaluate(term_expr) == false);
  86. BOOST_CHECK(evaluate(term_ref_expr) == false);
  87. BOOST_CHECK(evaluate(term_const_ref_expr) == false);
  88. }
  89. {
  90. yap::expression<yap::expr_kind::pre_inc, bh::tuple<term<uint32_t>>>
  91. term_expr = ++term<uint32_t>{{1u}};
  92. yap::expression<
  93. yap::expr_kind::pre_inc,
  94. bh::tuple<term_ref<uint32_t>>>
  95. term_ref_expr = ++x;
  96. yap::expression<
  97. yap::expr_kind::pre_inc,
  98. bh::tuple<term_cref<uint32_t>>>
  99. term_const_ref_expr = ++cx;
  100. (void)term_const_ref_expr;
  101. BOOST_CHECK(evaluate(term_expr) == 2u);
  102. BOOST_CHECK(evaluate(term_ref_expr) == 3u);
  103. }
  104. }
  105. {
  106. {
  107. uint32_t i = 1, j = 2, k = 3;
  108. term<uint32_t &> x{{j}};
  109. term<uint32_t &> const cx{{k}};
  110. yap::expression<
  111. yap::expr_kind::address_of,
  112. bh::tuple<term<uint32_t &>>>
  113. term_expr = &term<uint32_t &>{{i}};
  114. yap::expression<
  115. yap::expr_kind::address_of,
  116. bh::tuple<term_ref<uint32_t &>>>
  117. term_ref_expr = &x;
  118. yap::expression<
  119. yap::expr_kind::address_of,
  120. bh::tuple<term_cref<uint32_t &>>>
  121. term_const_ref_expr = &cx;
  122. BOOST_CHECK(evaluate(term_expr) == &i);
  123. BOOST_CHECK(evaluate(term_ref_expr) == &j);
  124. BOOST_CHECK(evaluate(term_const_ref_expr) == &k);
  125. }
  126. {
  127. uint32_t i = 1, j = 2, k = 3;
  128. term<uint32_t *> x{{&j}};
  129. term<uint32_t *> const cx{{&k}};
  130. yap::expression<
  131. yap::expr_kind::dereference,
  132. bh::tuple<term<uint32_t *>>>
  133. term_expr = *term<uint32_t *>{{&i}};
  134. yap::expression<
  135. yap::expr_kind::dereference,
  136. bh::tuple<term_ref<uint32_t *>>>
  137. term_ref_expr = *x;
  138. yap::expression<
  139. yap::expr_kind::dereference,
  140. bh::tuple<term_cref<uint32_t *>>>
  141. term_const_ref_expr = *cx;
  142. BOOST_CHECK(evaluate(term_expr) == i);
  143. BOOST_CHECK(evaluate(term_ref_expr) == j);
  144. BOOST_CHECK(evaluate(term_const_ref_expr) == k);
  145. }
  146. }
  147. return 0;
  148. }