Mercurial
diff dowa/d_memory.c @ 2:8a43dedbe530
[Dowa] Added HashMap and Updated Arena naming.
| author | June Park <parkjune1995@gmail.com> |
|---|---|
| date | Wed, 24 Sep 2025 13:15:32 -0700 |
| parents | adcfad6e86fb |
| children | 2758f5527d2b |
line wrap: on
line diff
--- a/dowa/d_memory.c Wed Sep 24 09:11:20 2025 -0700 +++ b/dowa/d_memory.c Wed Sep 24 13:15:32 2025 -0700 @@ -1,14 +1,21 @@ #include "dowa.h" // --- Arena --- // -void Dowa_ArenaIntialize(PArena p_arena, size_t capacity) +Dowa_PArena Dowa_Arena_Initialize(size_t capacity) { + Dowa_PArena p_arena; p_arena = malloc(capacity); + if (p_arena == NULL) + { + perror("malloc"); + return NULL; + } p_arena->offset = 0; p_arena->capacity = capacity; + return p_arena; } -void *Dowa_ArenaAllocate(PArena p_arena, size_t size) +void *Dowa_Arena_Allocate(Dowa_PArena p_arena, size_t size) { if (p_arena->offset + size > p_arena->capacity) { @@ -19,10 +26,90 @@ return currnet_ptr; } -void Dowa_ArenaFree(PArena p_arena) +void Dowa_Arena_Free(Dowa_PArena p_arena) { if (p_arena) { free(p_arena->buffer); free(p_arena); } } + +// --- HashMap --- // +Dowa_PHashMap Dowa_HashMap_Create(size_t capacity) +{ + Dowa_PHashMap p_hash_map; + p_hash_map = malloc(sizeof(Dowa_HashMap)); + if (p_hash_map == NULL) + { + return NULL; + } + p_hash_map->entries = calloc(capacity, sizeof *p_hash_map->entries); + if (p_hash_map->entries == NULL) + { + free(p_hash_map); + return NULL; + } + p_hash_map->capacity = capacity; + p_hash_map->current_capacity = 0; + return p_hash_map; +} + +int32 Dowa_HashMap_GetPosition(Dowa_PHashMap p_hash_map, char *key) +{ + int32 hash_val = HASH_KEY_NUMBER; + int32 c; + while ((c = *key++)) + { + hash_val = (hash_val << 5) + hash_val + c; + } + return hash_val % p_hash_map->capacity; +} + +void Dowa_HashMap_PushValue(Dowa_PHashMap p_hash_map, char *key, void *value, size_t value_size) +{ + int idx = Dowa_HashMap_GetPosition(p_hash_map, key); + Dowa_PHashEntry entry = p_hash_map->entries[idx]; + if (entry) + { + free(entry->key); + free(entry->buffer); + } + else + { + entry = malloc(sizeof(Dowa_HashEntry)); + if (entry == NULL) + { + perror("malloc"); + return; + } + p_hash_map->entries[idx] = entry; + } + entry->key = strdup(key); + entry->buffer = malloc(value_size); + if (entry->buffer == NULL) + { + perror("malloc"); + return; + } + entry->capacity = value_size; + memcpy(entry->buffer, value, value_size); + p_hash_map->current_capacity++; +} + +void Dowa_HashMap_PopKey(Dowa_PHashMap p_hash_map, char *key) +{ + int idx = Dowa_HashMap_GetPosition(p_hash_map, key); + Dowa_PHashEntry entry = p_hash_map->entries[idx]; + if (entry) + { + free(entry->key); + free(entry->buffer); + free(entry); + } + p_hash_map->entries[idx] = NULL; + if (p_hash_map->current_capacity > 0) + { + p_hash_map->current_capacity--; + } +} +