From 26f0887c5c4b20268d885307997f0c98e410d848 Mon Sep 17 00:00:00 2001 From: Francesco Date: Tue, 9 Sep 2025 00:58:39 +0200 Subject: [PATCH] feat(vector): foreach method --- test/vector/v1.c | 16 ++++++++++++++++ vector/myvector.c | 20 +++++++++++++++++++- vector/myvector.h | 3 ++- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/test/vector/v1.c b/test/vector/v1.c index 19eda03..2fe707e 100644 --- a/test/vector/v1.c +++ b/test/vector/v1.c @@ -9,6 +9,17 @@ typedef struct my_elem { int age; } 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() { /* Allocate a new vector */ 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); free(lastv); + /* Iterate for each element */ + vec_foreach(v, multiply); + /* Print each element */ + vec_foreach(v, print); + /* Deallocate the vector */ vec_free(v); } diff --git a/vector/myvector.c b/vector/myvector.c index 0a3afe7..8cc2f1e 100644 --- a/vector/myvector.c +++ b/vector/myvector.c @@ -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)); if (tmp == NULL) { mtx_unlock(&vec->lock); - + return -1; } vec->data = tmp; @@ -281,3 +281,21 @@ int vec_set(vec_s *vec, size_t index, void *value) { 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; +} diff --git a/vector/myvector.h b/vector/myvector.h index 41d52eb..7389225 100644 --- a/vector/myvector.h +++ b/vector/myvector.h @@ -37,7 +37,8 @@ int vec_set(vec_s *vec, size_t index, void *value); 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_free(vec_s *vec);