From bda7315a22b273b72c4c086d0a69096b9fd8ad1a Mon Sep 17 00:00:00 2001 From: mykola2312 <49044616+mykola2312@users.noreply.github.com> Date: Sun, 17 Apr 2022 21:31:08 +0300 Subject: [PATCH] array 5 + tests --- CMakeLists.txt | 2 ++ array.c | 37 +++++++++++++++++++++++-------------- array.h | 7 ++++++- cutil.c | 2 +- test.c | 27 ++++++++++++++++++++++++++- 5 files changed, 58 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c124fff..8ad0620 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,11 +5,13 @@ set(HEADERS cutypes.h cutil.h list.h + array.h ) set(SOURCES cutil.c list.c + array.c ) add_library(cutil STATIC ${SOURCES} ${HEADERS}) diff --git a/array.c b/array.c index 737db67..c41777b 100644 --- a/array.c +++ b/array.c @@ -9,14 +9,6 @@ void array_init(array_t* array, uint size, uint align) array->align = align; } -void array_alloc(array_t* array, uint newCount) -{ - 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_clear(array_t* array) { if (array->count) @@ -29,20 +21,37 @@ void array_clear(array_t* array) array->align = 0; } -static uint array_align(array_t* array, uint count) +uint array_align(array_t* array, uint count) { return (count / array->align + !!(count % array->align)) * array->align; } +void array_resize(array_t* array, uint newCount) +{ + if (array->count % array->align) + { + array->count = newCount; + } + else + { + size_t size = array_align(array, 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) { - if (!(array->count % array->align)) - array_alloc(array, array->count + 1); - else array->count++; + array_resize(array, array->count + 1); cu_memcpy(array_last(array), data, array->size); } void array_pop(array_t* array, void* src) { - -} \ No newline at end of file + if (array->count) + { + if (src) cu_memcpy(src, array_last(array), array->size); + array_resize(array, array->count - 1); + } +} diff --git a/array.h b/array.h index 41d8800..25e3f8e 100644 --- a/array.h +++ b/array.h @@ -11,13 +11,18 @@ typedef struct { } array_t; void array_init(array_t* array, uint size, uint align); -void array_alloc(array_t* array, uint newCount); void array_clear(array_t* array); #define array_at(array, i) ((uint8_t*)(array)->mem + (i)*(array)->size) #define array_first(array) array_at(array, 0) #define array_last(array) array_at(array, (array)->count - 1) +uint array_align(array_t* array, uint count); +void array_resize(array_t* array, uint newCount); + +#define CU_ARRAY_FOREACH(array) \ + for (uint i = 0; i < (array)->count; i++) + void array_push(array_t* array, const void* data); void array_pop(array_t* array, void* src); diff --git a/cutil.c b/cutil.c index 5fc7e0d..fc20da0 100644 --- a/cutil.c +++ b/cutil.c @@ -3,7 +3,7 @@ void* (*cu_malloc)(size_t) = CUTIL_MALLOC; void* (*cu_realloc)(void*, size_t) = CUTIL_REALLOC; -void* (*cu_free)(void*) = CUTIL_FREE; +void (*cu_free)(void*) = CUTIL_FREE; void* (*cu_memset)(void*,int,size_t) = CUTIL_MEMSET; void* (*cu_memcpy)(void*,const void*,size_t) = CUTIL_MEMCPY; void* (*cu_memmove)(void*,const void*,size_t) = CUTIL_MEMMOVE; diff --git a/test.c b/test.c index 8139ff8..f085286 100644 --- a/test.c +++ b/test.c @@ -2,12 +2,14 @@ #include #include #include "list.h" +#include "array.h" int main() { + printf("[list]\n"); list_t list; list_init(&list); - + srand(time(NULL)); for (uint i = 0; i < 5; i++) { @@ -23,5 +25,28 @@ int main() } list_clear(&list); + + printf("[array]\n"); + array_t array; + array_init(&array, sizeof(uint), 2); + printf("%p\t%d\t%d\t%d\n", array.mem, + array.size, array.count, array.align); + + for (uint i = 0; i < 5; i++) + { + uint num = i; + array_push(&array, &i); + } + array_pop(&array, NULL); + + CU_ARRAY_FOREACH(&array) + { + uint8_t* ptr = array_at(&array, i); + printf("%p\t%d\n", ptr, *(uint*)ptr); + } + + printf("%p\t%d\t%d\t%d\n", array.mem, + array.size, array.count, array.align); + array_clear(&array); return 0; } \ No newline at end of file