compile_term_plus_expr.cpp 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  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. template<typename T>
  8. using term = boost::yap::terminal<boost::yap::expression, T>;
  9. template<typename T>
  10. using ref = boost::yap::expression_ref<boost::yap::expression, T>;
  11. namespace yap = boost::yap;
  12. namespace bh = boost::hana;
  13. void compile_term_plus_expr()
  14. {
  15. // values
  16. {
  17. term<double> unity{1.0};
  18. term<int> i = {1};
  19. yap::expression<
  20. yap::expr_kind::plus,
  21. bh::tuple<ref<term<double> &>, ref<term<int> &>>>
  22. expr = unity + i;
  23. yap::expression<
  24. yap::expr_kind::plus,
  25. bh::tuple<
  26. ref<term<double> &>,
  27. ref<yap::expression<
  28. yap::expr_kind::plus,
  29. bh::tuple<ref<term<double> &>, ref<term<int> &>>> &>>>
  30. unevaluated_expr = unity + expr;
  31. (void)unevaluated_expr;
  32. }
  33. {
  34. term<double> unity{1.0};
  35. term<int const> i = {1};
  36. yap::expression<
  37. yap::expr_kind::plus,
  38. bh::tuple<ref<term<double> &>, ref<term<int const> &>>>
  39. expr = unity + i;
  40. yap::expression<
  41. yap::expr_kind::plus,
  42. bh::tuple<
  43. ref<term<double> &>,
  44. ref<yap::expression<
  45. yap::expr_kind::plus,
  46. bh::tuple<ref<term<double> &>, ref<term<int const> &>>> &>>>
  47. unevaluated_expr = unity + expr;
  48. (void)unevaluated_expr;
  49. }
  50. {
  51. term<double> unity{1.0};
  52. term<int> i = {1};
  53. yap::expression<
  54. yap::expr_kind::plus,
  55. bh::tuple<ref<term<double> &>, term<int>>>
  56. expr = unity + std::move(i);
  57. yap::expression<
  58. yap::expr_kind::plus,
  59. bh::tuple<
  60. ref<term<double> &>,
  61. ref<yap::expression<
  62. yap::expr_kind::plus,
  63. bh::tuple<ref<term<double> &>, term<int>>> &>>>
  64. unevaluated_expr = unity + expr;
  65. (void)unevaluated_expr;
  66. }
  67. // const value terminals/expressions
  68. {
  69. term<double> unity{1.0};
  70. term<int> const i = {1};
  71. yap::expression<
  72. yap::expr_kind::plus,
  73. bh::tuple<ref<term<double> &>, ref<term<int> const &>>> const expr =
  74. unity + i;
  75. yap::expression<
  76. yap::expr_kind::plus,
  77. bh::tuple<
  78. ref<term<double> &>,
  79. ref<yap::expression<
  80. yap::expr_kind::plus,
  81. bh::tuple<
  82. ref<term<double> &>,
  83. ref<term<int> const &>>> const &>>>
  84. unevaluated_expr = unity + expr;
  85. (void)unevaluated_expr;
  86. }
  87. {
  88. term<double> unity{1.0};
  89. term<int> i = {1};
  90. yap::expression<
  91. yap::expr_kind::plus,
  92. bh::tuple<ref<term<double> &>, ref<term<int> &>>> const expr =
  93. unity + i;
  94. yap::expression<
  95. yap::expr_kind::plus,
  96. bh::tuple<
  97. ref<term<double> &>,
  98. ref<yap::expression<
  99. yap::expr_kind::plus,
  100. bh::tuple<ref<term<double> &>, ref<term<int> &>>> const &>>>
  101. unevaluated_expr = unity + expr;
  102. (void)unevaluated_expr;
  103. }
  104. // lvalue refs
  105. {
  106. term<double> unity{1.0};
  107. int i_ = 1;
  108. term<int &> i{i_};
  109. yap::expression<
  110. yap::expr_kind::plus,
  111. bh::tuple<ref<term<double> &>, ref<term<int &> &>>>
  112. expr = unity + i;
  113. yap::expression<
  114. yap::expr_kind::plus,
  115. bh::tuple<
  116. ref<term<double> &>,
  117. ref<yap::expression<
  118. yap::expr_kind::plus,
  119. bh::tuple<ref<term<double> &>, ref<term<int &> &>>> &>>>
  120. unevaluated_expr = unity + expr;
  121. (void)unevaluated_expr;
  122. }
  123. {
  124. term<double> unity{1.0};
  125. int i_ = 1;
  126. term<int const &> i{i_};
  127. yap::expression<
  128. yap::expr_kind::plus,
  129. bh::tuple<ref<term<double> &>, ref<term<int const &> &>>>
  130. expr = unity + i;
  131. yap::expression<
  132. yap::expr_kind::plus,
  133. bh::tuple<
  134. ref<term<double> &>,
  135. ref<yap::expression<
  136. yap::expr_kind::plus,
  137. bh::tuple<
  138. ref<term<double> &>,
  139. ref<term<int const &> &>>> &>>>
  140. unevaluated_expr = unity + expr;
  141. (void)unevaluated_expr;
  142. }
  143. {
  144. term<double> unity{1.0};
  145. int i_ = 1;
  146. term<int &> i{i_};
  147. yap::expression<
  148. yap::expr_kind::plus,
  149. bh::tuple<ref<term<double> &>, term<int &>>>
  150. expr = unity + std::move(i);
  151. yap::expression<
  152. yap::expr_kind::plus,
  153. bh::tuple<
  154. ref<term<double> &>,
  155. ref<yap::expression<
  156. yap::expr_kind::plus,
  157. bh::tuple<ref<term<double> &>, term<int &>>> &>>>
  158. unevaluated_expr = unity + expr;
  159. (void)unevaluated_expr;
  160. }
  161. {
  162. term<double> unity{1.0};
  163. int i_ = 1;
  164. term<int &> i{i_};
  165. yap::expression<
  166. yap::expr_kind::plus,
  167. bh::tuple<ref<term<double> &>, ref<term<int &> &>>>
  168. expr = unity + i;
  169. yap::expression<
  170. yap::expr_kind::plus,
  171. bh::tuple<
  172. ref<term<double> &>,
  173. yap::expression<
  174. yap::expr_kind::plus,
  175. bh::tuple<ref<term<double> &>, ref<term<int &> &>>>>>
  176. unevaluated_expr = unity + std::move(expr);
  177. (void)unevaluated_expr;
  178. }
  179. {
  180. term<double> unity{1.0};
  181. int i_ = 1;
  182. term<int const &> i{i_};
  183. yap::expression<
  184. yap::expr_kind::plus,
  185. bh::tuple<ref<term<double> &>, ref<term<int const &> &>>>
  186. expr = unity + i;
  187. yap::expression<
  188. yap::expr_kind::plus,
  189. bh::tuple<
  190. ref<term<double> &>,
  191. yap::expression<
  192. yap::expr_kind::plus,
  193. bh::tuple<ref<term<double> &>, ref<term<int const &> &>>>>>
  194. unevaluated_expr = unity + std::move(expr);
  195. (void)unevaluated_expr;
  196. }
  197. {
  198. term<double> unity{1.0};
  199. int i_ = 1;
  200. term<int &> i{i_};
  201. yap::expression<
  202. yap::expr_kind::plus,
  203. bh::tuple<ref<term<double> &>, term<int &>>>
  204. expr = unity + std::move(i);
  205. yap::expression<
  206. yap::expr_kind::plus,
  207. bh::tuple<
  208. ref<term<double> &>,
  209. yap::expression<
  210. yap::expr_kind::plus,
  211. bh::tuple<ref<term<double> &>, term<int &>>>>>
  212. unevaluated_expr = unity + std::move(expr);
  213. (void)unevaluated_expr;
  214. }
  215. // rvalue refs
  216. {
  217. term<double> unity{1.0};
  218. int i_ = 1;
  219. term<int &&> i{std::move(i_)};
  220. yap::expression<
  221. yap::expr_kind::plus,
  222. bh::tuple<ref<term<double> &>, term<int &&>>>
  223. expr = unity + std::move(i);
  224. yap::expression<
  225. yap::expr_kind::plus,
  226. bh::tuple<
  227. ref<term<double> &>,
  228. yap::expression<
  229. yap::expr_kind::plus,
  230. bh::tuple<ref<term<double> &>, term<int &&>>>>>
  231. unevaluated_expr = unity + std::move(expr);
  232. (void)unevaluated_expr;
  233. }
  234. {
  235. term<double> unity{1.0};
  236. int i_ = 1;
  237. term<int &&> i{std::move(i_)};
  238. yap::expression<
  239. yap::expr_kind::plus,
  240. bh::tuple<ref<term<double> &>, term<int &&>>>
  241. expr = unity + std::move(i);
  242. yap::expression<
  243. yap::expr_kind::plus,
  244. bh::tuple<
  245. ref<term<double> &>,
  246. yap::expression<
  247. yap::expr_kind::plus,
  248. bh::tuple<ref<term<double> &>, term<int &&>>>>>
  249. unevaluated_expr = unity + std::move(expr);
  250. (void)unevaluated_expr;
  251. }
  252. {
  253. term<double> unity{1.0};
  254. int i_ = 1;
  255. term<int &&> i{std::move(i_)};
  256. yap::expression<
  257. yap::expr_kind::plus,
  258. bh::tuple<ref<term<double> &>, term<int &&>>>
  259. expr = unity + std::move(i);
  260. yap::expression<
  261. yap::expr_kind::plus,
  262. bh::tuple<
  263. ref<term<double> &>,
  264. yap::expression<
  265. yap::expr_kind::plus,
  266. bh::tuple<ref<term<double> &>, term<int &&>>>>>
  267. unevaluated_expr = unity + std::move(expr);
  268. (void)unevaluated_expr;
  269. }
  270. {
  271. term<double> unity{1.0};
  272. int i_ = 1;
  273. term<int &&> i{std::move(i_)};
  274. yap::expression<
  275. yap::expr_kind::plus,
  276. bh::tuple<ref<term<double> &>, term<int &&>>>
  277. expr = unity + std::move(i);
  278. yap::expression<
  279. yap::expr_kind::plus,
  280. bh::tuple<
  281. ref<term<double> &>,
  282. yap::expression<
  283. yap::expr_kind::plus,
  284. bh::tuple<ref<term<double> &>, term<int &&>>>>>
  285. unevaluated_expr = unity + std::move(expr);
  286. (void)unevaluated_expr;
  287. }
  288. }