From 86a763c651090094f35f1995cba7a923aaa9e0d3 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Mon, 21 Nov 2022 20:53:44 -0700 Subject: [PATCH] [map] Make keys moveable --- src/hb-map.hh | 10 ++++++---- src/test-map.cc | 6 ++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/hb-map.hh b/src/hb-map.hh index b08c3f382..f9c7b3d3f 100644 --- a/src/hb-map.hh +++ b/src/hb-map.hh @@ -186,7 +186,7 @@ struct hb_hashmap_t { if (old_items[i].is_real ()) { - set_with_hash (old_items[i].key, + set_with_hash (std::move (old_items[i].key), old_items[i].hash, std::move (old_items[i].value)); } @@ -198,8 +198,8 @@ struct hb_hashmap_t return true; } - template - bool set_with_hash (const K &key, uint32_t hash, VV&& value, bool is_delete=false) + template + bool set_with_hash (KK&& key, uint32_t hash, VV&& value, bool is_delete=false) { if (unlikely (!successful)) return false; if (unlikely ((occupancy + occupancy / 2) >= mask && !resize ())) return false; @@ -215,7 +215,7 @@ struct hb_hashmap_t population--; } - item.key = key; + item.key = std::forward (key); item.value = std::forward (value); item.hash = hash; item.set_used (true); @@ -230,6 +230,8 @@ struct hb_hashmap_t template bool set (const K &key, VV&& value) { return set_with_hash (key, hb_hash (key), std::forward (value)); } + template + bool set (K &&key, VV&& value) { return set_with_hash (std::move (key), hb_hash (key), std::forward (value)); } const V& get_with_hash (const K &key, uint32_t hash) const { diff --git a/src/test-map.cc b/src/test-map.cc index 12455ea8e..b9b012279 100644 --- a/src/test-map.cc +++ b/src/test-map.cc @@ -228,10 +228,8 @@ main (int argc, char **argv) { hb_hashmap_t, hb::unique_ptr> m; - // Doesn't work. - // See commit f657ef7e57c889309c2d9d37934368ca255f9d5b and its revert. - //m.set (hb::unique_ptr (hb_set_get_empty ()), - // hb::unique_ptr (hb_set_get_empty ())); + m.set (hb::unique_ptr (hb_set_get_empty ()), + hb::unique_ptr (hb_set_get_empty ())); m.get (hb::unique_ptr (hb_set_get_empty ())); m.iter_ref (); m.keys_ref ();