]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/hana/test/issues/github_221.cpp
1 // Copyright Louis Dionne 2013-2016
2 // Distributed under the Boost Software License, Version 1.0.
3 // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
5 #include <boost/hana/adjust_if.hpp>
6 #include <boost/hana/all_of.hpp>
7 #include <boost/hana/any_of.hpp>
8 #include <boost/hana/assert.hpp>
9 #include <boost/hana/count_if.hpp>
10 #include <boost/hana/drop_while.hpp>
11 #include <boost/hana/equal.hpp>
12 #include <boost/hana/ext/std/tuple.hpp>
13 #include <boost/hana/filter.hpp>
14 #include <boost/hana/find_if.hpp>
15 #include <boost/hana/functional/id.hpp>
16 #include <boost/hana/functional/partial.hpp>
17 #include <boost/hana/group.hpp>
18 #include <boost/hana/integral_constant.hpp>
19 #include <boost/hana/lexicographical_compare.hpp>
20 #include <boost/hana/maximum.hpp>
21 #include <boost/hana/minimum.hpp>
22 #include <boost/hana/none_of.hpp>
23 #include <boost/hana/optional.hpp>
24 #include <boost/hana/partition.hpp>
25 #include <boost/hana/plus.hpp>
26 #include <boost/hana/remove_if.hpp>
27 #include <boost/hana/replace_if.hpp>
28 #include <boost/hana/sort.hpp>
29 #include <boost/hana/span.hpp>
30 #include <boost/hana/take_while.hpp>
31 #include <boost/hana/tuple.hpp>
32 #include <boost/hana/unique.hpp>
33 #include <boost/hana/while.hpp>
34 namespace hana
= boost::hana
;
37 constexpr auto increment
= hana::partial(hana::plus
, hana::int_c
<1>);
43 constexpr auto x
= hana::adjust_if(hana::make_tuple(hana::int_c
<0>), hana::id
, increment
);
44 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::make_tuple(hana::int_c
<0>)));
46 constexpr auto y
= hana::adjust_if(hana::make_tuple(hana::int_c
<1>), hana::id
, increment
);
47 BOOST_HANA_CONSTANT_CHECK(hana::equal(y
, hana::make_tuple(hana::int_c
<2>)));
49 constexpr auto z
= hana::adjust_if(hana::make_tuple(hana::int_c
<3>), hana::id
, increment
);
50 BOOST_HANA_CONSTANT_CHECK(hana::equal(z
, hana::make_tuple(hana::int_c
<4>)));
52 constexpr auto l
= hana::adjust_if(hana::tuple_c
<int, 3>, hana::id
, increment
);
53 BOOST_HANA_CONSTANT_CHECK(hana::equal(l
, hana::make_tuple(hana::int_c
<4>)));
57 constexpr auto x
= hana::adjust_if(hana::tuple_c
<int, 3>, hana::id
, increment
);
58 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::make_tuple(hana::int_c
<4>)));
63 BOOST_HANA_CONSTANT_CHECK(!hana::all_of(hana::make_tuple(hana::int_c
<0>), hana::id
));
64 BOOST_HANA_CONSTANT_CHECK(hana::all_of(hana::make_tuple(hana::int_c
<1>), hana::id
));
65 BOOST_HANA_CONSTANT_CHECK(hana::all_of(hana::make_tuple(hana::int_c
<3>), hana::id
));
67 BOOST_HANA_CONSTANT_CHECK(hana::all_of(hana::tuple_c
<int, 3>, hana::id
));
72 BOOST_HANA_CONSTANT_CHECK(!hana::any_of(hana::make_tuple(hana::int_c
<0>), hana::id
));
73 BOOST_HANA_CONSTANT_CHECK(hana::any_of(hana::make_tuple(hana::int_c
<1>), hana::id
));
74 BOOST_HANA_CONSTANT_CHECK(hana::any_of(hana::make_tuple(hana::int_c
<3>), hana::id
));
76 BOOST_HANA_CONSTANT_CHECK(hana::any_of(hana::tuple_c
<int, 3>, hana::id
));
81 constexpr auto x
= hana::count_if(hana::make_tuple(hana::int_c
<0>), hana::id
);
82 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::size_c
<0>));
84 constexpr auto y
= hana::count_if(hana::make_tuple(hana::int_c
<1>), hana::id
);
85 BOOST_HANA_CONSTANT_CHECK(hana::equal(y
, hana::size_c
<1>));
87 constexpr auto z
= hana::count_if(hana::make_tuple(hana::int_c
<3>), hana::id
);
88 BOOST_HANA_CONSTANT_CHECK(hana::equal(z
, hana::size_c
<1>));
92 constexpr auto x
= hana::count_if(hana::tuple_c
<int, 3>, hana::id
);
93 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::size_c
<1>));
98 constexpr auto x
= hana::drop_while(
99 hana::make_tuple(hana::int_c
<0>), hana::id
101 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
,
102 hana::make_tuple(hana::int_c
<0>)
105 constexpr auto y
= hana::drop_while(
106 hana::make_tuple(hana::int_c
<1>, hana::int_c
<3>, hana::int_c
<0>), hana::id
108 BOOST_HANA_CONSTANT_CHECK(hana::equal(y
,
109 hana::make_tuple(hana::int_c
<0>)
115 constexpr auto x
= hana::drop_while(
116 hana::tuple_c
<int, 1, 3, 0>, hana::id
118 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
,
119 hana::make_tuple(hana::int_c
<0>)
126 constexpr auto x
= hana::filter(hana::make_tuple(hana::int_c
<0>), hana::id
);
127 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::make_tuple()));
129 constexpr auto y
= hana::filter(hana::make_tuple(hana::int_c
<1>), hana::id
);
130 BOOST_HANA_CONSTANT_CHECK(hana::equal(y
, hana::make_tuple(hana::int_c
<1>)));
132 constexpr auto z
= hana::filter(hana::make_tuple(hana::int_c
<3>), hana::id
);
133 BOOST_HANA_CONSTANT_CHECK(hana::equal(z
, hana::make_tuple(hana::int_c
<3>)));
138 constexpr auto x
= hana::filter(hana::tuple_c
<int, 3>, hana::id
);
139 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::make_tuple(hana::int_c
<3>)));
144 constexpr auto x
= hana::find_if(hana::make_tuple(hana::int_c
<0>), hana::id
);
145 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::nothing
));
147 constexpr auto y
= hana::find_if(hana::make_tuple(hana::int_c
<1>), hana::id
);
148 BOOST_HANA_CONSTANT_CHECK(hana::equal(y
, hana::just(hana::int_c
<1>)));
150 constexpr auto z
= hana::find_if(hana::make_tuple(hana::int_c
<3>), hana::id
);
151 BOOST_HANA_CONSTANT_CHECK(hana::equal(z
, hana::just(hana::int_c
<3>)));
155 constexpr auto z
= hana::find_if(hana::tuple_c
<int, 3>, hana::id
);
156 BOOST_HANA_CONSTANT_CHECK(hana::equal(z
, hana::just(hana::int_c
<3>)));
159 // test with std::tuple (for default implementation of find_if)
160 constexpr auto x
= hana::find_if(std::make_tuple(hana::int_c
<0>), hana::id
);
161 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::nothing
));
163 constexpr auto y
= hana::find_if(std::make_tuple(hana::int_c
<1>), hana::id
);
164 BOOST_HANA_CONSTANT_CHECK(hana::equal(y
, hana::just(hana::int_c
<1>)));
166 constexpr auto z
= hana::find_if(std::make_tuple(hana::int_c
<3>), hana::id
);
167 BOOST_HANA_CONSTANT_CHECK(hana::equal(z
, hana::just(hana::int_c
<3>)));
171 constexpr auto seq
= std::make_tuple(hana::int_c
<3>);
172 constexpr auto x
= hana::find_if(seq
, hana::id
);
173 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::just(hana::int_c
<3>)));
178 constexpr auto x
= hana::group(
188 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
,
190 hana::tuple_c
<int, 0>,
191 hana::tuple_c
<int, 0, 1, 1, 2>
198 constexpr auto x
= hana::group(hana::tuple_c
<int, 0, 0, 1, 1, 2>, hana::plus
);
199 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
,
201 hana::tuple_c
<int, 0>,
202 hana::tuple_c
<int, 0, 1, 1, 2>
208 // lexicographical_compare
210 BOOST_HANA_CONSTANT_CHECK(
211 hana::lexicographical_compare(
212 hana::make_tuple(hana::int_c
<0>, hana::int_c
<0>),
213 hana::make_tuple(hana::int_c
<0>, hana::int_c
<3>),
220 BOOST_HANA_CONSTANT_CHECK(
221 hana::lexicographical_compare(
222 hana::tuple_c
<int, 0, 0>,
223 hana::tuple_c
<int, 0, 3>,
231 constexpr auto x
= hana::maximum(
241 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::int_c
<2>));
245 constexpr auto x
= hana::maximum(hana::tuple_c
<int, 0, 0, 1, 3, 2>, hana::plus
);
246 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::int_c
<2>));
251 constexpr auto x
= hana::minimum(
261 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::int_c
<0>));
265 constexpr auto x
= hana::minimum(hana::tuple_c
<int, 0, 0, 1, 3, 2>, hana::plus
);
266 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::int_c
<0>));
271 BOOST_HANA_CONSTANT_CHECK(hana::none_of(hana::make_tuple(hana::int_c
<0>), hana::id
));
272 BOOST_HANA_CONSTANT_CHECK(!hana::none_of(hana::make_tuple(hana::int_c
<1>), hana::id
));
273 BOOST_HANA_CONSTANT_CHECK(!hana::none_of(hana::make_tuple(hana::int_c
<3>), hana::id
));
277 BOOST_HANA_CONSTANT_CHECK(hana::none_of(hana::tuple_c
<int, 0>, hana::id
));
278 BOOST_HANA_CONSTANT_CHECK(!hana::none_of(hana::tuple_c
<int, 1>, hana::id
));
279 BOOST_HANA_CONSTANT_CHECK(!hana::none_of(hana::tuple_c
<int, 3>, hana::id
));
284 constexpr auto x
= hana::partition(
292 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
,
294 hana::tuple_c
<int, 1, 3>,
295 hana::tuple_c
<int, 0>
302 constexpr auto x
= hana::partition(hana::tuple_c
<int, 0, 1, 3>, hana::id
);
303 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
,
305 hana::tuple_c
<int, 1, 3>,
306 hana::tuple_c
<int, 0>
314 constexpr auto x
= hana::remove_if(hana::make_tuple(hana::int_c
<0>), hana::id
);
315 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::make_tuple(hana::int_c
<0>)));
317 constexpr auto y
= hana::remove_if(hana::make_tuple(hana::int_c
<1>), hana::id
);
318 BOOST_HANA_CONSTANT_CHECK(hana::equal(y
, hana::make_tuple()));
320 constexpr auto z
= hana::remove_if(hana::make_tuple(hana::int_c
<3>), hana::id
);
321 BOOST_HANA_CONSTANT_CHECK(hana::equal(z
, hana::make_tuple()));
325 constexpr auto z
= hana::remove_if(hana::tuple_c
<int, 3>, hana::id
);
326 BOOST_HANA_CONSTANT_CHECK(hana::equal(z
, hana::make_tuple()));
331 constexpr auto x
= hana::replace_if(
332 hana::make_tuple(hana::int_c
<0>),
336 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::make_tuple(hana::int_c
<0>)));
338 constexpr auto y
= hana::replace_if(
339 hana::make_tuple(hana::int_c
<1>),
343 BOOST_HANA_CONSTANT_CHECK(hana::equal(y
, hana::make_tuple(hana::int_c
<42>)));
345 constexpr auto z
= hana::replace_if(
346 hana::make_tuple(hana::int_c
<3>),
350 BOOST_HANA_CONSTANT_CHECK(hana::equal(z
, hana::make_tuple(hana::int_c
<42>)));
354 constexpr auto z
= hana::replace_if(
355 hana::tuple_c
<int, 3>,
359 BOOST_HANA_CONSTANT_CHECK(hana::equal(z
, hana::make_tuple(hana::int_c
<42>)));
364 constexpr auto x
= hana::sort(
371 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::tuple_c
<int, 2, 1, 0>));
375 constexpr auto x
= hana::sort(hana::tuple_c
<int, 0, 1, 2>, hana::plus
);
376 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::tuple_c
<int, 2, 1, 0>));
380 constexpr auto x
= hana::span(
388 BOOST_HANA_CONSTANT_CHECK(
391 hana::tuple_c
<int, 2, 1>,
392 hana::tuple_c
<int, 0>
398 // test with an lvalue
399 constexpr auto x
= hana::span(hana::tuple_c
<int, 2, 1, 0>, hana::id
);
400 BOOST_HANA_CONSTANT_CHECK(
403 hana::tuple_c
<int, 2, 1>,
404 hana::tuple_c
<int, 0>
412 constexpr auto x
= hana::take_while(
420 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::tuple_c
<int, 2, 1>));
424 constexpr auto x
= hana::take_while(hana::tuple_c
<int, 2, 1, 0>, hana::id
);
425 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::tuple_c
<int, 2, 1>));
430 constexpr auto x
= hana::unique(
439 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::tuple_c
<int, 0, 0>));
443 constexpr auto x
= hana::unique(hana::tuple_c
<int, 0, 0, 1, 2>, hana::plus
);
444 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::tuple_c
<int, 0, 0>));
449 constexpr auto x
= hana::while_(hana::id
, hana::int_c
<-3>, increment
);
450 BOOST_HANA_CONSTANT_CHECK(hana::equal(x
, hana::int_c
<0>));