Change HashMap not to support multiple identical keys by default

We do not seem to have any uses for this remaining, and this is
better opt-in with MultiHashMap
This commit is contained in:
Maxime Coste 2022-08-05 19:20:00 +10:00
parent 31e9fc3cef
commit 9fb7d90449
2 changed files with 30 additions and 3 deletions

View File

@ -30,12 +30,23 @@ UnitTest test_hash_map{[] {
kak_assert(map.size() == 2); kak_assert(map.size() == 2);
} }
// Multiple entries with the same key // Replace Multiple entries with the same key
{ {
HashMap<int, int> map; HashMap<int, int> map;
map.insert({10, 1}); map.insert({10, 1});
map.insert({10, 2}); map.insert({10, 2});
kak_assert(map.find_index(10) == 0); kak_assert(map.find_index(10) == 0);
kak_assert(map[10] == 2);
map.remove(10);
kak_assert(map.find_index(10) == -1);
}
// Multiple entries with the same key
{
MultiHashMap<int, int> map;
map.insert({10, 1});
map.insert({10, 2});
kak_assert(map.find_index(10) == 0);
map.remove(10); map.remove(10);
kak_assert(map.find_index(10) == 0); kak_assert(map.find_index(10) == 0);
map.remove(10); map.remove(10);

View File

@ -160,7 +160,8 @@ struct HashItem
template<typename Key, typename Value, template<typename Key, typename Value,
MemoryDomain domain = MemoryDomain::Undefined, MemoryDomain domain = MemoryDomain::Undefined,
template<typename, MemoryDomain> class Container = Vector> template<typename, MemoryDomain> class Container = Vector,
bool multi_key = false>
struct HashMap struct HashMap
{ {
using Item = HashItem<Key, Value>; using Item = HashItem<Key, Value>;
@ -176,8 +177,18 @@ struct HashMap
constexpr Value& insert(Item item) constexpr Value& insert(Item item)
{ {
const auto hash = hash_value(item.key);
if constexpr (not multi_key)
{
if (auto index = find_index(item.key, hash); index >= 0)
{
m_items[index] = std::move(item);
return m_items[index].value;
}
}
m_index.reserve(m_items.size()+1); m_index.reserve(m_items.size()+1);
m_index.add(hash_value(item.key), (int)m_items.size()); m_index.add(hash, (int)m_items.size());
m_items.push_back(std::move(item)); m_items.push_back(std::move(item));
return m_items.back().value; return m_items.back().value;
} }
@ -315,6 +326,11 @@ private:
HashIndex<domain, Container> m_index; HashIndex<domain, Container> m_index;
}; };
template<typename Key, typename Value,
MemoryDomain domain = MemoryDomain::Undefined,
template<typename, MemoryDomain> class Container = Vector>
using MultiHashMap = HashMap<Key, Value, domain, Container, true>;
void profile_hash_maps(); void profile_hash_maps();
} }