Browse Source

Grow maps exponentially instead of linearly

master
Ian Piumarta 4 years ago
parent
commit
ce8ac5975f
1 changed files with 4 additions and 2 deletions
  1. +4
    -2
      object.c

+ 4
- 2
object.c View File

@ -373,7 +373,8 @@ oop map_get(oop map, oop key)
return get(map, Map, elements)[pos].value; return get(map, Map, elements)[pos].value;
} }
#define MAP_CHUNK_SIZE 8
#define MAP_MIN_SIZE 4
#define MAP_GROW_SIZE 2
oop map_insert(oop map, oop key, oop value, size_t pos) oop map_insert(oop map, oop key, oop value, size_t pos)
{ {
@ -387,7 +388,8 @@ oop map_insert(oop map, oop key, oop value, size_t pos)
// check capacity and expand if needed // check capacity and expand if needed
if (map_size(map) >= get(map, Map, capacity)) { if (map_size(map) >= get(map, Map, capacity)) {
size_t newCapacity = get(map, Map, capacity) + MAP_CHUNK_SIZE;
size_t newCapacity = get(map, Map, capacity) * MAP_GROW_SIZE;
if (newCapacity < MAP_MIN_SIZE) newCapacity= MAP_MIN_SIZE;
set(map, Map, elements, realloc(get(map, Map, elements), sizeof(struct Pair) * newCapacity)); set(map, Map, elements, realloc(get(map, Map, elements), sizeof(struct Pair) * newCapacity));
set(map, Map, capacity, newCapacity); set(map, Map, capacity, newCapacity);
} }

Loading…
Cancel
Save