diff options
Diffstat (limited to 'Array.c')
| -rw-r--r-- | Array.c | 32 |
1 files changed, 19 insertions, 13 deletions
@@ -1,5 +1,6 @@ #include "Array.h" #include "Types.h" +#include "GlobalArena.h" #include <stdlib.h> #include <string.h> @@ -11,14 +12,14 @@ struct ArrayMeta { }; static inline struct ArrayMeta* -Array_metadata(void* arr) { +A_metadata(void* arr) { return arr - sizeof(struct ArrayMeta); } typedef void* Array; Array -Array_new(BumpArena b, usize element_size, usize length) { +A_new(BumpArena b, usize element_size, usize length) { if (NULL == b) return NULL; @@ -29,36 +30,36 @@ Array_new(BumpArena b, usize element_size, usize length) { .length = length, }; - void* start = Balloc(b, sizeof(am) + element_size * length); + void* start = B_alloc(b, sizeof(am) + element_size * length); memcpy(start, &am, sizeof(am)); return start + sizeof(am); } usize -Array_length(Array arr) { +A_length(Array arr) { if (NULL == arr) return 0; - return Array_metadata(arr)->length; + return A_metadata(arr)->length; } usize -Array_count(Array arr) { +A_count(Array arr) { if (NULL == arr) return 0; - return Array_metadata(arr)->count; + return A_metadata(arr)->count; } Result -Array_push(Array arr, void *value) { +A_push(Array arr, void *value) { if (NULL == arr) return R_Uninitialized; - struct ArrayMeta *am = Array_metadata(arr); + struct ArrayMeta *am = A_metadata(arr); if (am->count >= am->length) { - if (!Bresizeable(am->b, arr)) + if (!B_resizeable(am->b, arr)) abort(); - Bresize(am->b, sizeof(*am) + am->element_size * (am->length <<= 2)); + B_resize(am->b, sizeof(*am) + am->element_size * (am->length <<= 2)); } memcpy(arr + am->count++ * am->element_size, value, am->element_size); @@ -67,14 +68,19 @@ Array_push(Array arr, void *value) { } void* -Array_pop(Array arr) { +A_pop(Array arr) { if (NULL == arr) return NULL; - struct ArrayMeta *am = Array_metadata(arr); + 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); +} |
