]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/yap/test/user_expression_transform_2.cpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / libs / yap / test / user_expression_transform_2.cpp
CommitLineData
92f5a8d4
TL
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
1e59de90 8#include <boost/core/lightweight_test.hpp>
92f5a8d4
TL
9
10
11template<typename T>
12using term = boost::yap::terminal<boost::yap::expression, T>;
13
14template<typename T>
15using ref = boost::yap::expression_ref<boost::yap::expression, T>;
16
17namespace yap = boost::yap;
18namespace bh = boost::hana;
19
20
21namespace user {
22
23 struct number
24 {
25 double value;
26 };
27
28 struct eval_xform
29 {
30 auto
31 operator()(yap::expr_tag<yap::expr_kind::terminal>, number const & n)
32 {
33 return n;
34 }
35
36 template<typename Expr>
37 decltype(auto) operator()(
38 yap::expression<yap::expr_kind::negate, bh::tuple<Expr>> const &
39 expr)
40 {
41 number const n = transform(yap::value(expr), *this);
42 return number{-n.value};
43 }
44
45 template<typename Expr1, typename Expr2>
46 decltype(auto) operator()(yap::expression<
47 yap::expr_kind::plus,
48 bh::tuple<Expr1, Expr2>> const & expr)
49 {
50 number const lhs = transform(yap::left(expr), *this);
51 number const rhs = transform(yap::right(expr), *this);
52 return number{lhs.value + rhs.value};
53 }
54 };
55}
56
57template<typename Expr>
58auto make_ref(Expr && expr)
59{
60 using type = yap::detail::operand_type_t<yap::expression, Expr>;
61 return yap::detail::make_operand<type>{}(static_cast<Expr &&>(expr));
62}
63
1e59de90 64int main()
92f5a8d4
TL
65{
66{
67 {
68 term<user::number> a{{1.0}};
69
70 {
71 user::number result = transform(a, user::eval_xform{});
1e59de90 72 BOOST_TEST(result.value == 1);
92f5a8d4
TL
73 }
74
75 {
76 user::number result = transform(make_ref(a), user::eval_xform{});
1e59de90 77 BOOST_TEST(result.value == 1);
92f5a8d4
TL
78 }
79
80 {
81 user::number result = transform(-a, user::eval_xform{});
1e59de90 82 BOOST_TEST(result.value == -1);
92f5a8d4
TL
83 }
84
85 {
86 auto expr = make_ref(a);
87 user::number result = transform(-expr, user::eval_xform{});
1e59de90 88 BOOST_TEST(result.value == -1);
92f5a8d4
TL
89 }
90
91 {
92 auto expr = -a;
93 user::number result = transform(expr, user::eval_xform{});
1e59de90 94 BOOST_TEST(result.value == -1);
92f5a8d4
TL
95 }
96
97 {
98 auto expr1 = make_ref(a);
99 auto expr2 = make_ref(expr1);
100 user::number result = transform(expr2, user::eval_xform{});
1e59de90 101 BOOST_TEST(result.value == 1);
92f5a8d4
TL
102 }
103
104 {
105 auto expr1 = -a;
106 auto expr2 = make_ref(expr1);
107 user::number result = transform(expr2, user::eval_xform{});
1e59de90 108 BOOST_TEST(result.value == -1);
92f5a8d4
TL
109 }
110
111 {
112 auto expr1 = make_ref(a);
113 auto expr2 = -expr1;
114 user::number result = transform(expr2, user::eval_xform{});
1e59de90 115 BOOST_TEST(result.value == -1);
92f5a8d4
TL
116 }
117
118 {
119 auto expr1 = a;
120 auto expr2 = make_ref(expr1);
121 auto expr3 = make_ref(expr2);
122 user::number result = transform(expr3, user::eval_xform{});
1e59de90 123 BOOST_TEST(result.value == 1);
92f5a8d4
TL
124 }
125
126 {
127 auto expr1 = -a;
128 auto expr2 = make_ref(expr1);
129 auto expr3 = make_ref(expr2);
130 user::number result = transform(expr3, user::eval_xform{});
1e59de90 131 BOOST_TEST(result.value == -1);
92f5a8d4
TL
132 }
133
134 {
135 auto expr1 = make_ref(a);
136 auto expr2 = -expr1;
137 auto expr3 = make_ref(expr2);
138 user::number result = transform(expr3, user::eval_xform{});
1e59de90 139 BOOST_TEST(result.value == -1);
92f5a8d4
TL
140 }
141
142 {
143 auto expr1 = make_ref(a);
144 auto expr2 = make_ref(expr1);
145 auto expr3 = -expr2;
146 user::number result = transform(expr3, user::eval_xform{});
1e59de90 147 BOOST_TEST(result.value == -1);
92f5a8d4
TL
148 }
149 }
150
151 {
152 user::number result =
153 transform(-term<user::number>{{1.0}}, user::eval_xform{});
1e59de90 154 BOOST_TEST(result.value == -1);
92f5a8d4
TL
155 }
156}
157
158{
159 term<user::number> a{{1.0}};
160 term<user::number> x{{41.0}};
161
162 {
163 user::number result = transform(a + x, user::eval_xform{});
1e59de90 164 BOOST_TEST(result.value == 42);
92f5a8d4
TL
165 }
166
167
168 {
169 user::number result =
170 transform(make_ref(a) + make_ref(x), user::eval_xform{});
1e59de90 171 BOOST_TEST(result.value == 42);
92f5a8d4
TL
172 }
173
174 {
175 user::number result = transform(make_ref(a) + x, user::eval_xform{});
1e59de90 176 BOOST_TEST(result.value == 42);
92f5a8d4
TL
177 }
178
179 {
180 user::number result = transform(a + make_ref(x), user::eval_xform{});
1e59de90 181 BOOST_TEST(result.value == 42);
92f5a8d4
TL
182 }
183
184 {
185 user::number result = transform(a + x, user::eval_xform{});
1e59de90 186 BOOST_TEST(result.value == 42);
92f5a8d4
TL
187 }
188
189
190 {
191 user::number result =
192 transform(-make_ref(a) + make_ref(x), user::eval_xform{});
1e59de90 193 BOOST_TEST(result.value == 40);
92f5a8d4
TL
194 }
195
196 {
197 user::number result = transform(-make_ref(a) + x, user::eval_xform{});
1e59de90 198 BOOST_TEST(result.value == 40);
92f5a8d4
TL
199 }
200
201 {
202 user::number result = transform(-a + make_ref(x), user::eval_xform{});
1e59de90 203 BOOST_TEST(result.value == 40);
92f5a8d4
TL
204 }
205
206 {
207 user::number result = transform(-a + x, user::eval_xform{});
1e59de90 208 BOOST_TEST(result.value == 40);
92f5a8d4
TL
209 }
210
211
212 {
213 user::number result =
214 transform(make_ref(a) + -make_ref(x), user::eval_xform{});
1e59de90 215 BOOST_TEST(result.value == -40);
92f5a8d4
TL
216 }
217
218 {
219 user::number result = transform(make_ref(a) + -x, user::eval_xform{});
1e59de90 220 BOOST_TEST(result.value == -40);
92f5a8d4
TL
221 }
222
223 {
224 user::number result = transform(a + -make_ref(x), user::eval_xform{});
1e59de90 225 BOOST_TEST(result.value == -40);
92f5a8d4
TL
226 }
227
228 {
229 user::number result = transform(a + -x, user::eval_xform{});
1e59de90 230 BOOST_TEST(result.value == -40);
92f5a8d4
TL
231 }
232
233
234 {
235 user::number result =
236 transform(-make_ref(a) + -make_ref(x), user::eval_xform{});
1e59de90 237 BOOST_TEST(result.value == -42);
92f5a8d4
TL
238 }
239
240 {
241 user::number result = transform(-make_ref(a) + -x, user::eval_xform{});
1e59de90 242 BOOST_TEST(result.value == -42);
92f5a8d4
TL
243 }
244
245 {
246 user::number result = transform(-a + -make_ref(x), user::eval_xform{});
1e59de90 247 BOOST_TEST(result.value == -42);
92f5a8d4
TL
248 }
249
250 {
251 user::number result = transform(-a + -x, user::eval_xform{});
1e59de90 252 BOOST_TEST(result.value == -42);
92f5a8d4
TL
253 }
254}
255
1e59de90 256return boost::report_errors();
92f5a8d4 257}