27 #ifndef LBANN_UTILS_HASH_HPP_INCLUDED 28 #define LBANN_UTILS_HASH_HPP_INCLUDED 31 #include <type_traits> 46 template <
class T,
class Hash = std::hash<T>>
49 return seed ^ (Hash()(val) + 0x9e3779b9 + (seed << 6) + (seed >> 2));
61 typename std::conditional<std::is_enum<T>::value,
62 typename std::underlying_type<T>::type,
66 return std::hash<underlying_t>()(static_cast<underlying_t>(val));
73 class Hash1 = std::hash<T1>,
74 class Hash2 = std::hash<T2>>
77 std::size_t
operator()(
const std::pair<T1, T2>& val)
const 79 auto seed = Hash1()(val.first);
80 return hash_combine<T2, Hash2>(seed, val.second);
86 #endif // LBANN_UTILS_HASH_HPP_INCLUDED std::size_t operator()(const std::pair< T1, T2 > &val) const
std::size_t operator()(T val) const
typename std::conditional< std::is_enum< T >::value, typename std::underlying_type< T >::type, T >::type underlying_t
Hash function for enumeration type.
std::size_t hash_combine(std::size_t seed, const T &val)
Combine two hash values.
Hash function for std::pair.