[hash] Adjust hash for shared_ptr, implement it for std::hash

This commit is contained in:
Behdad Esfahbod 2022-06-02 09:55:43 -06:00
parent e037325efb
commit a089d91fda
2 changed files with 19 additions and 8 deletions

View File

@ -240,17 +240,17 @@ struct
private:
template <typename T> constexpr auto
impl (const T& v, hb_priority<2>) const HB_RETURN (uint32_t, hb_deref (v).hash ())
template <typename T> constexpr auto
impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, std::hash<hb_decay<decltype (hb_deref (v))>>{} (hb_deref (v)))
impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, hb_deref (v).hash ())
template <typename T> constexpr uint32_t
impl (const hb::shared_ptr<T>& v, hb_priority<0>) const
impl (const hb::shared_ptr<T>& v, hb_priority<1>) const
{
return (uint32_t) (intptr_t) v.get () * 2654435761u;
return (uint32_t) (intptr_t) v.get ()->hash ();
}
template <typename T> constexpr auto
impl (const T& v, hb_priority<0>) const HB_RETURN (uint32_t, std::hash<hb_decay<decltype (hb_deref (v))>>{} (hb_deref (v)))
public:
template <typename T> constexpr auto

View File

@ -88,8 +88,6 @@ struct shared_ptr
template<typename T> struct is_shared_ptr : std::false_type {};
template<typename T> struct is_shared_ptr<shared_ptr<T>> : std::true_type {};
// TODO Implement hash<> and atomic<>
template <typename T,
T * (*_get_empty) (void),
T * (*_reference) (T *),
@ -135,6 +133,19 @@ HB_DEFINE_VTABLE (unicode_funcs);
} // namespace hb
template<typename T>
struct std::hash<hb::shared_ptr<T>>
{
std::size_t operator()(const hb::shared_ptr<T>& v) const noexcept
{
std::size_t h = std::hash<decltype (v.get ())>{}(v.get ());
return h;
}
};
// TODO Implement atomic<>
#endif /* __cplusplus */
#endif /* HB_CPLUSPLUS_HH */