From f657ef7e57c889309c2d9d37934368ca255f9d5b Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 18 Nov 2022 19:17:03 -0700 Subject: [PATCH] [map] Allow std::move-ing keys into the map --- src/hb-map.hh | 15 +++++++++------ src/test-map.cc | 2 ++ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/hb-map.hh b/src/hb-map.hh index f938757aa..5712eb03f 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)); } @@ -199,7 +199,9 @@ struct hb_hashmap_t } template - bool set (K key, VV&& value) { return set_with_hash (key, hb_hash (key), std::forward (value)); } + bool set (const K &key, VV&& value) { return set_with_hash (hb_ridentity (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 (K key) const { @@ -208,7 +210,8 @@ struct hb_hashmap_t return item.is_real () && item == key ? item.value : item_t::default_value (); } - void del (K key) { set_with_hash (key, hb_hash (key), item_t::default_value (), true); } + void del (const K &key) { set_with_hash (hb_ridentity (key), hb_hash (key), item_t::default_value (), true); } + void del (K&& key) { set_with_hash (std::move (key), hb_hash (key), item_t::default_value (), true); } /* Has interface. */ typedef const V& value_t; @@ -320,8 +323,8 @@ struct hb_hashmap_t protected: - template - bool set_with_hash (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; @@ -337,7 +340,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); diff --git a/src/test-map.cc b/src/test-map.cc index 6f382ba78..2f59779e2 100644 --- a/src/test-map.cc +++ b/src/test-map.cc @@ -224,6 +224,8 @@ main (int argc, char **argv) { hb_hashmap_t, hb::unique_ptr> m; + 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 ();