diff --git a/include/lfvector.h b/include/lfvector.h index 0c294c8..035d9b4 100644 --- a/include/lfvector.h +++ b/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); diff --git a/src/vector.c b/src/vector.c index e84409d..17d4bca 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,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)); } diff --git a/tests/tests.c b/tests/tests.c index 1d5a2a8..60d4170 100644 --- a/tests/tests.c +++ b/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); }