diff --git a/test/vector/v1.c b/test/vector/v1.c index 9a6f782..b8f67a8 100644 --- a/test/vector/v1.c +++ b/test/vector/v1.c @@ -15,12 +15,20 @@ static void multiply(size_t index, void *elem) { e->age = e->age * 2; } -/* Another way to use foreach +/* Another way to use foreach */ static void print(size_t index, void *elem) { my_elem_s *e = (my_elem_s *)elem; printf("%s (%d)\n", e->name, e->age); } -*/ + +/* Compare function used to sort */ +int my_cmp(const void *a, const void *b) { + /* Sort by age */ + my_elem_s *ma = (my_elem_s *)a; + my_elem_s *mb = (my_elem_s *)b; + + return ma->age - mb->age; +} void test_v1() { /* Allocate a new vector */ @@ -47,7 +55,9 @@ void test_v1() { /* Insert an element */ vec_push(v, &e1); + e1.age = 25; vec_push(v, &e1); + e1.age = 19; vec_insert(v, 2, &e1); my_elem_s last = { .age = 33, @@ -60,7 +70,13 @@ void test_v1() { /* Iterate for each element */ vec_foreach(v, multiply); /* Print each element */ - // vec_foreach(v, print); + puts("Before sort:"); + vec_foreach(v, print); + + /* Sort */ + vec_sort(v, my_cmp); + puts("After sort:"); + vec_foreach(v, print); /* Deallocate the vector */ vec_free(v); diff --git a/vector/myvector.c b/vector/myvector.c index a20d815..f109f84 100644 --- a/vector/myvector.c +++ b/vector/myvector.c @@ -299,3 +299,13 @@ int vec_foreach(vec_s *vec, void (*fefn)(size_t index, void *elem)) { return 0; } + +int vec_sort(vec_s *vec, int (*cmp)(const void *a, const void *b)) { + if (vec == NULL || cmp == NULL) { + return -1; + } + + qsort(vec->data, vec->size, vec->elem_size, cmp); + + return 0; +} diff --git a/vector/myvector.h b/vector/myvector.h index dbb7131..25e21e4 100644 --- a/vector/myvector.h +++ b/vector/myvector.h @@ -39,7 +39,8 @@ int vec_clear(vec_s *vec); int vec_foreach(vec_s *vec, void (*fefn)(size_t index, void *elem)); -// void *vec_sort(vec_s *, void (* sortfn)(void *a, void *b)) +/* Wrapper around qsort() */ +int vec_sort(vec_s *vec, int (*cmp)(const void *a, const void *b)); void vec_free(vec_s *vec);