prevent unnecessary rehashing at expansion
This commit is contained in:
@@ -1,2 +1,3 @@
|
|||||||
/bin/*
|
/bin/*
|
||||||
*.report
|
*.report
|
||||||
|
/ftb
|
||||||
|
|||||||
+12
-9
@@ -6,12 +6,12 @@
|
|||||||
#include "types.hpp"
|
#include "types.hpp"
|
||||||
|
|
||||||
#define for_hash_map(hm) \
|
#define for_hash_map(hm) \
|
||||||
if (decltype(hm.data[0].original) key = 0); else \
|
if (decltype((hm).data[0].original) key = 0); else \
|
||||||
if (decltype(hm.data[0].object) value = 0); else \
|
if (decltype((hm).data[0].object) value = 0); else \
|
||||||
for(int index = 0; index < hm.current_capacity; ++index) \
|
for(int index = 0; index < (hm).current_capacity; ++index) \
|
||||||
if (!((!hm.data[index].deleted) && \
|
if (!((!(hm).data[index].deleted) && \
|
||||||
(key = hm.data[index].original) && \
|
(key = (hm).data[index].original) && \
|
||||||
(value = hm.data[index].object))); else
|
(value = (hm).data[index].object))); else
|
||||||
|
|
||||||
template <typename key_type, typename value_type>
|
template <typename key_type, typename value_type>
|
||||||
struct Hash_Map {
|
struct Hash_Map {
|
||||||
@@ -100,8 +100,7 @@ struct Hash_Map {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_object(key_type key, value_type obj) {
|
void set_object(key_type key, value_type obj, u64 hash_val) {
|
||||||
u64 hash_val = hm_hash((key_type)key);
|
|
||||||
int index = hash_val % current_capacity;
|
int index = hash_val % current_capacity;
|
||||||
|
|
||||||
/* if we the desired cell is just empty, write to it and done :) */
|
/* if we the desired cell is just empty, write to it and done :) */
|
||||||
@@ -125,7 +124,7 @@ struct Hash_Map {
|
|||||||
for (int i = 0; i < current_capacity/4; ++i) {
|
for (int i = 0; i < current_capacity/4; ++i) {
|
||||||
auto cell = old_data[i];
|
auto cell = old_data[i];
|
||||||
if (cell.original) {
|
if (cell.original) {
|
||||||
set_object(cell.original, cell.object);
|
set_object(cell.original, cell.object, cell.hash);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(old_data);
|
free(old_data);
|
||||||
@@ -159,5 +158,9 @@ struct Hash_Map {
|
|||||||
data[index].hash = hash_val;
|
data[index].hash = hash_val;
|
||||||
data[index].object = obj;
|
data[index].object = obj;
|
||||||
}
|
}
|
||||||
|
void set_object(key_type key, value_type obj) {
|
||||||
|
u64 hash_val = hm_hash((key_type)key);
|
||||||
|
set_object(key, obj, hash_val);
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user