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:
parent
31e9fc3cef
commit
9fb7d90449
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user