hash_traits.hpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /* Hash function characterization.
  2. *
  3. * Copyright 2022-2024 Joaquin M Lopez Munoz.
  4. * Distributed under the Boost Software License, Version 1.0.
  5. * (See accompanying file LICENSE_1_0.txt or copy at
  6. * http://www.boost.org/LICENSE_1_0.txt)
  7. *
  8. * See https://www.boost.org/libs/unordered for library home page.
  9. */
  10. #ifndef BOOST_UNORDERED_HASH_TRAITS_HPP
  11. #define BOOST_UNORDERED_HASH_TRAITS_HPP
  12. #include <boost/unordered/detail/type_traits.hpp>
  13. namespace boost{
  14. namespace unordered{
  15. namespace detail{
  16. template<typename Hash,typename=void>
  17. struct hash_is_avalanching_impl:std::false_type{};
  18. template<typename IsAvalanching>
  19. struct avalanching_value
  20. {
  21. static constexpr bool value=IsAvalanching::value;
  22. };
  23. /* may be explicitly marked as BOOST_DEPRECATED in the future */
  24. template<> struct avalanching_value<void>
  25. {
  26. static constexpr bool value=true;
  27. };
  28. template<typename Hash>
  29. struct hash_is_avalanching_impl<
  30. Hash,
  31. boost::unordered::detail::void_t<typename Hash::is_avalanching>
  32. >:std::integral_constant<
  33. bool,
  34. avalanching_value<typename Hash::is_avalanching>::value
  35. >{};
  36. template<typename Hash>
  37. struct hash_is_avalanching_impl<
  38. Hash,
  39. typename std::enable_if<((void)Hash::is_avalanching,true)>::type
  40. >{}; /* Hash::is_avalanching is not a type: compile error downstream */
  41. } /* namespace detail */
  42. /* Each trait can be partially specialized by users for concrete hash functions
  43. * when actual characterization differs from default.
  44. */
  45. /* hash_is_avalanching<Hash>::value is:
  46. * - false if Hash::is_avalanching is not present.
  47. * - Hash::is_avalanching::value if this is present and constexpr-convertible
  48. * to a bool.
  49. * - true if Hash::is_avalanching is void (deprecated).
  50. * - ill-formed otherwise.
  51. */
  52. template<typename Hash>
  53. struct hash_is_avalanching: detail::hash_is_avalanching_impl<Hash>::type{};
  54. } /* namespace unordered */
  55. } /* namespace boost */
  56. #endif