From 6089de7e4be455424ea5f3606d0e3bce61ff3687 Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Sun, 17 Apr 2022 20:43:47 +0300 Subject: [PATCH] array 2 --- array.c | 25 ++++++++++++++++--------- array.h | 9 ++++----- cutil.c | 2 +- cutil.h | 2 +- 4 files changed, 22 insertions(+), 16 deletions(-) diff --git a/array.c b/array.c index 7257f3f..773feb9 100644 --- a/array.c +++ b/array.c @@ -1,26 +1,33 @@ #include "array.h" #include "cutil.h" -array_t* array_create(uint size, uint align, uint reserve) +void array_init(array_t* array, uint size, uint align, uint reserve) { uint capacity = reserve ? (reserve / align + !!(reserve % align)) * align : align; - array_t* array = (array_t*)cu_malloc(CU_ARRAY_HEAD_SIZE + capacity*size); - if (!array) return NULL; - array->size = size; array->count = 0; array->align = align; - return array; + array_alloc(array, capacity); } -void array_delete(array_t* array) +void array_alloc(array_t* array, uint newCount) { - cu_free(array); + size_t size = newCount*array->size; + if (array->count) array->mem = cu_realloc(array->mem, size); + else array->mem = cu_malloc(size); + array->count = array->mem ? newCount : 0; } -void* array_push(array_t* array, const void* data) +void array_clear(array_t* array) { - + if (array->count) + { + cu_free(array->mem); + array->mem = NULL; + array->count = 0; + } + array->size = 0; + array->align = 0; } diff --git a/array.h b/array.h index 6a7a055..07d7fa0 100644 --- a/array.h +++ b/array.h @@ -4,16 +4,15 @@ #include "cutypes.h" typedef struct { + void* mem; uint size; uint count; uint align; - uint8_t data[1]; } array_t; -#define CU_ARRAY_HEAD_SIZE (sizeof(uint) * 3) - -array_t* array_create(uint size, uint align, uint reserve); -void array_delete(array_t* array); +void array_init(array_t* array, uint size, uint align, uint reserve); +void array_alloc(array_t* array, uint newCount); +void array_clear(array_t* array); void* array_push(array_t* array, const void* data); diff --git a/cutil.c b/cutil.c index b5cd90e..eaf8578 100644 --- a/cutil.c +++ b/cutil.c @@ -1,5 +1,5 @@ #include "cutil.h" void* (*cu_malloc)(size_t) = CUTIL_MALLOC; -void* (*cu_relloac)(void*, size_t) = CUTIL_REALLOC; +void* (*cu_realloc)(void*, size_t) = CUTIL_REALLOC; void* (*cu_free)(void*) = CUTIL_FREE; diff --git a/cutil.h b/cutil.h index 0eff4f2..73df12e 100644 --- a/cutil.h +++ b/cutil.h @@ -9,7 +9,7 @@ #define CUTIL_FREE free extern void* (*cu_malloc)(size_t); -extern void* (*cu_relloac)(void*, size_t); +extern void* (*cu_realloc)(void*, size_t); extern void* (*cu_free)(void*); #endif \ No newline at end of file