add vec_clear

This commit is contained in:
Evan Burkey 2025-02-26 15:32:19 -08:00
parent ba6e929b4f
commit 1140486c83
3 changed files with 18 additions and 1 deletions

View File

@ -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); int vec_init_with_capacity(Vector *vec, void (*destroy)(void *data), size_t cap);
void vec_clear(Vector *vec);
void vec_destroy(Vector *vec); void vec_destroy(Vector *vec);
int vec_insert(Vector *vec, void *data, size_t index); int vec_insert(Vector *vec, void *data, size_t index);

View File

@ -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) { 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 *)); vec->elements = reallocarray(vec->elements, vec->capacity, sizeof(void *));
@ -44,12 +48,18 @@ static int vec_grow(Vector *const vec) {
return 0; return 0;
} }
void vec_clear(Vector *vec) {
vec_destroy(vec);
vec_init(vec, vec->destroy);
}
void vec_destroy(Vector *vec) { void vec_destroy(Vector *vec) {
if (vec->destroy) { if (vec->destroy) {
for (size_t i = 0; i < vec_len(vec); ++i) { for (size_t i = 0; i < vec_len(vec); ++i) {
vec->destroy(vec->elements[i]); vec->destroy(vec->elements[i]);
} }
} }
free(vec->elements);
} }
int vec_insert(Vector *vec, void *data, size_t index) { int vec_insert(Vector *vec, void *data, size_t index) {

View File

@ -268,6 +268,11 @@ void test_vector() {
assert(vec_len(v) == vec_cap(v)); assert(vec_len(v) == vec_cap(v));
printf("cap after shrink: %zu\n", 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); vec_destroy(v);
free(v); free(v);
} }