Commit Diff


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);
 }