Commit Diff


commit - ba6e929b4fdd5b7cbe51633bcb2930ad1e24f5b6
commit + f9a9f82a95d72752ea895c8bc54dc298245d3b1b
blob - 0c294c83921366234fafaa1e5f491b0c23a019ac
blob + 035d9b436d9a436942bc0ecabb701d9106edfec2
--- include/lfvector.h
+++ include/lfvector.h
@@ -14,11 +14,13 @@ int vec_init(Vector *vec, void (*destroy)(void *data))
 
 int vec_init_with_capacity(Vector *vec, void (*destroy)(void *data), size_t cap);
 
+void vec_clear(Vector *vec);
+
 void vec_destroy(Vector *vec);
 
 int vec_insert(Vector *vec, void *data, size_t index);
 
-int vec_push(Vector *vec, void *data, size_t *index);
+int vec_push(Vector *vec, void *data);
 
 void *vec_safe_at(Vector *vec, size_t index);
 
blob - e84409dae5f661ec126aa214fccff1c5b8cda779
blob + 17d4bcae8428a89a7c4fc280932b330f3fee5298
--- src/vector.c
+++ src/vector.c
@@ -34,7 +34,11 @@ int vec_init_with_capacity(Vector *vec, void (*destroy
 }
 
 static int vec_grow(Vector *const vec) {
-    vec->capacity *= 2;
+    if (vec->capacity == 0) {
+        vec->capacity = 1;
+    } else {
+        vec->capacity *= 2;
+    }
 
     vec->elements = reallocarray(vec->elements, vec->capacity, sizeof(void *));
 
@@ -44,15 +48,25 @@ static int vec_grow(Vector *const vec) {
     return 0;
 }
 
+void vec_clear(Vector *vec) {
+    vec_destroy(vec);
+    vec_init(vec, vec->destroy);
+}
+
 void vec_destroy(Vector *vec) {
     if (vec->destroy) {
         for (size_t i = 0; i < vec_len(vec); ++i) {
             vec->destroy(vec->elements[i]);
         }
     }
+    free(vec->elements);
 }
 
 int vec_insert(Vector *vec, void *data, size_t index) {
+    if (index > vec_len(vec)) {
+        return -1;
+    }
+
     if (vec_len(vec) + 1 >= vec->capacity) {
         if (vec_grow(vec) != 0) {
             return -1;
@@ -81,10 +95,7 @@ int vec_insert(Vector *vec, void *data, size_t index) 
     return 0;
 }
 
-int vec_push(Vector *vec, void *data, size_t *index) {
-    if (index != NULL) {
-        *index = vec_len(vec);
-    }
+int vec_push(Vector *vec, void *data) {
     return vec_insert(vec, data, vec_len(vec));
 }
 
blob - 1d5a2a85f9be3249038b1b367c7dd3e4a2c65ee0
blob + 60d41701ca383637df5dc1ca709bcbfb86533839
--- tests/tests.c
+++ tests/tests.c
@@ -220,15 +220,13 @@ void test_vector() {
     int e3 = 3;
     int e4 = 4;
 
-    size_t idx = 0;
-    vec_push(v, &e0, &idx);
-    assert(idx == 0);
+    vec_push(v, &e0);
     assert(v->length == 1);
-    int *t = (int *) vec_at(v, 0);
+    int *t = vec_at(v, 0);
     assert(*t == 0);
 
-    vec_push(v, &e1, NULL);
-    vec_push(v, &e2, NULL);
+    vec_push(v, &e1);
+    vec_push(v, &e2);
     assert(v->length == 3);
 
     // test access outside bounds
@@ -237,14 +235,14 @@ void test_vector() {
 
     printf("Before insert: ");
     print_vector(v);
-    vec_push(v, &e4, NULL);
-    vec_insert(v, &e3, 3);
+    vec_push(v, &e3);
+    vec_insert(v, &e4, 1);
     printf("After insert:  ");
     print_vector(v);
 
-    t = (int *) vec_at(v, 3);
-    assert(*t == e3);
     t = (int *) vec_at(v, 4);
+    assert(*t == e3);
+    t = (int *) vec_at(v, 1);
     assert(*t == e4);
 
     const int *min = vec_min(v, vec_cmp_int);
@@ -256,7 +254,7 @@ void test_vector() {
 
     t = (int *) vec_remove(v, 1);
     assert(t != NULL);
-    assert(*t == 1);
+    assert(*t == 4);
     printf("After removal: ");
     print_vector(v);
 
@@ -268,6 +266,11 @@ void test_vector() {
     assert(vec_len(v) == vec_cap(v));
     printf("cap after shrink: %zu\n", vec_cap(v));
 
+    vec_clear(v);
+    assert(vec_len(v) == 0);
+    printf("\ncap after clear: %zu\n", vec_cap(v));
+    printf("len after clear: %zu\n", vec_len(v));
+
     vec_destroy(v);
     free(v);
 }