]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/yap/test/call_expr.cpp
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/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
;
27 explicit operator double() const { return value
; }
32 number
naxpy(number a
, number x
, number y
)
34 return number
{a
.value
* x
.value
+ y
.value
+ 10.0};
40 inline number
tag_function(double a
, double b
) { return number
{a
+ b
}; }
44 decltype(auto) operator()(
45 yap::expr_tag
<yap::expr_kind::call
>, tag_type
, number a
, double b
)
47 return tag_function(a
.value
, b
);
51 yap::expr_tag
<yap::expr_kind::call
>, tag_type
, double a
, double b
)
56 char const * operator()() { return "42"; }
62 struct eval_xform_expr
64 decltype(auto) operator()(yap::expression
<
67 ref
<term
<user::tag_type
>>,
69 term
<int>>> const & expr
)
71 using namespace boost::hana::literals
;
73 (double)yap::value(expr
.elements
[1_c
]).value
,
74 (double)yap::value(expr
.elements
[2_c
]));
77 decltype(auto) operator()(yap::expression
<
80 ref
<term
<user::tag_type
>>,
81 ref
<term
<user::number
>>,
82 term
<int>>> const & expr
)
84 using namespace boost::hana::literals
;
86 (double)yap::value(expr
.elements
[1_c
]).value
,
87 (double)yap::value(expr
.elements
[2_c
]));
91 struct eval_xform_both
93 decltype(auto) operator()(
94 yap::expr_tag
<yap::expr_kind::call
>,
99 return tag_function(a
.value
, b
);
102 decltype(auto) operator()(yap::expression
<
103 yap::expr_kind::call
,
105 ref
<term
<user::tag_type
>>,
107 term
<int>>> const & expr
)
109 using namespace boost::hana::literals
;
110 throw std::logic_error("Oops! Picked the wrong overload!");
112 (double)yap::value(expr
.elements
[1_c
]).value
,
113 (double)yap::value(expr
.elements
[2_c
]));
116 decltype(auto) operator()(yap::expression
<
117 yap::expr_kind::call
,
119 ref
<term
<user::tag_type
>>,
120 ref
<term
<user::number
>>,
121 term
<int>>> const & expr
)
123 using namespace boost::hana::literals
;
124 throw std::logic_error("Oops! Picked the wrong overload!");
126 (double)yap::value(expr
.elements
[1_c
]).value
,
127 (double)yap::value(expr
.elements
[2_c
]));
133 int test_main(int, char * [])
136 using namespace boost::yap::literals
;
139 auto plus
= yap::make_terminal(user::tag_type
{});
140 auto expr
= plus(user::number
{13}, 1);
143 transform(expr
, user::empty_xform
{});
147 user::number result
= transform(expr
, user::eval_xform_tag
{});
148 BOOST_CHECK(result
.value
== 14);
152 user::number result
= transform(expr
, user::eval_xform_expr
{});
153 BOOST_CHECK(result
.value
== 14);
157 user::number result
= transform(expr
, user::eval_xform_both
{});
158 BOOST_CHECK(result
.value
== 14);
163 auto plus
= yap::make_terminal(user::tag_type
{});
164 auto thirteen
= yap::make_terminal(user::number
{13});
165 auto expr
= plus(thirteen
, 1);
168 user::number result
= transform(expr
, user::eval_xform_tag
{});
169 BOOST_CHECK(result
.value
== 14);
173 user::number result
= transform(expr
, user::eval_xform_expr
{});
174 BOOST_CHECK(result
.value
== 14);
178 user::number result
= transform(expr
, user::eval_xform_both
{});
179 BOOST_CHECK(result
.value
== 14);
184 term
<user::number
> a
{{1.0}};
185 term
<user::number
> x
{{42.0}};
186 term
<user::number
> y
{{3.0}};
187 auto n
= yap::make_terminal(user::naxpy
);
189 auto expr
= n(a
, x
, y
);
191 user::number result
= evaluate(expr
);
192 BOOST_CHECK(result
.value
== 55);