Introduce filtering for arrays
This commit is contained in:
parent
fa6e46a0ba
commit
53e9a80260
|
@ -19,6 +19,7 @@
|
|||
# define LIBSYSTEM_SYSTEM_ARRAY_H
|
||||
|
||||
# include <sys/types.h>
|
||||
# include <stdbool.h>
|
||||
|
||||
|
||||
/* 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 */
|
||||
|
|
18
src/array.c
18
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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue
Block a user