From ef1fdb2e5c3659bb4aec224686a9349fa1d0159b Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Tue, 24 Apr 2018 01:46:45 +0200 Subject: [PATCH] Add array_new_filter{,_swap}() --- include/System/array.h | 2 ++ src/array.c | 46 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/include/System/array.h b/include/System/array.h index a24081f..3635fa2 100644 --- a/include/System/array.h +++ b/include/System/array.h @@ -67,6 +67,8 @@ typedef void (*ArrayForeachSwap)(void * data, void * value); /* functions */ Array * array_new(size_t size); +Array * array_new_filter(Array * array, ArrayFilter func, void * data); +Array * array_new_filter_swap(Array * array, ArrayFilterSwap func, void * data); # define array_new_type(object) array_new(sizeof(type)) void array_delete(Array * array); diff --git a/src/array.c b/src/array.c index 46e218a..aed5315 100644 --- a/src/array.c +++ b/src/array.c @@ -70,6 +70,52 @@ Array * array_new(size_t size) } +/* array_new_filter */ +Array * array_new_filter(Array * array, ArrayFilter func, void * data) +{ + Array * a; + size_t i; + char * value; + + if((a = array_new(array->size)) == NULL) + return NULL; + for(i = 0; i < array->count; i++) + { + value = array->value + (array->size * i); + if(func(value, data) == true) + if(array_append(a, value) != 0) + { + array_delete(a); + return NULL; + } + } + return a; +} + + +/* array_new_filter_swap */ +Array * array_new_filter_swap(Array * array, ArrayFilterSwap func, void * data) +{ + Array * a; + size_t i; + char * value; + + if((a = array_new(array->size)) == NULL) + return NULL; + for(i = 0; i < array->count; i++) + { + value = array->value + (array->size * i); + if(func(data, value) == true) + if(array_append(a, value) != 0) + { + array_delete(a); + return NULL; + } + } + return a; +} + + /* array_delete */ void array_delete(Array * array) {