commit - f9a9f82a95d72752ea895c8bc54dc298245d3b1b
commit + 9d0341197904d40c7eb3edeff50914b20566c238
blob - 035d9b436d9a436942bc0ecabb701d9106edfec2
blob + aa3d3a9f05645beee2c1a4c390185747da6bcb99
--- include/lfvector.h
+++ include/lfvector.h
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
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
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);
}