partition.hpp 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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_PARTITION_HPP
  5. #define BOOST_HANA_TEST_AUTO_PARTITION_HPP
  6. #include <boost/hana/assert.hpp>
  7. #include <boost/hana/contains.hpp>
  8. #include <boost/hana/equal.hpp>
  9. #include <boost/hana/partition.hpp>
  10. #include "test_case.hpp"
  11. #include <laws/base.hpp>
  12. #include <support/minimal_product.hpp>
  13. TestCase test_partition{[]{
  14. namespace hana = boost::hana;
  15. using hana::test::ct_eq;
  16. struct undefined { };
  17. auto pair = ::minimal_product;
  18. auto pred = hana::in ^ MAKE_TUPLE(ct_eq<-1>{}, ct_eq<-2>{}, ct_eq<-3>{}, ct_eq<-4>{}, ct_eq<-5>{});
  19. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  20. hana::partition(MAKE_TUPLE(), undefined{}),
  21. pair(MAKE_TUPLE(), MAKE_TUPLE())
  22. ));
  23. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  24. hana::partition(MAKE_TUPLE(ct_eq<0>{}), pred),
  25. pair(MAKE_TUPLE(),
  26. MAKE_TUPLE(ct_eq<0>{}))
  27. ));
  28. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  29. hana::partition(MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}), pred),
  30. pair(MAKE_TUPLE(),
  31. MAKE_TUPLE(ct_eq<0>{}, ct_eq<1>{}))
  32. ));
  33. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  34. hana::partition(MAKE_TUPLE(ct_eq<-1>{}), pred),
  35. pair(MAKE_TUPLE(ct_eq<-1>{}),
  36. MAKE_TUPLE())
  37. ));
  38. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  39. hana::partition(MAKE_TUPLE(ct_eq<-1>{}, ct_eq<0>{}, ct_eq<2>{}), pred),
  40. pair(MAKE_TUPLE(ct_eq<-1>{}),
  41. MAKE_TUPLE(ct_eq<0>{}, ct_eq<2>{}))
  42. ));
  43. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  44. hana::partition(MAKE_TUPLE(ct_eq<0>{}, ct_eq<-3>{}, ct_eq<2>{}, ct_eq<-5>{}, ct_eq<6>{}), pred),
  45. pair(MAKE_TUPLE(ct_eq<-3>{}, ct_eq<-5>{}),
  46. MAKE_TUPLE(ct_eq<0>{}, ct_eq<2>{}, ct_eq<6>{}))
  47. ));
  48. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  49. hana::partition(MAKE_TUPLE(ct_eq<-1>{}, ct_eq<2>{}, ct_eq<-3>{}, ct_eq<0>{}, ct_eq<-3>{}, ct_eq<4>{}), pred),
  50. pair(MAKE_TUPLE(ct_eq<-1>{}, ct_eq<-3>{}, ct_eq<-3>{}),
  51. MAKE_TUPLE(ct_eq<2>{}, ct_eq<0>{}, ct_eq<4>{}))
  52. ));
  53. // partition.by
  54. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  55. hana::partition.by(pred, MAKE_TUPLE(ct_eq<-1>{}, ct_eq<0>{}, ct_eq<2>{})),
  56. hana::partition(MAKE_TUPLE(ct_eq<-1>{}, ct_eq<0>{}, ct_eq<2>{}), pred)
  57. ));
  58. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  59. hana::partition.by(pred)(MAKE_TUPLE(ct_eq<-1>{}, ct_eq<0>{}, ct_eq<2>{})),
  60. hana::partition(MAKE_TUPLE(ct_eq<-1>{}, ct_eq<0>{}, ct_eq<2>{}), pred)
  61. ));
  62. }};
  63. #endif // !BOOST_HANA_TEST_AUTO_PARTITION_HPP