addition: added pop_back, remove_at, pop_front
Same thing as with addtition, not tested and decided O(n)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user