comparison 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
comparison
equal deleted inserted replaced
1:adcfad6e86fb 2:8a43dedbe530
1 #include "dowa.h" 1 #include "dowa.h"
2 2
3 // --- Arena --- // 3 // --- Arena --- //
4 void Dowa_ArenaIntialize(PArena p_arena, size_t capacity) 4 Dowa_PArena Dowa_Arena_Initialize(size_t capacity)
5 { 5 {
6 Dowa_PArena p_arena;
6 p_arena = malloc(capacity); 7 p_arena = malloc(capacity);
8 if (p_arena == NULL)
9 {
10 perror("malloc");
11 return NULL;
12 }
7 p_arena->offset = 0; 13 p_arena->offset = 0;
8 p_arena->capacity = capacity; 14 p_arena->capacity = capacity;
15 return p_arena;
9 } 16 }
10 17
11 void *Dowa_ArenaAllocate(PArena p_arena, size_t size) 18 void *Dowa_Arena_Allocate(Dowa_PArena p_arena, size_t size)
12 { 19 {
13 if (p_arena->offset + size > p_arena->capacity) 20 if (p_arena->offset + size > p_arena->capacity)
14 { 21 {
15 return NULL; 22 return NULL;
16 } 23 }
17 void *currnet_ptr = p_arena->buffer + p_arena->offset; 24 void *currnet_ptr = p_arena->buffer + p_arena->offset;
18 p_arena->offset += size; 25 p_arena->offset += size;
19 return currnet_ptr; 26 return currnet_ptr;
20 } 27 }
21 28
22 void Dowa_ArenaFree(PArena p_arena) 29 void Dowa_Arena_Free(Dowa_PArena p_arena)
23 { 30 {
24 if (p_arena) { 31 if (p_arena) {
25 free(p_arena->buffer); 32 free(p_arena->buffer);
26 free(p_arena); 33 free(p_arena);
27 } 34 }
28 } 35 }
36
37 // --- HashMap --- //
38 Dowa_PHashMap Dowa_HashMap_Create(size_t capacity)
39 {
40 Dowa_PHashMap p_hash_map;
41 p_hash_map = malloc(sizeof(Dowa_HashMap));
42 if (p_hash_map == NULL)
43 {
44 return NULL;
45 }
46 p_hash_map->entries = calloc(capacity, sizeof *p_hash_map->entries);
47 if (p_hash_map->entries == NULL)
48 {
49 free(p_hash_map);
50 return NULL;
51 }
52 p_hash_map->capacity = capacity;
53 p_hash_map->current_capacity = 0;
54 return p_hash_map;
55 }
56
57 int32 Dowa_HashMap_GetPosition(Dowa_PHashMap p_hash_map, char *key)
58 {
59 int32 hash_val = HASH_KEY_NUMBER;
60 int32 c;
61 while ((c = *key++))
62 {
63 hash_val = (hash_val << 5) + hash_val + c;
64 }
65 return hash_val % p_hash_map->capacity;
66 }
67
68 void Dowa_HashMap_PushValue(Dowa_PHashMap p_hash_map, char *key, void *value, size_t value_size)
69 {
70 int idx = Dowa_HashMap_GetPosition(p_hash_map, key);
71 Dowa_PHashEntry entry = p_hash_map->entries[idx];
72 if (entry)
73 {
74 free(entry->key);
75 free(entry->buffer);
76 }
77 else
78 {
79 entry = malloc(sizeof(Dowa_HashEntry));
80 if (entry == NULL)
81 {
82 perror("malloc");
83 return;
84 }
85 p_hash_map->entries[idx] = entry;
86 }
87 entry->key = strdup(key);
88 entry->buffer = malloc(value_size);
89 if (entry->buffer == NULL)
90 {
91 perror("malloc");
92 return;
93 }
94 entry->capacity = value_size;
95 memcpy(entry->buffer, value, value_size);
96 p_hash_map->current_capacity++;
97 }
98
99 void Dowa_HashMap_PopKey(Dowa_PHashMap p_hash_map, char *key)
100 {
101 int idx = Dowa_HashMap_GetPosition(p_hash_map, key);
102 Dowa_PHashEntry entry = p_hash_map->entries[idx];
103 if (entry)
104 {
105 free(entry->key);
106 free(entry->buffer);
107 free(entry);
108 }
109 p_hash_map->entries[idx] = NULL;
110 if (p_hash_map->current_capacity > 0)
111 {
112 p_hash_map->current_capacity--;
113 }
114 }
115