diff --git a/src/arraylist.c b/src/arraylist.c index 7dde558..224d817 100644 --- a/src/arraylist.c +++ b/src/arraylist.c @@ -188,4 +188,102 @@ ArrayListErr arraylist_insert(ArrayList *arr, size_t index, void *data) { return ARRLIST_OK; } +ArrayListErr arraylist_pop_back(ArrayList *arr, void *out) { + if (arr == NULL) { + return ARRLIST_NULL_ARG; + } + + if (arr->len < 1) { + return ARRLIST_EMPTY; + } + + if (arr->capacity / 4 > arr->len) { + ArrayListErr err = arraylist_shrink(arr); + if (err != ARRLIST_OK) { + return err; + } + } + + if (out != NULL) { + memcpy( + out, + arr->buffer + (arr->len - 1) * arr->elem_size, + arr->elem_size); + } + + arr->len--; + + return ARRLIST_OK; +} + +ArrayListErr arraylist_pop_front(ArrayList *arr, void *out) { + if (arr == NULL) { + return ARRLIST_NULL_ARG; + } + + if (arr->len < 1) { + return ARRLIST_EMPTY; + } + + if (arr->capacity / 4 > arr->len) { + ArrayListErr err = arraylist_shrink(arr); + if (err != ARRLIST_OK) { + return err; + } + } + + if (out != NULL) { + memcpy( + out, + arr->buffer, + arr->elem_size + ); + } + + for (size_t i = 0; i < arr->len; i++) { + memcpy( + arr->buffer + (i * arr->elem_size), + arr->buffer + ((i + 1) * arr->elem_size), + arr->elem_size); + } + + arr->len--; + + return ARRLIST_OK; +} + +ArrayListErr arraylist_remove_at(ArrayList *arr, size_t index, void *out) { + if (arr == NULL) { + return ARRLIST_NULL_ARG; + } + + if (index >= arr->len) { + return ARRLIST_OUT_OF_BOUNDS; + } + + if (arr->len < 1) { + return ARRLIST_OK; + } + + if (out != NULL) { + memcpy( + out, + arr->buffer + (index * arr->elem_size), + arr->elem_size + ); + } + + for (size_t i = index; i < arr->len; i++) { + memcpy( + arr->buffer + (index * arr->elem_size), + arr->buffer + ((i + 1) * arr->elem_size), + arr->elem_size + ); + } + + arr->len--; + + return ARRLIST_OK; +} +