feat(vector): foreach method
This commit is contained in:
@@ -9,6 +9,17 @@ typedef struct my_elem {
|
|||||||
int age;
|
int age;
|
||||||
} my_elem_s;
|
} my_elem_s;
|
||||||
|
|
||||||
|
/* Functions used to iterate for each vector's element */
|
||||||
|
static void multiply(void *elem) {
|
||||||
|
my_elem_s *e = (my_elem_s *)elem;
|
||||||
|
e->age = e->age * 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void print(void *elem) {
|
||||||
|
my_elem_s *e = (my_elem_s *)elem;
|
||||||
|
printf("%s (%d)\n", e->name, e->age);
|
||||||
|
}
|
||||||
|
|
||||||
void test_v1() {
|
void test_v1() {
|
||||||
/* Allocate a new vector */
|
/* Allocate a new vector */
|
||||||
size_t elem_size = sizeof(my_elem_s);
|
size_t elem_size = sizeof(my_elem_s);
|
||||||
@@ -44,6 +55,11 @@ void test_v1() {
|
|||||||
my_elem_s *lastv = (my_elem_s *)vec_pop(v);
|
my_elem_s *lastv = (my_elem_s *)vec_pop(v);
|
||||||
free(lastv);
|
free(lastv);
|
||||||
|
|
||||||
|
/* Iterate for each element */
|
||||||
|
vec_foreach(v, multiply);
|
||||||
|
/* Print each element */
|
||||||
|
vec_foreach(v, print);
|
||||||
|
|
||||||
/* Deallocate the vector */
|
/* Deallocate the vector */
|
||||||
vec_free(v);
|
vec_free(v);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -222,7 +222,7 @@ int vec_insert(vec_s *vec, size_t index, void *value) {
|
|||||||
void *tmp = realloc(vec->data, next_power_two(vec->size + 1));
|
void *tmp = realloc(vec->data, next_power_two(vec->size + 1));
|
||||||
if (tmp == NULL) {
|
if (tmp == NULL) {
|
||||||
mtx_unlock(&vec->lock);
|
mtx_unlock(&vec->lock);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
vec->data = tmp;
|
vec->data = tmp;
|
||||||
@@ -281,3 +281,21 @@ int vec_set(vec_s *vec, size_t index, void *value) {
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int vec_foreach(vec_s *vec, void (*fefn)(void *)) {
|
||||||
|
if (vec == NULL || fefn == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mtx_lock(&vec->lock) != thrd_success) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < vec->size; ++i) {
|
||||||
|
fefn((char *)vec->data + (i * vec->elem_size));
|
||||||
|
}
|
||||||
|
|
||||||
|
mtx_unlock(&vec->lock);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|||||||
@@ -37,7 +37,8 @@ int vec_set(vec_s *vec, size_t index, void *value);
|
|||||||
|
|
||||||
int vec_clear(vec_s *vec);
|
int vec_clear(vec_s *vec);
|
||||||
|
|
||||||
// void *vec_foreach(vec_s *, void (* fefn)(void *)) ??
|
int vec_foreach(vec_s *vec, void (*fefn)(void *));
|
||||||
|
|
||||||
// void *vec_sort(vec_s *, void (* sortfn)(void *a, void *b))
|
// void *vec_sort(vec_s *, void (* sortfn)(void *a, void *b))
|
||||||
|
|
||||||
void vec_free(vec_s *vec);
|
void vec_free(vec_s *vec);
|
||||||
|
|||||||
Reference in New Issue
Block a user