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);
}
// Multiple entries with the same key
// Replace Multiple entries with the same key
{
HashMap<int, int> map;
map.insert({10, 1});
map.insert({10, 2});
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);
kak_assert(map.find_index(10) == 0);
map.remove(10);

View File

@ -160,7 +160,8 @@ struct HashItem
template<typename Key, typename Value,
MemoryDomain domain = MemoryDomain::Undefined,
template<typename, MemoryDomain> class Container = Vector>
template<typename, MemoryDomain> class Container = Vector,
bool multi_key = false>
struct HashMap
{
using Item = HashItem<Key, Value>;
@ -176,8 +177,18 @@ struct HashMap
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.add(hash_value(item.key), (int)m_items.size());
m_index.add(hash, (int)m_items.size());
m_items.push_back(std::move(item));
return m_items.back().value;
}
@ -315,6 +326,11 @@ private:
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();
}