From 9d0341197904d40c7eb3edeff50914b20566c238 Mon Sep 17 00:00:00 2001
From: Evan Burkey <evan@burkey.co>
Date: Wed, 26 Feb 2025 16:03:55 -0800
Subject: [PATCH] add vec_grow_to

---
 include/lfvector.h |  2 ++
 src/vector.c       | 28 ++++++++++++++++++++--------
 tests/tests.c      |  4 ++++
 3 files changed, 26 insertions(+), 8 deletions(-)

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