1 // Copyright (C) 2016-2018 T. Zachary Laine
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>
8 #include <boost/mpl/assert.hpp>
10 #include <boost/test/minimal.hpp>
14 using term
= boost::yap::terminal
<boost::yap::expression
, T
>;
17 using ref
= boost::yap::expression_ref
<boost::yap::expression
, T
>;
19 namespace yap
= boost::yap
;
20 namespace bh
= boost::hana
;
23 template<boost::yap::expr_kind Kind
, typename Tuple
>
26 static boost::yap::expr_kind
const kind
= Kind
;
31 BOOST_YAP_USER_BINARY_OPERATOR(plus
, user_expr
, user_expr
)
34 using user_term
= boost::yap::terminal
<user_expr
, T
>;
37 using user_ref
= boost::yap::expression_ref
<user_expr
, T
>;
40 int test_main(int, char * [])
43 term
<double> unity
= {{1.0}};
44 using plus_expr_type
= yap::expression
<
46 bh::tuple
<ref
<term
<double> &>, term
<int>>>;
49 plus_expr_type plus_expr
= unity
+ term
<int>{{1}};
50 BOOST_MPL_ASSERT((std::is_same
<
51 decltype(yap::right(std::move(plus_expr
))),
56 plus_expr_type plus_expr
= unity
+ term
<int>{{1}};
58 (std::is_same
<decltype(yap::right(plus_expr
)), term
<int> &>));
62 plus_expr_type
const plus_expr
= unity
+ term
<int>{{1}};
63 BOOST_MPL_ASSERT((std::is_same
<
64 decltype(yap::right(plus_expr
)),
69 term
<double> unity
= {{1.0}};
70 using plus_expr_type
= yap::expression
<
72 bh::tuple
<ref
<term
<double> &>, term
<int>>>;
73 plus_expr_type plus_expr
= unity
+ term
<int>{{1}};
75 using plus_plus_expr_type
= yap::expression
<
77 bh::tuple
<ref
<plus_expr_type
&>, term
<int>>>;
80 plus_plus_expr_type plus_plus_expr
= plus_expr
+ term
<int>{{1}};
81 ref
<plus_expr_type
&> plus_expr_ref
=
82 bh::front(plus_plus_expr
.elements
);
85 decltype(yap::right(std::move(plus_expr_ref
))),
90 plus_plus_expr_type plus_plus_expr
= plus_expr
+ term
<int>{{1}};
91 ref
<plus_expr_type
&> plus_expr_ref
=
92 bh::front(plus_plus_expr
.elements
);
93 BOOST_MPL_ASSERT((std::is_same
<
94 decltype(yap::right(plus_expr_ref
)),
99 plus_plus_expr_type plus_plus_expr
= plus_expr
+ term
<int>{{1}};
100 ref
<plus_expr_type
&> const plus_expr_ref
=
101 bh::front(plus_plus_expr
.elements
);
102 BOOST_MPL_ASSERT((std::is_same
<
103 decltype(yap::right(plus_expr_ref
)),
109 term
<double> unity
= {{1.0}};
110 using plus_expr_type
= yap::expression
<
111 yap::expr_kind::plus
,
112 bh::tuple
<ref
<term
<double> &>, term
<int>>>;
113 plus_expr_type
const plus_expr
= unity
+ term
<int>{{1}};
115 using plus_plus_expr_type
= yap::expression
<
116 yap::expr_kind::plus
,
117 bh::tuple
<ref
<plus_expr_type
const &>, term
<int>>>;
120 plus_plus_expr_type plus_plus_expr
= plus_expr
+ term
<int>{{1}};
121 ref
<plus_expr_type
const &> plus_expr_ref
=
122 bh::front(plus_plus_expr
.elements
);
125 decltype(yap::right(std::move(plus_expr_ref
))),
126 term
<int> const &>));
130 plus_plus_expr_type plus_plus_expr
= plus_expr
+ term
<int>{{1}};
131 ref
<plus_expr_type
const &> plus_expr_ref
=
132 bh::front(plus_plus_expr
.elements
);
133 BOOST_MPL_ASSERT((std::is_same
<
134 decltype(yap::right(plus_expr_ref
)),
135 term
<int> const &>));
139 plus_plus_expr_type plus_plus_expr
= plus_expr
+ term
<int>{{1}};
140 ref
<plus_expr_type
const &> const plus_expr_ref
=
141 bh::front(plus_plus_expr
.elements
);
142 BOOST_MPL_ASSERT((std::is_same
<
143 decltype(yap::right(plus_expr_ref
)),
144 term
<int> const &>));
150 user_term
<double> unity
= {{1.0}};
151 using plus_expr_type
= user_expr
<
152 yap::expr_kind::plus
,
153 bh::tuple
<user_ref
<user_term
<double> &>, user_term
<int>>>;
156 plus_expr_type plus_expr
= unity
+ user_term
<int>{{1}};
157 BOOST_MPL_ASSERT((std::is_same
<
158 decltype(yap::right(std::move(plus_expr
))),
159 user_term
<int> &&>));
163 plus_expr_type plus_expr
= unity
+ user_term
<int>{{1}};
164 BOOST_MPL_ASSERT((std::is_same
<
165 decltype(yap::right(plus_expr
)),
170 plus_expr_type
const plus_expr
= unity
+ user_term
<int>{{1}};
171 BOOST_MPL_ASSERT((std::is_same
<
172 decltype(yap::right(plus_expr
)),
173 user_term
<int> const &>));
177 user_term
<double> unity
= {{1.0}};
178 using plus_expr_type
= user_expr
<
179 yap::expr_kind::plus
,
180 bh::tuple
<user_ref
<user_term
<double> &>, user_term
<int>>>;
181 plus_expr_type plus_expr
= unity
+ user_term
<int>{{1}};
183 using plus_plus_expr_type
= user_expr
<
184 yap::expr_kind::plus
,
185 bh::tuple
<user_ref
<plus_expr_type
&>, user_term
<int>>>;
188 plus_plus_expr_type plus_plus_expr
=
189 plus_expr
+ user_term
<int>{{1}};
190 user_ref
<plus_expr_type
&> plus_expr_ref
=
191 bh::front(plus_plus_expr
.elements
);
194 decltype(yap::right(std::move(plus_expr_ref
))),
199 plus_plus_expr_type plus_plus_expr
=
200 plus_expr
+ user_term
<int>{{1}};
201 user_ref
<plus_expr_type
&> plus_expr_ref
=
202 bh::front(plus_plus_expr
.elements
);
203 BOOST_MPL_ASSERT((std::is_same
<
204 decltype(yap::right(plus_expr_ref
)),
209 plus_plus_expr_type plus_plus_expr
=
210 plus_expr
+ user_term
<int>{{1}};
211 user_ref
<plus_expr_type
&> const plus_expr_ref
=
212 bh::front(plus_plus_expr
.elements
);
213 BOOST_MPL_ASSERT((std::is_same
<
214 decltype(yap::right(plus_expr_ref
)),
220 user_term
<double> unity
= {{1.0}};
221 using plus_expr_type
= user_expr
<
222 yap::expr_kind::plus
,
223 bh::tuple
<user_ref
<user_term
<double> &>, user_term
<int>>>;
224 plus_expr_type
const plus_expr
= unity
+ user_term
<int>{{1}};
226 using plus_plus_expr_type
= user_expr
<
227 yap::expr_kind::plus
,
228 bh::tuple
<user_ref
<plus_expr_type
const &>, user_term
<int>>>;
231 plus_plus_expr_type plus_plus_expr
=
232 plus_expr
+ user_term
<int>{{1}};
233 user_ref
<plus_expr_type
const &> plus_expr_ref
=
234 bh::front(plus_plus_expr
.elements
);
237 decltype(yap::right(std::move(plus_expr_ref
))),
238 user_term
<int> const &>));
242 plus_plus_expr_type plus_plus_expr
=
243 plus_expr
+ user_term
<int>{{1}};
244 user_ref
<plus_expr_type
const &> plus_expr_ref
=
245 bh::front(plus_plus_expr
.elements
);
246 BOOST_MPL_ASSERT((std::is_same
<
247 decltype(yap::right(plus_expr_ref
)),
248 user_term
<int> const &>));
252 plus_plus_expr_type plus_plus_expr
=
253 plus_expr
+ user_term
<int>{{1}};
254 user_ref
<plus_expr_type
const &> const plus_expr_ref
=
255 bh::front(plus_plus_expr
.elements
);
256 BOOST_MPL_ASSERT((std::is_same
<
257 decltype(yap::right(plus_expr_ref
)),
258 user_term
<int> const &>));
263 #ifndef _MSC_VER // Tsk, tsk.
265 using term_t
= term
<int>;
266 constexpr auto expr
= term_t
{13} + term_t
{42};
267 constexpr auto result1
= expr
.right().value();
268 constexpr auto result2
= yap::value(right(expr
));