diff --git a/src/array.c b/src/array.c index 1b75ceb..a86cbb5 100644 --- a/src/array.c +++ b/src/array.c @@ -5,6 +5,15 @@ #include size_t acl_arraylist_len(void *arraylist); + +static inline void* acl_arraylist_resize(union acl_arraylist_meta *arraylist, int64_t relativLen) { + size_t cap = arraylist->cap + relativLen; + arraylist = realloc(arraylist, cap * arraylist->sizeof_one_element + sizeof *arraylist); + if(arraylist != NULL) { + arraylist->cap = cap; + } + return arraylist; +} void* acl_arraylist_create(size_t array_size, size_t sizeof_one_element) { union acl_arraylist_meta *arraylist_new = malloc(array_size * sizeof_one_element + sizeof*arraylist_new); if(arraylist_new == NULL) return NULL; @@ -26,9 +35,7 @@ void* acl_arraylist_append_ptr(void *arraylist_void, void **append_element) { union acl_arraylist_meta *arraylist = arraylist_void; --arraylist; if(arraylist->len == arraylist->cap) { - if(arraylist->len > 10) arraylist->cap = arraylist->len + 10; - else arraylist->cap = arraylist->len * 2 + 1; - arraylist = realloc(arraylist, arraylist->cap * arraylist->sizeof_one_element + sizeof *arraylist); + acl_arraylist_resize(arraylist, 10); if(arraylist == NULL) return NULL; } *append_element = (char*)(arraylist + 1) + arraylist->sizeof_one_element * arraylist->len; @@ -47,9 +54,9 @@ void* acl_arraylist_remove(void *arraylist_void, size_t index) { 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); + if(arraylist->len < arraylist->cap - 20) { + void* arraylistTmp = acl_arraylist_resize(arraylist, -10); + if(arraylistTmp != NULL) arraylist = arraylistTmp; } - return arraylist; + return arraylist + 1; }