From a367d3b6dc6c9d78fb58e73d0a1bf6da85953521 Mon Sep 17 00:00:00 2001 From: MrGeorgen Date: Tue, 21 Jul 2020 21:31:31 +0200 Subject: [PATCH] added remove and free array functions --- .gitignore | 1 + include/acl/array.h | 3 +++ src/array.c | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/.gitignore b/.gitignore index 36a61b4..e026c1c 100644 --- a/.gitignore +++ b/.gitignore @@ -67,3 +67,4 @@ _deps # ---> Extra vgcore.* src/main.c +.clangd diff --git a/include/acl/array.h b/include/acl/array.h index 523f524..ebe7354 100644 --- a/include/acl/array.h +++ b/include/acl/array.h @@ -1,5 +1,8 @@ #ifndef array_h #define array_h +#include +void acl_arraylist_free(void *arraylist); +void* acl_arraylist_remove(void *arraylist_void, size_t index); void* acl_arraylist_create(size_t array_size, size_t sizeof_one_element); void* acl_arraylist_append(void *arraylist_void, void *element_void); #endif diff --git a/src/array.c b/src/array.c index e600969..20b193e 100644 --- a/src/array.c +++ b/src/array.c @@ -30,8 +30,27 @@ void* acl_arraylist_append(void *arraylist_void, void *element) { if(arraylist->len == arraylist->cap) { arraylist->cap = arraylist->len + 10; arraylist = realloc(arraylist, arraylist->cap * arraylist->sizeof_one_element + sizeof *arraylist); + if(!arraylist) return NULL; } memcpy((char*)(arraylist + 1) + arraylist->sizeof_one_element * arraylist->len, element, arraylist->sizeof_one_element); ++arraylist->len; return arraylist+1; } + +void acl_arraylist_free(void *arraylist) { + free((union arraylist_meta*)arraylist-1); +} + +void* acl_arraylist_remove(void *arraylist_void, size_t index) { + union arraylist_meta *arraylist = (union arraylist_meta*)arraylist_void - 1; + char *arraylist_char = arraylist_void; + if(index != arraylist->len - 1) { + memcpy(arraylist_char + arraylist->sizeof_one_element * index, arraylist_char + arraylist->sizeof_one_element * (arraylist->len - 1), arraylist->sizeof_one_element); + } + --arraylist->len; + if(arraylist->len < arraylist->cap - 10) { + arraylist->cap = arraylist->len; + arraylist = realloc(arraylist, arraylist->cap * arraylist->sizeof_one_element + sizeof *arraylist); + } + return arraylist; +}