commit 9d0341197904d40c7eb3edeff50914b20566c238 from: Evan Burkey date: Thu Feb 27 00:03:55 2025 UTC add vec_grow_to commit - f9a9f82a95d72752ea895c8bc54dc298245d3b1b commit + 9d0341197904d40c7eb3edeff50914b20566c238 blob - 035d9b436d9a436942bc0ecabb701d9106edfec2 blob + aa3d3a9f05645beee2c1a4c390185747da6bcb99 --- include/lfvector.h +++ 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); blob - 17d4bcae8428a89a7c4fc280932b330f3fee5298 blob + 83da588467cb044d00a0cbb1bc97c7cdcc691505 --- src/vector.c +++ src/vector.c @@ -33,19 +33,31 @@ int vec_init_with_capacity(Vector *vec, void (*destroy return 0; } +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; + } + return 0; +} + static int vec_grow(Vector *const vec) { + size_t new_cap; if (vec->capacity == 0) { - vec->capacity = 1; + new_cap = VEC_INIT_CAP; ; } else { - vec->capacity *= 2; + new_cap = vec->capacity * 2; } + return vec_expand(vec, new_cap); +} - vec->elements = reallocarray(vec->elements, vec->capacity, sizeof(void *)); - - if (vec->elements == NULL) { +int vec_grow_to(Vector *vec, const size_t new_cap) { + if (vec->capacity > new_cap) { return -1; } - return 0; + return vec_expand(vec, new_cap); } void vec_clear(Vector *vec) { blob - 60d41701ca383637df5dc1ca709bcbfb86533839 blob + bf4544915dcf359a7e1d70423f9d57eba614ec03 --- tests/tests.c +++ 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); }