diff --git a/include/lfvector.h b/include/lfvector.h index 0c294c8..f215724 100644 --- a/include/lfvector.h +++ b/include/lfvector.h @@ -14,6 +14,8 @@ 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); diff --git a/src/vector.c b/src/vector.c index e84409d..6aa9bdb 100644 --- a/src/vector.c +++ b/src/vector.c @@ -34,7 +34,11 @@ int vec_init_with_capacity(Vector *vec, void (*destroy)(void *data), size_t capa } 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,12 +48,18 @@ 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) { diff --git a/tests/tests.c b/tests/tests.c index 1d5a2a8..fc2533a 100644 --- a/tests/tests.c +++ b/tests/tests.c @@ -268,6 +268,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); }