|
|
@@ -21,44 +21,44 @@ namespace crown
|
|
|
namespace hash_map
|
|
|
{
|
|
|
/// Returns the number of items in the map @a m.
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual> u32 size(const HashMap<TKey, TValue, Hash, KeyEqual>& m);
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual> u32 size(const HashMap<TKey, TValue, Hash, KeyEqual>& m);
|
|
|
|
|
|
/// Returns the maximum number of items the map @a m can hold.
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual> u32 capacity(const HashMap<TKey, TValue, Hash, KeyEqual>& m);
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual> u32 capacity(const HashMap<TKey, TValue, Hash, KeyEqual>& m);
|
|
|
|
|
|
/// Returns whether the given @a key exists in the map @a m.
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual> bool has(const HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key);
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual> bool has(const HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key);
|
|
|
|
|
|
/// Returns the value for the given @a key or @a deffault if
|
|
|
/// the key does not exist in the map.
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual> const TValue& get(const HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key, const TValue& deffault);
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual> const TValue& get(const HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key, const TValue& deffault);
|
|
|
|
|
|
/// Returns the value for the given @a key or @a deffault if
|
|
|
/// the key does not exist in the map.
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual> TValue& get(HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key, const TValue& deffault);
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual> TValue& get(HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key, const TValue& deffault);
|
|
|
|
|
|
/// Sets the @a value for the @a key in the map.
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual> void set(HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key, const TValue& value);
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual> void set(HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key, const TValue& value);
|
|
|
|
|
|
/// Removes the @a key from the map if it exists.
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual> void remove(HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key);
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual> void remove(HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key);
|
|
|
|
|
|
/// Removes all the items in the map.
|
|
|
///
|
|
|
/// @note
|
|
|
/// Calls destructor on the items.
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual> void clear(HashMap<TKey, TValue, Hash, KeyEqual>& m);
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual> void clear(HashMap<TKey, TValue, Hash, KeyEqual>& m);
|
|
|
|
|
|
/// Returns whether the @a entry in the map @a m contains data or is a hole.
|
|
|
/// If the entry is a hole you should not touch data in the entry.
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual> bool is_hole(const HashMap<TKey, TValue, Hash, KeyEqual>& m, const typename HashMap<TKey, TValue, Hash, KeyEqual>::Entry* entry);
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual> bool is_hole(const HashMap<TKey, TValue, Hash, KeyEqual>& m, const typename HashMap<TKey, TValue, Hash, KeyEqual>::Entry* entry);
|
|
|
|
|
|
/// Returns a pointer to the first item in the map, can be used to
|
|
|
/// efficiently iterate over the elements (in random order).
|
|
|
/// @note
|
|
|
/// You should skip invalid items with HASH_MAP_SKIP_HOLE().
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual> const typename HashMap<TKey, TValue, Hash, KeyEqual>::Entry* begin(const HashMap<TKey, TValue, Hash, KeyEqual>& m);
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual> const typename HashMap<TKey, TValue, Hash, KeyEqual>::Entry* end(const HashMap<TKey, TValue, Hash, KeyEqual>& m);
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual> const typename HashMap<TKey, TValue, Hash, KeyEqual>::Entry* begin(const HashMap<TKey, TValue, Hash, KeyEqual>& m);
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual> const typename HashMap<TKey, TValue, Hash, KeyEqual>::Entry* end(const HashMap<TKey, TValue, Hash, KeyEqual>& m);
|
|
|
|
|
|
} // namespace hash_map
|
|
|
|
|
|
@@ -71,14 +71,14 @@ namespace hash_map_internal
|
|
|
FREE = 0x00000000u
|
|
|
};
|
|
|
|
|
|
- template <typename TKey, typename Hash>
|
|
|
+ template<typename TKey, typename Hash>
|
|
|
inline u32 key_hash(const TKey& key)
|
|
|
{
|
|
|
const Hash hash;
|
|
|
return hash(key);
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename KeyEqual>
|
|
|
+ template<typename TKey, typename KeyEqual>
|
|
|
inline bool key_equals(const TKey& key_a, const TKey& key_b)
|
|
|
{
|
|
|
const KeyEqual equal;
|
|
|
@@ -91,14 +91,14 @@ namespace hash_map_internal
|
|
|
return (index >> 31) != 0;
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
inline u32 probe_distance(const HashMap<TKey, TValue, Hash, KeyEqual>& m, u32 hash, u32 slot_index)
|
|
|
{
|
|
|
const u32 hash_i = hash & m._mask;
|
|
|
return (slot_index + m._capacity - hash_i) & m._mask;
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
u32 find(const HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key)
|
|
|
{
|
|
|
if (m._size == 0)
|
|
|
@@ -120,7 +120,7 @@ namespace hash_map_internal
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
void insert(HashMap<TKey, TValue, Hash, KeyEqual>& m, u32 hash, const TKey& key, const TValue& value)
|
|
|
{
|
|
|
PAIR(TKey, TValue) new_item(*m._allocator);
|
|
|
@@ -160,7 +160,7 @@ namespace hash_map_internal
|
|
|
memcpy((void*)&new_item, &empty, sizeof(new_item));
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
void rehash(HashMap<TKey, TValue, Hash, KeyEqual>& m, u32 new_capacity)
|
|
|
{
|
|
|
typedef typename HashMap<TKey, TValue, Hash, KeyEqual>::Entry Entry;
|
|
|
@@ -199,14 +199,14 @@ namespace hash_map_internal
|
|
|
memcpy((void*)&nm, (void*)&empty, sizeof(HashMap<TKey, TValue, Hash, KeyEqual>));
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
void grow(HashMap<TKey, TValue, Hash, KeyEqual>& m)
|
|
|
{
|
|
|
const u32 new_capacity = (m._capacity == 0 ? 16 : m._capacity * 2);
|
|
|
rehash(m, new_capacity);
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
bool full(const HashMap<TKey, TValue, Hash, KeyEqual>& m)
|
|
|
{
|
|
|
return m._size >= m._capacity * 0.9f;
|
|
|
@@ -216,25 +216,25 @@ namespace hash_map_internal
|
|
|
|
|
|
namespace hash_map
|
|
|
{
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
u32 size(const HashMap<TKey, TValue, Hash, KeyEqual>& m)
|
|
|
{
|
|
|
return m._size;
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
u32 capacity(const HashMap<TKey, TValue, Hash, KeyEqual>& m)
|
|
|
{
|
|
|
return m._capacity;
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
bool has(const HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key)
|
|
|
{
|
|
|
return hash_map_internal::find(m, key) != hash_map_internal::END_OF_LIST;
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
const TValue& get(const HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key, const TValue& deffault)
|
|
|
{
|
|
|
const u32 i = hash_map_internal::find(m, key);
|
|
|
@@ -244,13 +244,13 @@ namespace hash_map
|
|
|
return m._data[i].second;
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
TValue& get(HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key, const TValue& deffault)
|
|
|
{
|
|
|
return const_cast<TValue&>(hash_map::get((const HashMap<TKey, TValue, Hash, KeyEqual>&)m, key, deffault));
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
void set(HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key, const TValue& value)
|
|
|
{
|
|
|
if (m._capacity == 0)
|
|
|
@@ -271,7 +271,7 @@ namespace hash_map
|
|
|
hash_map_internal::grow(m);
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
void remove(HashMap<TKey, TValue, Hash, KeyEqual>& m, const TKey& key)
|
|
|
{
|
|
|
const u32 i = hash_map_internal::find(m, key);
|
|
|
@@ -283,7 +283,7 @@ namespace hash_map
|
|
|
--m._size;
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
void clear(HashMap<TKey, TValue, Hash, KeyEqual>& m)
|
|
|
{
|
|
|
for (u32 i = 0; i < m._capacity; ++i)
|
|
|
@@ -296,7 +296,7 @@ namespace hash_map
|
|
|
m._size = 0;
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
bool is_hole(const HashMap<TKey, TValue, Hash, KeyEqual>& m, const typename HashMap<TKey, TValue, Hash, KeyEqual>::Entry* entry)
|
|
|
{
|
|
|
const u32 ii = u32(entry - m._data);
|
|
|
@@ -305,13 +305,13 @@ namespace hash_map
|
|
|
return index == hash_map_internal::FREE || hash_map_internal::is_deleted(index);
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
inline const typename HashMap<TKey, TValue, Hash, KeyEqual>::Entry* begin(const HashMap<TKey, TValue, Hash, KeyEqual>& m)
|
|
|
{
|
|
|
return m._data;
|
|
|
}
|
|
|
|
|
|
- template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+ template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
inline const typename HashMap<TKey, TValue, Hash, KeyEqual>::Entry* end(const HashMap<TKey, TValue, Hash, KeyEqual>& m)
|
|
|
{
|
|
|
return m._data + m._capacity;
|
|
|
@@ -319,7 +319,7 @@ namespace hash_map
|
|
|
|
|
|
} // namespace hash_map
|
|
|
|
|
|
-template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
inline HashMap<TKey, TValue, Hash, KeyEqual>::HashMap(Allocator& a)
|
|
|
: _allocator(&a)
|
|
|
, _capacity(0)
|
|
|
@@ -331,7 +331,7 @@ inline HashMap<TKey, TValue, Hash, KeyEqual>::HashMap(Allocator& a)
|
|
|
{
|
|
|
}
|
|
|
|
|
|
-template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
HashMap<TKey, TValue, Hash, KeyEqual>::HashMap(const HashMap<TKey, TValue, Hash, KeyEqual>& other)
|
|
|
: _allocator(other._allocator)
|
|
|
, _capacity(0)
|
|
|
@@ -363,7 +363,7 @@ HashMap<TKey, TValue, Hash, KeyEqual>::HashMap(const HashMap<TKey, TValue, Hash,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
inline HashMap<TKey, TValue, Hash, KeyEqual>::~HashMap()
|
|
|
{
|
|
|
for (u32 i = 0; i < _capacity; ++i)
|
|
|
@@ -375,7 +375,7 @@ inline HashMap<TKey, TValue, Hash, KeyEqual>::~HashMap()
|
|
|
_allocator->deallocate(_buffer);
|
|
|
}
|
|
|
|
|
|
-template <typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
+template<typename TKey, typename TValue, typename Hash, typename KeyEqual>
|
|
|
HashMap<TKey, TValue, Hash, KeyEqual>& HashMap<TKey, TValue, Hash, KeyEqual>::operator=(const HashMap<TKey, TValue, Hash, KeyEqual>& other)
|
|
|
{
|
|
|
_capacity = other._capacity;
|