diff --git a/include/arraylist.h b/include/arraylist.h index d60aeaa..a22f97e 100644 --- a/include/arraylist.h +++ b/include/arraylist.h @@ -25,7 +25,7 @@ typedef enum { ArrayList *arraylist_init(size_t capacity, size_t elem_size); ArrayListErr arraylist_destroy(ArrayList **arr); ArrayListErr arraylist_clear(ArrayList *arr); -ArrayList *arraylist_copy(const ArrayList *arr); +ArrayList *arraylist_clone(const ArrayList *arr); size_t arraylist_size(const ArrayList *arr); size_t arraylist_capacity(const ArrayList *arr); diff --git a/src/arraylist.c b/src/arraylist.c index a147a0e..335605c 100644 --- a/src/arraylist.c +++ b/src/arraylist.c @@ -577,3 +577,29 @@ ArrayListErr arrayslice_advance(ArraySlice *slice, size_t n) { return ARRLIST_OK; } + +ArrayList *arrayslice_to_arraylist(const ArraySlice *slice) { + if (slice == NULL) { + return NULL; + } + + if (slice->current >= slice->end) { + return NULL; + } + + ArrayList *new_arr = arraylist_init( + arraylist_capacity(slice->arr), + slice->arr->elem_size); + + if (new_arr == NULL) { + return NULL; + } + + memcpy( + new_arr->buffer, + slice->arr->buffer + (slice->start * slice->arr->elem_size), + slice->arr->elem_size * (slice->end - slice->current) + ); + + return new_arr; +}