From 95b94ad19b025cef0617610a2605f23688a48a2f Mon Sep 17 00:00:00 2001
From: Alberto Gonzalez <boqwxp@airmail.cc>
Date: Mon, 20 Apr 2020 02:16:55 +0000
Subject: In `pool`, construct `entry_t`s in-place and add an
 rvalue-accepting-and-forwarding `insert()` method.

---
 kernel/hashlib.h | 27 +++++++++++++++++++++++++--
 1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/kernel/hashlib.h b/kernel/hashlib.h
index 996bda38e..1a21494a7 100644
--- a/kernel/hashlib.h
+++ b/kernel/hashlib.h
@@ -745,11 +745,24 @@ protected:
 	int do_insert(const K &value, int &hash)
 	{
 		if (hashtable.empty()) {
-			entries.push_back(entry_t(value, -1));
+			entries.emplace_back(value, -1);
+			do_rehash();
+			hash = do_hash(value);
+		} else {
+			entries.emplace_back(value, hashtable[hash]);
+			hashtable[hash] = entries.size() - 1;
+		}
+		return entries.size() - 1;
+	}
+
+	int do_insert(K &&value, int &hash)
+	{
+		if (hashtable.empty()) {
+			entries.emplace_back(std::forward<K>(value), -1);
 			do_rehash();
 			hash = do_hash(value);
 		} else {
-			entries.push_back(entry_t(value, hashtable[hash]));
+			entries.emplace_back(std::forward<K>(value), hashtable[hash]);
 			hashtable[hash] = entries.size() - 1;
 		}
 		return entries.size() - 1;
@@ -847,6 +860,16 @@ public:
 		return std::pair<iterator, bool>(iterator(this, i), true);
 	}
 
+	std::pair<iterator, bool> insert(K &&value)
+	{
+		int hash = do_hash(value);
+		int i = do_lookup(value, hash);
+		if (i >= 0)
+			return std::pair<iterator, bool>(iterator(this, i), false);
+		i = do_insert(std::forward<K>(value), hash);
+		return std::pair<iterator, bool>(iterator(this, i), true);
+	}
+
 	int erase(const K &key)
 	{
 		int hash = do_hash(key);
-- 
cgit v1.2.3