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);
|
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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user