diff options
| author | Syndamia <kamen@syndamia.com> | 2026-04-28 14:06:44 +0300 |
|---|---|---|
| committer | Syndamia <kamen@syndamia.com> | 2026-05-12 07:08:56 +0300 |
| commit | 0d249b1d47a7f84cfe5f09ad070d1affd26566da (patch) | |
| tree | f395f67eecb27daea3fc4a9ad8e59bf40f988984 /Array.c | |
| parent | 5c36b582ad60a569ed996fe188ed92ef6bd7fc5f (diff) | |
| download | foollib-0d249b1d47a7f84cfe5f09ad070d1affd26566da.tar foollib-0d249b1d47a7f84cfe5f09ad070d1affd26566da.tar.gz foollib-0d249b1d47a7f84cfe5f09ad070d1affd26566da.zip | |
feat!: Refactor using MemoryManager
The idea is to provide a universal memory management "API", through
which you allocate and deallocate. This allows our implementations (for
String and Vector) to be more generic.
It does also allow usage of different allocators depending on situation.
Diffstat (limited to 'Array.c')
| -rw-r--r-- | Array.c | 97 |
1 files changed, 0 insertions, 97 deletions
diff --git a/Array.c b/Array.c deleted file mode 100644 index 6be8c1a..0000000 --- a/Array.c +++ /dev/null @@ -1,97 +0,0 @@ -#include "Array.h" -#include "Types.h" -#include "GlobalArena.h" -#include <stdlib.h> -#include <string.h> - -struct ArrayMeta { - BumpArena b; - usize element_size; - usize count; - usize length; -}; - -static inline struct ArrayMeta* -A_metadata(void* arr) { - return arr - sizeof(struct ArrayMeta); -} - -typedef void* Array; - -Array -A_new(BumpArena b, usize element_size, usize length) { - if (NULL == b) - return NULL; - - struct ArrayMeta am = { - .b = b, - .element_size = element_size, - .count = 0, - .length = length, - }; - - void* start = B_alloc(b, sizeof(am) + element_size * length); - if (NULL == start) - return NULL; - - memcpy(start, &am, sizeof(am)); - return start + sizeof(am); -} - -usize -A_length(Array arr) { - if (NULL == arr) - return 0; - return A_metadata(arr)->length; -} - -usize -A_count(Array arr) { - if (NULL == arr) - return 0; - return A_metadata(arr)->count; -} - -Result -A_push(Array arr, void *value) { - if (NULL == arr) - return R_Uninitialized; - - struct ArrayMeta *am = A_metadata(arr); - - if (am->count >= am->length) { - if (!B_resizeable(am->b, arr)) - return R_OutOfBounds; - - RETURN_NOTOK(B_resize(am->b, sizeof(*am) + am->element_size * (am->length << 1))); - am->length <<= 1; - } - - memcpy(arr + am->count++ * am->element_size, value, am->element_size); - - return R_Ok; -} - -Result -A_ppush(Array arr, void *pvalue) { - void* temp = pvalue; - return A_push(arr, &temp); -} - -void* -A_pop(Array arr) { - if (NULL == arr) - return NULL; - - struct ArrayMeta *am = A_metadata(arr); - - if (am->count == 0) - return NULL; - - return arr + am->element_size * --am->count; -} - -Array -AG_new(usize element_size, usize length) { - return A_new(g_arena, element_size, length); -} |
