hash.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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/assert.hpp>
  5. #include <boost/hana/bool.hpp>
  6. #include <boost/hana/config.hpp>
  7. #include <boost/hana/equal.hpp>
  8. #include <boost/hana/hash.hpp>
  9. #include <boost/hana/integral_constant.hpp>
  10. #include <boost/hana/type.hpp>
  11. #include <type_traits>
  12. namespace hana = boost::hana;
  13. int main() {
  14. // Unsigned integral constants should hash to `unsigned long long`
  15. {
  16. BOOST_HANA_CONSTANT_ASSERT(hana::equal(
  17. hana::hash(hana::integral_c<unsigned char, 10>),
  18. hana::type_c<hana::integral_constant<unsigned long long, 10>>
  19. ));
  20. BOOST_HANA_CONSTANT_ASSERT(hana::equal(
  21. hana::hash(hana::integral_c<unsigned short, 10>),
  22. hana::type_c<hana::integral_constant<unsigned long long, 10>>
  23. ));
  24. BOOST_HANA_CONSTANT_ASSERT(hana::equal(
  25. hana::hash(hana::integral_c<unsigned int, 10>),
  26. hana::type_c<hana::integral_constant<unsigned long long, 10>>
  27. ));
  28. BOOST_HANA_CONSTANT_ASSERT(hana::equal(
  29. hana::hash(hana::integral_c<unsigned long, 10>),
  30. hana::type_c<hana::integral_constant<unsigned long long, 10>>
  31. ));
  32. BOOST_HANA_CONSTANT_ASSERT(hana::equal(
  33. hana::hash(hana::integral_c<unsigned long long, 10>),
  34. hana::type_c<hana::integral_constant<unsigned long long, 10>>
  35. ));
  36. }
  37. // Signed integral constants should hash to `signed long long`
  38. {
  39. BOOST_HANA_CONSTANT_ASSERT(hana::equal(
  40. hana::hash(hana::integral_c<signed char, 10>),
  41. hana::type_c<hana::integral_constant<signed long long, 10>>
  42. ));
  43. BOOST_HANA_CONSTANT_ASSERT(hana::equal(
  44. hana::hash(hana::integral_c<signed short, 10>),
  45. hana::type_c<hana::integral_constant<signed long long, 10>>
  46. ));
  47. BOOST_HANA_CONSTANT_ASSERT(hana::equal(
  48. hana::hash(hana::integral_c<signed int, 10>),
  49. hana::type_c<hana::integral_constant<signed long long, 10>>
  50. ));
  51. BOOST_HANA_CONSTANT_ASSERT(hana::equal(
  52. hana::hash(hana::integral_c<signed long, 10>),
  53. hana::type_c<hana::integral_constant<signed long long, 10>>
  54. ));
  55. BOOST_HANA_CONSTANT_ASSERT(hana::equal(
  56. hana::hash(hana::integral_c<signed long long, 10>),
  57. hana::type_c<hana::integral_constant<signed long long, 10>>
  58. ));
  59. }
  60. // `char` should hash to either `signed long long` or `unsigned long long`,
  61. // depending on its signedness
  62. {
  63. using T = std::conditional_t<
  64. std::is_signed<char>::value,
  65. signed long long,
  66. unsigned long long
  67. >;
  68. BOOST_HANA_CONSTANT_ASSERT(hana::equal(
  69. hana::hash(hana::integral_c<char, 10>),
  70. hana::type_c<hana::integral_constant<T, 10>>
  71. ));
  72. }
  73. // Pointers to members should hash to themselves.
  74. // This test is disabled in pre-C++17, because pointers to non-static
  75. // data members can't be used as non-type template arguments before that.
  76. // See http://stackoverflow.com/q/35398848/627587.
  77. {
  78. #if __cplusplus > 201402L
  79. struct Foo { int bar; };
  80. constexpr auto x = hana::integral_constant<int Foo::*, &Foo::bar>{};
  81. BOOST_HANA_CONSTANT_ASSERT(hana::equal(
  82. hana::hash(x),
  83. hana::type_c<hana::integral_constant<int Foo::*, &Foo::bar>>
  84. ));
  85. #endif
  86. }
  87. // Booleans should hash to themselves
  88. {
  89. BOOST_HANA_CONSTANT_ASSERT(hana::equal(
  90. hana::hash(hana::true_c),
  91. hana::type_c<hana::true_>
  92. ));
  93. BOOST_HANA_CONSTANT_ASSERT(hana::equal(
  94. hana::hash(hana::false_c),
  95. hana::type_c<hana::false_>
  96. ));
  97. }
  98. }