diff --git a/include/lfvector.h b/include/lfvector.h index 035d9b4..aa3d3a9 100644 --- a/include/lfvector.h +++ b/include/lfvector.h @@ -18,6 +18,8 @@ void vec_clear(Vector *vec); void vec_destroy(Vector *vec); +int vec_grow_to(Vector *vec, const size_t new_cap); + int vec_insert(Vector *vec, void *data, size_t index); int vec_push(Vector *vec, void *data); diff --git a/src/vector.c b/src/vector.c index 17d4bca..83da588 100644 --- a/src/vector.c +++ b/src/vector.c @@ -33,14 +33,9 @@ int vec_init_with_capacity(Vector *vec, void (*destroy)(void *data), size_t capa return 0; } -static int vec_grow(Vector *const vec) { - if (vec->capacity == 0) { - vec->capacity = 1; - } else { - vec->capacity *= 2; - } - - vec->elements = reallocarray(vec->elements, vec->capacity, sizeof(void *)); +static int vec_expand(Vector *vec, size_t new_cap) { + vec->capacity = new_cap; + vec->elements = reallocarray(vec->elements, new_cap, sizeof(void *)); if (vec->elements == NULL) { return -1; @@ -48,6 +43,23 @@ static int vec_grow(Vector *const vec) { return 0; } +static int vec_grow(Vector *const vec) { + size_t new_cap; + if (vec->capacity == 0) { + new_cap = VEC_INIT_CAP; ; + } else { + new_cap = vec->capacity * 2; + } + return vec_expand(vec, new_cap); +} + +int vec_grow_to(Vector *vec, const size_t new_cap) { + if (vec->capacity > new_cap) { + return -1; + } + return vec_expand(vec, new_cap); +} + void vec_clear(Vector *vec) { vec_destroy(vec); vec_init(vec, vec->destroy); diff --git a/tests/tests.c b/tests/tests.c index 60d4170..bf45449 100644 --- a/tests/tests.c +++ b/tests/tests.c @@ -271,6 +271,10 @@ void test_vector() { printf("\ncap after clear: %zu\n", vec_cap(v)); printf("len after clear: %zu\n", vec_len(v)); + vec_grow_to(v, 10); + assert(vec_cap(v) == 10); + assert(vec_len(v) == 0); + vec_destroy(v); free(v); }