From 561e02fefb72be902482fc49dcec66b4c585b798 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 19 May 2022 13:38:52 -0600 Subject: [PATCH] [map] Make hb_map_t hashable --- src/hb-map.hh | 8 ++++++++ src/test-map.cc | 21 +++++++++++---------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/hb-map.hh b/src/hb-map.hh index dbfb85863..406a82abf 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -239,6 +239,14 @@ struct hb_hashmap_t bool is_empty () const { return population == 0; } explicit operator bool () const { return !is_empty (); } + unsigned hash () const + { + unsigned h = 0; + for (auto pair : iter ()) + h ^= hb_hash (pair.first) ^ hb_hash (pair.second); + return h; + } + bool is_equal (const hb_hashmap_t &other) const { if (population != other.population) return false; diff --git a/src/test-map.cc b/src/test-map.cc index c90195506..943f0c5f8 100644 --- a/src/test-map.cc +++ b/src/test-map.cc @@ -29,6 +29,7 @@ #include static const std::string invalid{"invalid"}; +static const hb_map_t invalid_map{}; static const hb_set_t invalid_set{}; static const hb_vector_t invalid_vector{}; @@ -152,29 +153,29 @@ main (int argc, char **argv) } } -#if 0 /* Test hashing maps. */ { + using pair = hb_pair_t; + hb_hashmap_t m1; hb_hashmap_t m2; - m1.map (hb_map_t (), hb_map_t ()); - m2.map (hb_map_t (), hb_map_t ()); + m1.set (hb_map_t (), hb_map_t {}); + m2.set (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.set (hb_map_t (), hb_map_t {pair (1u, 2u)}); + m2.set (hb_map_t (), hb_map_t {pair (1u, 2u)}); - // m1.map (hb_map_t {1}, hb_map_t {2}); - // m2.map (hb_map_t {1}, hb_map_t {2}); + m1.set (hb_map_t {pair (1u, 2u)}, hb_map_t {pair (2u, 3u)}); + m2.set (hb_map_t {pair (1u, 2u)}, hb_map_t {pair (2u, 3u)}); /* 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}); + assert (m1.get (hb_map_t {pair (1u, 2u)}) == hb_map_t {pair (2u, 3u)}); + assert (m2.get (hb_map_t {pair (1u, 2u)}) == hb_map_t {pair (2u, 3u)}); } -#endif /* Test hashing sets. */ {