commit f9a9f82a95d72752ea895c8bc54dc298245d3b1b from: Evan Burkey date: Wed Feb 26 23:42:14 2025 UTC add vec_clear commit - ba6e929b4fdd5b7cbe51633bcb2930ad1e24f5b6 commit + f9a9f82a95d72752ea895c8bc54dc298245d3b1b blob - 0c294c83921366234fafaa1e5f491b0c23a019ac blob + 035d9b436d9a436942bc0ecabb701d9106edfec2 --- include/lfvector.h +++ include/lfvector.h @@ -14,11 +14,13 @@ int vec_init(Vector *vec, void (*destroy)(void *data)) int vec_init_with_capacity(Vector *vec, void (*destroy)(void *data), size_t cap); +void vec_clear(Vector *vec); + void vec_destroy(Vector *vec); int vec_insert(Vector *vec, void *data, size_t index); -int vec_push(Vector *vec, void *data, size_t *index); +int vec_push(Vector *vec, void *data); void *vec_safe_at(Vector *vec, size_t index); blob - e84409dae5f661ec126aa214fccff1c5b8cda779 blob + 17d4bcae8428a89a7c4fc280932b330f3fee5298 --- src/vector.c +++ src/vector.c @@ -34,7 +34,11 @@ int vec_init_with_capacity(Vector *vec, void (*destroy } static int vec_grow(Vector *const vec) { - vec->capacity *= 2; + if (vec->capacity == 0) { + vec->capacity = 1; + } else { + vec->capacity *= 2; + } vec->elements = reallocarray(vec->elements, vec->capacity, sizeof(void *)); @@ -44,15 +48,25 @@ static int vec_grow(Vector *const vec) { return 0; } +void vec_clear(Vector *vec) { + vec_destroy(vec); + vec_init(vec, vec->destroy); +} + void vec_destroy(Vector *vec) { if (vec->destroy) { for (size_t i = 0; i < vec_len(vec); ++i) { vec->destroy(vec->elements[i]); } } + free(vec->elements); } int vec_insert(Vector *vec, void *data, size_t index) { + if (index > vec_len(vec)) { + return -1; + } + if (vec_len(vec) + 1 >= vec->capacity) { if (vec_grow(vec) != 0) { return -1; @@ -81,10 +95,7 @@ int vec_insert(Vector *vec, void *data, size_t index) return 0; } -int vec_push(Vector *vec, void *data, size_t *index) { - if (index != NULL) { - *index = vec_len(vec); - } +int vec_push(Vector *vec, void *data) { return vec_insert(vec, data, vec_len(vec)); } blob - 1d5a2a85f9be3249038b1b367c7dd3e4a2c65ee0 blob + 60d41701ca383637df5dc1ca709bcbfb86533839 --- tests/tests.c +++ tests/tests.c @@ -220,15 +220,13 @@ void test_vector() { int e3 = 3; int e4 = 4; - size_t idx = 0; - vec_push(v, &e0, &idx); - assert(idx == 0); + vec_push(v, &e0); assert(v->length == 1); - int *t = (int *) vec_at(v, 0); + int *t = vec_at(v, 0); assert(*t == 0); - vec_push(v, &e1, NULL); - vec_push(v, &e2, NULL); + vec_push(v, &e1); + vec_push(v, &e2); assert(v->length == 3); // test access outside bounds @@ -237,14 +235,14 @@ void test_vector() { printf("Before insert: "); print_vector(v); - vec_push(v, &e4, NULL); - vec_insert(v, &e3, 3); + vec_push(v, &e3); + vec_insert(v, &e4, 1); printf("After insert: "); print_vector(v); - t = (int *) vec_at(v, 3); - assert(*t == e3); t = (int *) vec_at(v, 4); + assert(*t == e3); + t = (int *) vec_at(v, 1); assert(*t == e4); const int *min = vec_min(v, vec_cmp_int); @@ -256,7 +254,7 @@ void test_vector() { t = (int *) vec_remove(v, 1); assert(t != NULL); - assert(*t == 1); + assert(*t == 4); printf("After removal: "); print_vector(v); @@ -268,6 +266,11 @@ void test_vector() { assert(vec_len(v) == vec_cap(v)); printf("cap after shrink: %zu\n", vec_cap(v)); + vec_clear(v); + assert(vec_len(v) == 0); + printf("\ncap after clear: %zu\n", vec_cap(v)); + printf("len after clear: %zu\n", vec_len(v)); + vec_destroy(v); free(v); }