overload_linearly.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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/functional/overload_linearly.hpp>
  5. #include <boost/hana/assert.hpp>
  6. #include <boost/hana/equal.hpp>
  7. #include <laws/base.hpp>
  8. namespace hana = boost::hana;
  9. using hana::test::ct_eq;
  10. struct A { };
  11. struct AA : A { };
  12. struct B { };
  13. struct C { };
  14. int main() {
  15. // 2 functions without overlap
  16. {
  17. auto f = hana::overload_linearly(
  18. [](A) { return ct_eq<0>{}; },
  19. [](B) { return ct_eq<1>{}; }
  20. );
  21. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  22. f(A{}),
  23. ct_eq<0>{}
  24. ));
  25. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  26. f(AA{}),
  27. f(A{})
  28. ));
  29. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  30. f(B{}),
  31. ct_eq<1>{}
  32. ));
  33. }
  34. // 2 functions with overlap
  35. {
  36. auto f = hana::overload_linearly(
  37. [](A) { return ct_eq<0>{}; },
  38. [](A) { return ct_eq<1>{}; }
  39. );
  40. auto g = hana::overload_linearly(
  41. [](A) { return ct_eq<0>{}; },
  42. [](AA) { return ct_eq<1>{}; }
  43. );
  44. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  45. f(A{}),
  46. ct_eq<0>{}
  47. ));
  48. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  49. f(AA{}),
  50. f(A{})
  51. ));
  52. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  53. g(A{}),
  54. ct_eq<0>{}
  55. ));
  56. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  57. g(AA{}),
  58. g(A{})
  59. ));
  60. }
  61. // 3 functions
  62. {
  63. auto f = hana::overload_linearly(
  64. [](A) { return ct_eq<0>{}; },
  65. [](B) { return ct_eq<1>{}; },
  66. [](C) { return ct_eq<2>{}; }
  67. );
  68. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  69. f(A{}),
  70. ct_eq<0>{}
  71. ));
  72. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  73. f(AA{}),
  74. f(A{})
  75. ));
  76. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  77. f(B{}),
  78. ct_eq<1>{}
  79. ));
  80. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  81. f(C{}),
  82. ct_eq<2>{}
  83. ));
  84. }
  85. // 1 function (github issue #280)
  86. {
  87. auto f = hana::overload_linearly(
  88. [](A) { return ct_eq<0>{}; }
  89. );
  90. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  91. f(A{}),
  92. ct_eq<0>{}
  93. ));
  94. BOOST_HANA_CONSTANT_CHECK(hana::equal(
  95. f(AA{}),
  96. f(A{})
  97. ));
  98. }
  99. }