reverse_apply.cpp 2.8 KB

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