diff --git a/src/runtime/c/gu/map.c b/src/runtime/c/gu/map.c index 87758b110..477bcef08 100644 --- a/src/runtime/c/gu/map.c +++ b/src/runtime/c/gu/map.c @@ -148,12 +148,10 @@ gu_map_lookup(GuMap* map, const void* key, size_t* idx_out) static void -gu_map_resize(GuMap* map) +gu_map_resize(GuMap* map, size_t req_entries) { GuMapData* data = &map->data; GuMapData old_data = *data; - size_t req_entries = - gu_twin_prime_sup(GU_MAX(11, map->data.n_occupied * 4 / 3 + 1)); size_t key_size = map->key_size; size_t key_alloc = 0; @@ -216,7 +214,9 @@ gu_map_maybe_resize(GuMap* map) { if (map->data.n_entries <= map->data.n_occupied + (map->data.n_occupied / 4)) { - gu_map_resize(map); + size_t req_entries = + gu_twin_prime_sup(GU_MAX(11, map->data.n_occupied * 4 / 3 + 1)); + gu_map_resize(map, req_entries); return true; } return false; @@ -368,6 +368,7 @@ static const uint8_t gu_map_no_values[1] = { 0 }; GuMap* gu_make_map(size_t key_size, GuHasher* hasher, size_t value_size, const void* default_value, + size_t init_size, GuPool* pool) { GuMapData data = { @@ -385,7 +386,8 @@ gu_make_map(size_t key_size, GuHasher* hasher, map->value_size = value_size; map->fin.fn = gu_map_finalize; gu_pool_finally(pool, &map->fin); - gu_map_resize(map); + + init_size = gu_twin_prime_sup(init_size); + gu_map_resize(map, init_size); return map; } - diff --git a/src/runtime/c/gu/map.h b/src/runtime/c/gu/map.h index a1234e99b..50af70572 100644 --- a/src/runtime/c/gu/map.h +++ b/src/runtime/c/gu/map.h @@ -18,16 +18,19 @@ typedef struct GuMap GuMap; GuMap* gu_make_map(size_t key_size, GuHasher* hasher, size_t value_size, const void* default_value, + size_t init_size, GuPool* pool); +#define GU_MAP_DEFAULT_INIT_SIZE 11 + #define gu_new_map(K, HASHER, V, DV, POOL) \ - (gu_make_map(sizeof(K), (HASHER), sizeof(V), (DV), (POOL))) + (gu_make_map(sizeof(K), (HASHER), sizeof(V), (DV), GU_MAP_DEFAULT_INIT_SIZE, (POOL))) #define gu_new_set(K, HASHER, POOL) \ - (gu_make_map(sizeof(K), (HASHER), 0, NULL, (POOL))) + (gu_make_map(sizeof(K), (HASHER), 0, NULL, GU_MAP_DEFAULT_INIT_SIZE, (POOL))) #define gu_new_addr_map(K, V, DV, POOL) \ - (gu_make_map(sizeof(K), gu_addr_hasher, sizeof(V), (DV), (POOL))) + (gu_make_map(sizeof(K), gu_addr_hasher, sizeof(V), (DV), GU_MAP_DEFAULT_INIT_SIZE, (POOL))) size_t gu_map_count(GuMap* map);