add vec_clear
This commit is contained in:
parent
ba6e929b4f
commit
f9a9f82a95
@ -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);
|
int vec_init_with_capacity(Vector *vec, void (*destroy)(void *data), size_t cap);
|
||||||
|
|
||||||
|
void vec_clear(Vector *vec);
|
||||||
|
|
||||||
void vec_destroy(Vector *vec);
|
void vec_destroy(Vector *vec);
|
||||||
|
|
||||||
int vec_insert(Vector *vec, void *data, size_t index);
|
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);
|
void *vec_safe_at(Vector *vec, size_t index);
|
||||||
|
|
||||||
|
21
src/vector.c
21
src/vector.c
@ -34,7 +34,11 @@ int vec_init_with_capacity(Vector *vec, void (*destroy)(void *data), size_t capa
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int vec_grow(Vector *const vec) {
|
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 *));
|
vec->elements = reallocarray(vec->elements, vec->capacity, sizeof(void *));
|
||||||
|
|
||||||
@ -44,15 +48,25 @@ static int vec_grow(Vector *const vec) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vec_clear(Vector *vec) {
|
||||||
|
vec_destroy(vec);
|
||||||
|
vec_init(vec, vec->destroy);
|
||||||
|
}
|
||||||
|
|
||||||
void vec_destroy(Vector *vec) {
|
void vec_destroy(Vector *vec) {
|
||||||
if (vec->destroy) {
|
if (vec->destroy) {
|
||||||
for (size_t i = 0; i < vec_len(vec); ++i) {
|
for (size_t i = 0; i < vec_len(vec); ++i) {
|
||||||
vec->destroy(vec->elements[i]);
|
vec->destroy(vec->elements[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
free(vec->elements);
|
||||||
}
|
}
|
||||||
|
|
||||||
int vec_insert(Vector *vec, void *data, size_t index) {
|
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_len(vec) + 1 >= vec->capacity) {
|
||||||
if (vec_grow(vec) != 0) {
|
if (vec_grow(vec) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
@ -81,10 +95,7 @@ int vec_insert(Vector *vec, void *data, size_t index) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int vec_push(Vector *vec, void *data, size_t *index) {
|
int vec_push(Vector *vec, void *data) {
|
||||||
if (index != NULL) {
|
|
||||||
*index = vec_len(vec);
|
|
||||||
}
|
|
||||||
return vec_insert(vec, data, vec_len(vec));
|
return vec_insert(vec, data, vec_len(vec));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -220,15 +220,13 @@ void test_vector() {
|
|||||||
int e3 = 3;
|
int e3 = 3;
|
||||||
int e4 = 4;
|
int e4 = 4;
|
||||||
|
|
||||||
size_t idx = 0;
|
vec_push(v, &e0);
|
||||||
vec_push(v, &e0, &idx);
|
|
||||||
assert(idx == 0);
|
|
||||||
assert(v->length == 1);
|
assert(v->length == 1);
|
||||||
int *t = (int *) vec_at(v, 0);
|
int *t = vec_at(v, 0);
|
||||||
assert(*t == 0);
|
assert(*t == 0);
|
||||||
|
|
||||||
vec_push(v, &e1, NULL);
|
vec_push(v, &e1);
|
||||||
vec_push(v, &e2, NULL);
|
vec_push(v, &e2);
|
||||||
assert(v->length == 3);
|
assert(v->length == 3);
|
||||||
|
|
||||||
// test access outside bounds
|
// test access outside bounds
|
||||||
@ -237,14 +235,14 @@ void test_vector() {
|
|||||||
|
|
||||||
printf("Before insert: ");
|
printf("Before insert: ");
|
||||||
print_vector(v);
|
print_vector(v);
|
||||||
vec_push(v, &e4, NULL);
|
vec_push(v, &e3);
|
||||||
vec_insert(v, &e3, 3);
|
vec_insert(v, &e4, 1);
|
||||||
printf("After insert: ");
|
printf("After insert: ");
|
||||||
print_vector(v);
|
print_vector(v);
|
||||||
|
|
||||||
t = (int *) vec_at(v, 3);
|
|
||||||
assert(*t == e3);
|
|
||||||
t = (int *) vec_at(v, 4);
|
t = (int *) vec_at(v, 4);
|
||||||
|
assert(*t == e3);
|
||||||
|
t = (int *) vec_at(v, 1);
|
||||||
assert(*t == e4);
|
assert(*t == e4);
|
||||||
|
|
||||||
const int *min = vec_min(v, vec_cmp_int);
|
const int *min = vec_min(v, vec_cmp_int);
|
||||||
@ -256,7 +254,7 @@ void test_vector() {
|
|||||||
|
|
||||||
t = (int *) vec_remove(v, 1);
|
t = (int *) vec_remove(v, 1);
|
||||||
assert(t != NULL);
|
assert(t != NULL);
|
||||||
assert(*t == 1);
|
assert(*t == 4);
|
||||||
printf("After removal: ");
|
printf("After removal: ");
|
||||||
print_vector(v);
|
print_vector(v);
|
||||||
|
|
||||||
@ -268,6 +266,11 @@ void test_vector() {
|
|||||||
assert(vec_len(v) == vec_cap(v));
|
assert(vec_len(v) == vec_cap(v));
|
||||||
printf("cap after shrink: %zu\n", 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);
|
vec_destroy(v);
|
||||||
free(v);
|
free(v);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user