From 53e9a80260a841aeee333687a03bbfca620b9607 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sun, 18 Feb 2018 21:46:12 +0100 Subject: [PATCH] Introduce filtering for arrays --- include/System/array.h | 5 ++++- src/array.c | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/include/System/array.h b/include/System/array.h index 9b92400..d29fc6c 100644 --- a/include/System/array.h +++ b/include/System/array.h @@ -19,6 +19,7 @@ # define LIBSYSTEM_SYSTEM_ARRAY_H # include +# include /* Array */ @@ -44,6 +45,7 @@ /* types */ typedef struct _Array Array; +typedef bool (*ArrayFilter)(void * value, void * data); typedef void (*ArrayForeach)(void * value, void * data); @@ -63,6 +65,7 @@ int array_set(Array * array, size_t pos, void * value); int array_append(Array * array, void * value); int array_remove_pos(Array * array, size_t pos); -void array_foreach(Array * array, ArrayForeach func, void * data); +void array_filter(Array * array, ArrayFilter func, void * data); +void array_foreach(Array * array, ArrayForeachSwap func, void * data); #endif /* !LIBSYSTEM_SYSTEM_ARRAY_H */ diff --git a/src/array.c b/src/array.c index b22695e..4853756 100644 --- a/src/array.c +++ b/src/array.c @@ -169,6 +169,24 @@ int array_remove_pos(Array * array, size_t pos) } +/* array_filter */ +void array_filter(Array * array, ArrayFilter func, void * data) +{ + uint32_t i; + uint64_t offset; + + for(i = 0, offset = 0; i < array->count;) + if(func(array->value + offset, data) == false) + /* cannot fail */ + array_remove_pos(array, i); + else + { + i++; + offset += array->size; + } +} + + /* array_foreach */ void array_foreach(Array * array, ArrayForeach func, void * data) {