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;
|
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