24 #ifndef PXR_BASE_VT_HASH_H 25 #define PXR_BASE_VT_HASH_H 28 #include "pxr/base/vt/api.h" 30 #include <boost/functional/hash.hpp> 34 PXR_NAMESPACE_OPEN_SCOPE
36 namespace Vt_HashDetail {
39 VT_API
void _IssueUnimplementedHashError(std::type_info
const &t);
43 using boost::hash_value;
46 template <class T, class = decltype(hash_value(std::declval<T>()))>
47 constexpr
bool _IsHashable(
int) {
return true; }
48 template <class T, class = decltype(TfHash()(std::declval<T>()))>
49 constexpr
bool _IsHashable(
long) {
return true; }
51 constexpr
bool _IsHashable(...) {
return false; }
56 template <class T, class = decltype(hash_value(std::declval<T>()))>
58 _HashValueImpl(T
const &val,
int)
63 template <class T, class = decltype(TfHash()(std::declval<T>()))>
65 _HashValueImpl(T
const &val,
long)
72 _HashValueImpl(T
const &val, ...)
74 Vt_HashDetail::_IssueUnimplementedHashError(
typeid(T));
87 return Vt_HashDetail::_IsHashable<T>(0);
94 size_t VtHashValue(T
const &val)
96 return Vt_HashDetail::_HashValueImpl(val, 0);
99 PXR_NAMESPACE_CLOSE_SCOPE
101 #endif // PXR_BASE_VT_HASH_H
A user-extensible hashing mechanism for use with runtime hash tables.
std::enable_if< std::is_same< Half, half >::value, size_t >::type hash_value(const Half &h)
Overload hash_value for half.