diff --git a/include/System/array.h b/include/System/array.h index d29fc6c..b0d2910 100644 --- a/include/System/array.h +++ b/include/System/array.h @@ -45,8 +45,11 @@ /* types */ typedef struct _Array Array; +/* XXX the Swap variants are useless here */ typedef bool (*ArrayFilter)(void * value, void * data); +typedef bool (*ArrayFilterSwap)(void * data, void * value); typedef void (*ArrayForeach)(void * value, void * data); +typedef void (*ArrayForeachSwap)(void * data, void * value); /* functions */ @@ -66,6 +69,8 @@ int array_append(Array * array, void * value); int array_remove_pos(Array * array, size_t pos); void array_filter(Array * array, ArrayFilter func, void * data); +void array_filter_swap(Array * array, ArrayFilter func, void * data); void array_foreach(Array * array, ArrayForeachSwap func, void * data); +void array_foreach_swap(Array * array, ArrayForeachSwap func, void * data); #endif /* !LIBSYSTEM_SYSTEM_ARRAY_H */ diff --git a/src/array.c b/src/array.c index 4853756..376c269 100644 --- a/src/array.c +++ b/src/array.c @@ -187,6 +187,24 @@ void array_filter(Array * array, ArrayFilter func, void * data) } +/* array_filter_swap */ +void array_filter_swap(Array * array, ArrayFilterSwap func, void * data) +{ + uint32_t i; + uint64_t offset; + + for(i = 0, offset = 0; i < array->count;) + if(func(data, array->value + offset) == false) + /* cannot fail */ + array_remove_pos(array, i); + else + { + i++; + offset += array->size; + } +} + + /* array_foreach */ void array_foreach(Array * array, ArrayForeach func, void * data) { @@ -196,3 +214,14 @@ void array_foreach(Array * array, ArrayForeach func, void * data) for(i = 0, offset = 0; i < array->count; i++, offset += array->size) func(array->value + offset, data); } + + +/* array_foreach_swap */ +void array_foreach_swap(Array * array, ArrayForeachSwap func, void * data) +{ + uint32_t i; + uint64_t offset; + + for(i = 0, offset = 0; i < array->count; i++, offset += array->size) + func(data, array->value + offset); +}