• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright Louis Dionne 2013-2017
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)
4 
5 #include <boost/hana/detail/variadic/reverse_apply.hpp>
6 #include <boost/hana/detail/variadic/reverse_apply/flat.hpp>
7 #include <boost/hana/detail/variadic/reverse_apply/unrolled.hpp>
8 
9 #include <boost/hana/assert.hpp>
10 #include <boost/hana/equal.hpp>
11 
12 #include <laws/base.hpp>
13 namespace hana = boost::hana;
14 using hana::test::ct_eq;
15 
16 
__anonfc251eee0102(auto reverse_apply) 17 auto check = [](auto reverse_apply) {
18     hana::test::_injection<0> f{};
19 
20     BOOST_HANA_CONSTANT_CHECK(hana::equal(
21         reverse_apply(f),
22         f()
23     ));
24     BOOST_HANA_CONSTANT_CHECK(hana::equal(
25         reverse_apply(f, ct_eq<0>{}),
26         f(ct_eq<0>{})
27     ));
28     BOOST_HANA_CONSTANT_CHECK(hana::equal(
29         reverse_apply(f, ct_eq<0>{}, ct_eq<1>{}),
30         f(ct_eq<1>{}, ct_eq<0>{})
31     ));
32     BOOST_HANA_CONSTANT_CHECK(hana::equal(
33         reverse_apply(f, ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
34         f(ct_eq<2>{}, ct_eq<1>{}, ct_eq<0>{})
35     ));
36     BOOST_HANA_CONSTANT_CHECK(hana::equal(
37         reverse_apply(f, ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
38         f(ct_eq<3>{}, ct_eq<2>{}, ct_eq<1>{}, ct_eq<0>{})
39     ));
40     BOOST_HANA_CONSTANT_CHECK(hana::equal(
41         reverse_apply(f, ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}),
42         f(ct_eq<4>{}, ct_eq<3>{}, ct_eq<2>{}, ct_eq<1>{}, ct_eq<0>{})
43     ));
44     BOOST_HANA_CONSTANT_CHECK(hana::equal(
45         reverse_apply(f, ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}),
46         f(ct_eq<5>{}, ct_eq<4>{}, ct_eq<3>{}, ct_eq<2>{}, ct_eq<1>{}, ct_eq<0>{})
47     ));
48     BOOST_HANA_CONSTANT_CHECK(hana::equal(
49         reverse_apply(f, ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}),
50         f(ct_eq<6>{}, ct_eq<5>{}, ct_eq<4>{}, ct_eq<3>{}, ct_eq<2>{}, ct_eq<1>{}, ct_eq<0>{})
51     ));
52     BOOST_HANA_CONSTANT_CHECK(hana::equal(
53         reverse_apply(f, ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}),
54         f(ct_eq<7>{}, ct_eq<6>{}, ct_eq<5>{}, ct_eq<4>{}, ct_eq<3>{}, ct_eq<2>{}, ct_eq<1>{}, ct_eq<0>{})
55     ));
56     BOOST_HANA_CONSTANT_CHECK(hana::equal(
57         reverse_apply(f, ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<4>{}, ct_eq<5>{}, ct_eq<6>{}, ct_eq<7>{}, ct_eq<8>{}),
58         f(ct_eq<8>{}, ct_eq<7>{}, ct_eq<6>{}, ct_eq<5>{}, ct_eq<4>{}, ct_eq<3>{}, ct_eq<2>{}, ct_eq<1>{}, ct_eq<0>{})
59     ));
60 };
61 
main()62 int main() {
63     check(hana::detail::variadic::reverse_apply);
64     check([](auto f, auto ...x) {
65         return hana::detail::variadic::reverse_apply_flat(f, x...);
66     });
67     check([](auto f, auto ...x) {
68         return hana::detail::variadic::reverse_apply_unrolled(f, x...);
69     });
70 }
71