permutations.hpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. #ifndef BOOST_HANA_TEST_AUTO_PERMUTATIONS_HPP
  5. #define BOOST_HANA_TEST_AUTO_PERMUTATIONS_HPP
  6. #include <boost/hana/and.hpp>
  7. #include <boost/hana/assert.hpp>
  8. #include <boost/hana/equal.hpp>
  9. #include <boost/hana/is_subset.hpp>
  10. #include <boost/hana/permutations.hpp>
  11. #include <laws/base.hpp>
  12. #include "test_case.hpp"
  13. TestCase test_permutations{[]{
  14. namespace hana = boost::hana;
  15. using hana::test::ct_eq;
  16. auto is_permutation = [](auto xs, auto ys) {
  17. return hana::and_(hana::is_subset(xs, ys), hana::is_subset(ys, xs));
  18. };
  19. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  20. hana::permutations(MAKE_TUPLE()),
  21. MAKE_TUPLE(MAKE_TUPLE())
  22. ));
  23. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  24. hana::permutations(MAKE_TUPLE(ct_eq<0>{})),
  25. MAKE_TUPLE(MAKE_TUPLE(ct_eq<0>{}))
  26. ));
  27. BOOST_HANA_CONSTANT_CHECK(is_permutation(
  28. hana::permutations(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{})),
  29. MAKE_TUPLE(
  30. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}),
  31. MAKE_TUPLE(ct_eq<1>{}, ct_eq<0>{})
  32. )
  33. ));
  34. BOOST_HANA_CONSTANT_CHECK(is_permutation(
  35. hana::permutations(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{})),
  36. MAKE_TUPLE(
  37. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
  38. MAKE_TUPLE(ct_eq<0>{}, ct_eq<2>{}, ct_eq<1>{}),
  39. MAKE_TUPLE(ct_eq<1>{}, ct_eq<0>{}, ct_eq<2>{}),
  40. MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{}, ct_eq<0>{}),
  41. MAKE_TUPLE(ct_eq<2>{}, ct_eq<0>{}, ct_eq<1>{}),
  42. MAKE_TUPLE(ct_eq<2>{}, ct_eq<1>{}, ct_eq<0>{})
  43. )
  44. ));
  45. BOOST_HANA_CONSTANT_CHECK(is_permutation(
  46. hana::permutations(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{})),
  47. MAKE_TUPLE(
  48. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}),
  49. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}, ct_eq<3>{}, ct_eq<2>{}),
  50. MAKE_TUPLE(ct_eq<0>{}, ct_eq<2>{}, ct_eq<1>{}, ct_eq<3>{}),
  51. MAKE_TUPLE(ct_eq<0>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<1>{}),
  52. MAKE_TUPLE(ct_eq<0>{}, ct_eq<3>{}, ct_eq<1>{}, ct_eq<2>{}),
  53. MAKE_TUPLE(ct_eq<0>{}, ct_eq<3>{}, ct_eq<2>{}, ct_eq<1>{}),
  54. MAKE_TUPLE(ct_eq<1>{}, ct_eq<0>{}, ct_eq<2>{}, ct_eq<3>{}),
  55. MAKE_TUPLE(ct_eq<1>{}, ct_eq<0>{}, ct_eq<3>{}, ct_eq<2>{}),
  56. MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{}, ct_eq<0>{}, ct_eq<3>{}),
  57. MAKE_TUPLE(ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}, ct_eq<0>{}),
  58. MAKE_TUPLE(ct_eq<1>{}, ct_eq<3>{}, ct_eq<0>{}, ct_eq<2>{}),
  59. MAKE_TUPLE(ct_eq<1>{}, ct_eq<3>{}, ct_eq<2>{}, ct_eq<0>{}),
  60. MAKE_TUPLE(ct_eq<2>{}, ct_eq<0>{}, ct_eq<1>{}, ct_eq<3>{}),
  61. MAKE_TUPLE(ct_eq<2>{}, ct_eq<0>{}, ct_eq<3>{}, ct_eq<1>{}),
  62. MAKE_TUPLE(ct_eq<2>{}, ct_eq<1>{}, ct_eq<0>{}, ct_eq<3>{}),
  63. MAKE_TUPLE(ct_eq<2>{}, ct_eq<1>{}, ct_eq<3>{}, ct_eq<0>{}),
  64. MAKE_TUPLE(ct_eq<2>{}, ct_eq<3>{}, ct_eq<0>{}, ct_eq<1>{}),
  65. MAKE_TUPLE(ct_eq<2>{}, ct_eq<3>{}, ct_eq<1>{}, ct_eq<0>{}),
  66. MAKE_TUPLE(ct_eq<3>{}, ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}),
  67. MAKE_TUPLE(ct_eq<3>{}, ct_eq<0>{}, ct_eq<2>{}, ct_eq<1>{}),
  68. MAKE_TUPLE(ct_eq<3>{}, ct_eq<1>{}, ct_eq<0>{}, ct_eq<2>{}),
  69. MAKE_TUPLE(ct_eq<3>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<0>{}),
  70. MAKE_TUPLE(ct_eq<3>{}, ct_eq<2>{}, ct_eq<0>{}, ct_eq<1>{}),
  71. MAKE_TUPLE(ct_eq<3>{}, ct_eq<2>{}, ct_eq<1>{}, ct_eq<0>{})
  72. )
  73. ));
  74. }};
  75. #endif // !BOOST_HANA_TEST_AUTO_PERMUTATIONS_HPP