diff --git a/.clangd/index/array.c.863DEEE048DB568B.idx b/.clangd/index/array.c.863DEEE048DB568B.idx new file mode 100644 index 0000000..0943b50 Binary files /dev/null and b/.clangd/index/array.c.863DEEE048DB568B.idx differ diff --git a/.clangd/index/file.c.AE428882B365CD9B.idx b/.clangd/index/file.c.AE428882B365CD9B.idx new file mode 100644 index 0000000..b84888a Binary files /dev/null and b/.clangd/index/file.c.AE428882B365CD9B.idx differ 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; +}