diff options
Diffstat (limited to 'Vector.c')
| -rw-r--r-- | Vector.c | 70 |
1 files changed, 40 insertions, 30 deletions
@@ -2,6 +2,8 @@ #include "Types.h" #include <string.h> +/** Metadata **/ + struct VectorMeta { MemoryManager *mm; usize element_size; @@ -14,6 +16,8 @@ V_metadata(void *arr) { return arr - sizeof(struct VectorMeta); } +/* Create */ + Vector V_new(MemoryManager *mm, usize element_size, usize length) { if (NULL == mm) @@ -37,33 +41,20 @@ V_new(MemoryManager *mm, usize element_size, usize length) { return start + sizeof(vm); } -usize -V_length(Vector arr) { - if (NULL == arr) - return 0; - return V_metadata(arr)->length; -} +/* Free */ -usize -V_count(Vector arr) { - if (NULL == arr) - return 0; - return V_metadata(arr)->count; -} - -void* -V_top(Vector arr) { - if (NULL == arr) - return NULL; - - struct VectorMeta *vm = V_metadata(arr); - - if (0 == vm->count) - return NULL; +Result +V_free(Vector *arr) { + if (NULL == arr || NULL == *arr) + return R_NullArgument; - return arr + (vm->count - 1) * vm->element_size; + struct VectorMeta *vm = V_metadata(*arr); + *arr = vm; + return vm->mm->free(*vm->mm, arr); } +/* Modify */ + Result V_push(Vector *arr, void *pvalue) { if (NULL == arr || NULL == *arr) @@ -106,12 +97,31 @@ V_pop(Vector *arr) { return R_Ok; } -Result -V_free(Vector *arr) { - if (NULL == arr || NULL == *arr) - return R_NullArgument; +/* Get */ - struct VectorMeta *vm = V_metadata(*arr); - *arr = vm; - return vm->mm->free(*vm->mm, arr); +usize +V_length(Vector arr) { + if (NULL == arr) + return 0; + return V_metadata(arr)->length; +} + +usize +V_count(Vector arr) { + if (NULL == arr) + return 0; + return V_metadata(arr)->count; +} + +void* +V_top(Vector arr) { + if (NULL == arr) + return NULL; + + struct VectorMeta *vm = V_metadata(arr); + + if (0 == vm->count) + return NULL; + + return arr + (vm->count - 1) * vm->element_size; } |
