hash_tuple_like.hpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // Copyright 2005-2009 Daniel James.
  2. // Copyright 2021 Peter Dimov.
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // https://www.boost.org/LICENSE_1_0.txt
  5. #ifndef BOOST_HASH_DETAIL_HASH_TUPLE_LIKE_HPP
  6. #define BOOST_HASH_DETAIL_HASH_TUPLE_LIKE_HPP
  7. #include <boost/container_hash/hash_fwd.hpp>
  8. #include <boost/container_hash/is_tuple_like.hpp>
  9. #include <boost/container_hash/is_range.hpp>
  10. #include <type_traits>
  11. #include <utility>
  12. namespace boost
  13. {
  14. namespace hash_detail
  15. {
  16. template <std::size_t I, typename T>
  17. inline
  18. typename std::enable_if<(I == std::tuple_size<T>::value), void>::type
  19. hash_combine_tuple_like( std::size_t&, T const& )
  20. {
  21. }
  22. template <std::size_t I, typename T>
  23. inline
  24. typename std::enable_if<(I < std::tuple_size<T>::value), void>::type
  25. hash_combine_tuple_like( std::size_t& seed, T const& v )
  26. {
  27. using std::get;
  28. boost::hash_combine( seed, get<I>( v ) );
  29. boost::hash_detail::hash_combine_tuple_like<I + 1>( seed, v );
  30. }
  31. template <typename T>
  32. inline std::size_t hash_tuple_like( T const& v )
  33. {
  34. std::size_t seed = 0;
  35. boost::hash_detail::hash_combine_tuple_like<0>( seed, v );
  36. return seed;
  37. }
  38. } // namespace hash_detail
  39. template <class T>
  40. inline
  41. typename std::enable_if<
  42. container_hash::is_tuple_like<T>::value && !container_hash::is_range<T>::value,
  43. std::size_t>::type
  44. hash_value( T const& v )
  45. {
  46. return boost::hash_detail::hash_tuple_like( v );
  47. }
  48. } // namespace boost
  49. #endif // #ifndef BOOST_HASH_DETAIL_HASH_TUPLE_LIKE_HPP