commit - ba6e929b4fdd5b7cbe51633bcb2930ad1e24f5b6
commit + f9a9f82a95d72752ea895c8bc54dc298245d3b1b
blob - 0c294c83921366234fafaa1e5f491b0c23a019ac
blob + 035d9b436d9a436942bc0ecabb701d9106edfec2
--- include/lfvector.h
+++ include/lfvector.h
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
}
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 *));
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;
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
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
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);
t = (int *) vec_remove(v, 1);
assert(t != NULL);
- assert(*t == 1);
+ assert(*t == 4);
printf("After removal: ");
print_vector(v);
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);
}