Implement hashing of objects
Should be improved for hb_bytes_t.
This commit is contained in:
parent
d6b28057a5
commit
b189bbc48f
|
@ -40,7 +40,7 @@ static const struct
|
||||||
//{ return hb_deref_pointer (v).hash (); }
|
//{ return hb_deref_pointer (v).hash (); }
|
||||||
/* Instead, the following ugly soution: */
|
/* Instead, the following ugly soution: */
|
||||||
template <typename T,
|
template <typename T,
|
||||||
hb_enable_if (!hb_is_integer (hb_remove_reference (T)) && !hb_is_pointer (T))>
|
hb_enable_if (!hb_is_integer (hb_remove_const (hb_remove_reference (T))) && !hb_is_pointer (T))>
|
||||||
uint32_t operator () (T&& v) const { return v.hash (); }
|
uint32_t operator () (T&& v) const { return v.hash (); }
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
|
|
@ -79,6 +79,8 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&>
|
||||||
operator hb_array_t<const Type> () { return hb_array_t<const Type> (arrayZ, length); }
|
operator hb_array_t<const Type> () { return hb_array_t<const Type> (arrayZ, length); }
|
||||||
template <typename T> operator T * () const { return arrayZ; }
|
template <typename T> operator T * () const { return arrayZ; }
|
||||||
|
|
||||||
|
uint32_t hash () const;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Compare, Sort, and Search.
|
* Compare, Sort, and Search.
|
||||||
*/
|
*/
|
||||||
|
@ -273,9 +275,20 @@ template <typename T, unsigned int length_> inline hb_sorted_array_t<T>
|
||||||
hb_sorted_array (T (&array_)[length_])
|
hb_sorted_array (T (&array_)[length_])
|
||||||
{ return hb_sorted_array_t<T> (array_); }
|
{ return hb_sorted_array_t<T> (array_); }
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
uint32_t hb_array_t<T>::hash () const
|
||||||
|
{
|
||||||
|
uint32_t h = 0;
|
||||||
|
for (unsigned i = 0; i < length; i++)
|
||||||
|
h ^= hb_hash (arrayZ[i]);
|
||||||
|
return h;
|
||||||
|
}
|
||||||
|
|
||||||
typedef hb_array_t<const char> hb_bytes_t;
|
typedef hb_array_t<const char> hb_bytes_t;
|
||||||
typedef hb_array_t<const unsigned char> hb_ubytes_t;
|
typedef hb_array_t<const unsigned char> hb_ubytes_t;
|
||||||
|
|
||||||
|
/* TODO Specialize hashing for hb_bytes_t and hb_ubytes_t. */
|
||||||
|
//template <>
|
||||||
|
//uint32_t hb_array_t<const char>::hash () const { return 0; }
|
||||||
|
|
||||||
#endif /* HB_ARRAY_HH */
|
#endif /* HB_ARRAY_HH */
|
||||||
|
|
|
@ -58,6 +58,11 @@ struct hb_serialize_context_t
|
||||||
&& 0 == memcmp (head, o.head, tail - head)
|
&& 0 == memcmp (head, o.head, tail - head)
|
||||||
&& 0 == memcmp (&links, &o.links, links.get_size ());
|
&& 0 == memcmp (&links, &o.links, links.get_size ());
|
||||||
}
|
}
|
||||||
|
uint32_t hash () const
|
||||||
|
{
|
||||||
|
return hb_bytes_t (head, tail - head).hash () ^
|
||||||
|
links.as_bytes ().hash ();
|
||||||
|
}
|
||||||
|
|
||||||
struct link_t
|
struct link_t
|
||||||
{
|
{
|
||||||
|
|
|
@ -100,6 +100,11 @@ struct hb_vector_t
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hb_bytes_t as_bytes () const { return hb_bytes_t ((const char *) arrayZ_,
|
||||||
|
length * item_size); }
|
||||||
|
|
||||||
|
uint32_t hash () const { return as_bytes ().hash (); }
|
||||||
|
|
||||||
const Type * arrayZ () const { return arrayZ_; }
|
const Type * arrayZ () const { return arrayZ_; }
|
||||||
Type * arrayZ () { return arrayZ_; }
|
Type * arrayZ () { return arrayZ_; }
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue