From dafaa5b87e67753dc5e5d97219906e24475f6194 Mon Sep 17 00:00:00 2001 From: laentropia Date: Tue, 21 Apr 2026 09:10:53 -0600 Subject: [PATCH] fix: fixed problems with init and destroy slice --- src/arraylist.c | 5 +++++ test/test_arraylist.c | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/arraylist.c b/src/arraylist.c index e517f7b..e986ff5 100644 --- a/src/arraylist.c +++ b/src/arraylist.c @@ -46,6 +46,7 @@ ArrayList *arraylist_init(size_t capacity, size_t elem_size) { arr->capacity = capacity; arr->elem_size = elem_size; arr->len = 0; + arr->borrows = 0; arr->buffer = malloc(capacity * elem_size); if (arr->buffer == NULL) { free(arr); @@ -496,6 +497,10 @@ ArrayListErr arrayslice_destroy(ArraySlice **slice) { return ARRLIST_NULL_ARG; } + if ((*slice)->is_safe) { + (*slice)->arr->borrows--; + } + free(*slice); *slice = NULL; diff --git a/test/test_arraylist.c b/test/test_arraylist.c index 42942fb..f12acc6 100644 --- a/test/test_arraylist.c +++ b/test/test_arraylist.c @@ -1014,6 +1014,24 @@ static void test_reserve_size_0(void **state) { arraylist_destroy(&arr); } +// Slice creation +static void test_slice_valid_init(void **state) { + (void) state; + + ArrayList *arr = arraylist_init(64, sizeof(int)); + assert_non_null(arr); + + for (size_t i = 0; i < 10; i++) { + assert_uint_equal(arraylist_push_back(arr, &i), ARRLIST_OK); + } + + ArraySlice *slice = arraylist_slice(arr, 0, 10); + assert_non_null(slice); + + arrayslice_destroy(&slice); + arraylist_destroy(&arr); +} + int main(void) { const struct CMUnitTest init[] = { cmocka_unit_test(test_init_valid_parameters), @@ -1125,6 +1143,10 @@ int main(void) { cmocka_unit_test(test_reserve_size_max), }; + const struct CMUnitTest slice_init[] = { + cmocka_unit_test(test_slice_valid_init), + }; + int rc = 0; rc += cmocka_run_group_tests(init, NULL, NULL); @@ -1142,5 +1164,7 @@ int main(void) { rc += cmocka_run_group_tests(resize, NULL, NULL); rc += cmocka_run_group_tests(reserve, NULL, NULL); + rc += cmocka_run_group_tests(slice_init, NULL, NULL); + return rc; }