[map] Add is_equal() / towards making hb_map_t hashable
New API: + hb_map_is_equal()
This commit is contained in:
parent
14a24d8e3f
commit
ad17699089
|
@ -459,6 +459,7 @@ hb_map_destroy
|
||||||
hb_map_get
|
hb_map_get
|
||||||
hb_map_get_empty
|
hb_map_get_empty
|
||||||
hb_map_get_population
|
hb_map_get_population
|
||||||
|
hb_map_is_equal
|
||||||
hb_map_get_user_data
|
hb_map_get_user_data
|
||||||
hb_map_has
|
hb_map_has
|
||||||
hb_map_is_empty
|
hb_map_is_empty
|
||||||
|
|
|
@ -289,3 +289,23 @@ hb_map_get_population (const hb_map_t *map)
|
||||||
{
|
{
|
||||||
return map->get_population ();
|
return map->get_population ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hb_map_is_equal:
|
||||||
|
* @map: A map
|
||||||
|
* @other: Another map
|
||||||
|
*
|
||||||
|
* Tests whether @map and @other are equal (contain the same
|
||||||
|
* elements).
|
||||||
|
*
|
||||||
|
* Return value: %true if the two maps are equal, %false otherwise.
|
||||||
|
*
|
||||||
|
* Since: REPLACEME
|
||||||
|
**/
|
||||||
|
hb_bool_t
|
||||||
|
hb_map_is_equal (const hb_map_t *map,
|
||||||
|
const hb_map_t *other)
|
||||||
|
{
|
||||||
|
return map->is_equal (*other);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,10 @@ hb_map_is_empty (const hb_map_t *map);
|
||||||
HB_EXTERN unsigned int
|
HB_EXTERN unsigned int
|
||||||
hb_map_get_population (const hb_map_t *map);
|
hb_map_get_population (const hb_map_t *map);
|
||||||
|
|
||||||
|
HB_EXTERN hb_bool_t
|
||||||
|
hb_map_is_equal (const hb_map_t *map,
|
||||||
|
const hb_map_t *other);
|
||||||
|
|
||||||
HB_EXTERN void
|
HB_EXTERN void
|
||||||
hb_map_set (hb_map_t *map,
|
hb_map_set (hb_map_t *map,
|
||||||
hb_codepoint_t key,
|
hb_codepoint_t key,
|
||||||
|
|
|
@ -42,6 +42,7 @@ template <typename K, typename V,
|
||||||
struct hb_hashmap_t
|
struct hb_hashmap_t
|
||||||
{
|
{
|
||||||
hb_hashmap_t () { init (); }
|
hb_hashmap_t () { init (); }
|
||||||
|
hb_hashmap_t (std::nullptr_t) : hb_hashmap_t () {}
|
||||||
~hb_hashmap_t () { fini (); }
|
~hb_hashmap_t () { fini (); }
|
||||||
|
|
||||||
hb_hashmap_t (const hb_hashmap_t& o) : hb_hashmap_t () { resize (population); hb_copy (o, *this); }
|
hb_hashmap_t (const hb_hashmap_t& o) : hb_hashmap_t () { resize (population); hb_copy (o, *this); }
|
||||||
|
@ -238,6 +239,19 @@ struct hb_hashmap_t
|
||||||
bool is_empty () const { return population == 0; }
|
bool is_empty () const { return population == 0; }
|
||||||
explicit operator bool () const { return !is_empty (); }
|
explicit operator bool () const { return !is_empty (); }
|
||||||
|
|
||||||
|
bool is_equal (const hb_hashmap_t &other) const
|
||||||
|
{
|
||||||
|
if (population != other.population) return false;
|
||||||
|
|
||||||
|
for (auto pair : iter ())
|
||||||
|
if (get (pair.first) != pair.second)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
bool operator == (const hb_hashmap_t &other) const { return is_equal (other); }
|
||||||
|
bool operator != (const hb_hashmap_t &other) const { return !is_equal (other); }
|
||||||
|
|
||||||
unsigned int get_population () const { return population; }
|
unsigned int get_population () const { return population; }
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -394,6 +408,7 @@ struct hb_map_t : hb_hashmap_t<hb_codepoint_t,
|
||||||
|
|
||||||
~hb_map_t () = default;
|
~hb_map_t () = default;
|
||||||
hb_map_t () : hashmap () {}
|
hb_map_t () : hashmap () {}
|
||||||
|
hb_map_t (std::nullptr_t) : hb_map_t () {}
|
||||||
hb_map_t (const hb_map_t &o) : hashmap ((hashmap &) o) {}
|
hb_map_t (const hb_map_t &o) : hashmap ((hashmap &) o) {}
|
||||||
hb_map_t (hb_map_t &&o) : hashmap (std::move ((hashmap &) o)) {}
|
hb_map_t (hb_map_t &&o) : hashmap (std::move ((hashmap &) o)) {}
|
||||||
hb_map_t& operator= (const hb_map_t&) = default;
|
hb_map_t& operator= (const hb_map_t&) = default;
|
||||||
|
|
|
@ -152,6 +152,30 @@ main (int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Test hashing maps. */
|
||||||
|
{
|
||||||
|
hb_hashmap_t<hb_map_t, hb_map_t, const hb_map_t *, const hb_map_t *, &invalid_map, &invalid_map> m1;
|
||||||
|
hb_hashmap_t<hb_map_t, hb_map_t, std::nullptr_t, std::nullptr_t, nullptr, nullptr> m2;
|
||||||
|
|
||||||
|
m1.map (hb_map_t (), hb_map_t ());
|
||||||
|
m2.map (hb_map_t (), hb_map_t ());
|
||||||
|
|
||||||
|
// m1.map (hb_map_t (), hb_map_t {1});
|
||||||
|
// m2.map (hb_map_t (), hb_map_t {1});
|
||||||
|
|
||||||
|
// m1.map (hb_map_t {1}, hb_map_t {2});
|
||||||
|
// m2.map (hb_map_t {1}, hb_map_t {2});
|
||||||
|
|
||||||
|
/* Cannot override empty map. */
|
||||||
|
assert (m1.get (hb_map_t ()) == hb_map_t ());
|
||||||
|
assert (m2.get (hb_map_t ()) == hb_map_t ());
|
||||||
|
|
||||||
|
// assert (m1.get (hb_map_t {1}) == hb_map_t {2});
|
||||||
|
// assert (m2.get (hb_map_t {1}) == hb_map_t {2});
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Test hashing sets. */
|
/* Test hashing sets. */
|
||||||
{
|
{
|
||||||
hb_hashmap_t<hb_set_t, hb_set_t, const hb_set_t *, const hb_set_t *, &invalid_set, &invalid_set> m1;
|
hb_hashmap_t<hb_set_t, hb_set_t, const hb_set_t *, const hb_set_t *, &invalid_set, &invalid_set> m1;
|
||||||
|
|
Loading…
Reference in New Issue