Add array_new_filter{,_swap}()

This commit is contained in:
Pierre Pronchery 2018-04-24 01:46:45 +02:00
parent 9ac1d70a38
commit ef1fdb2e5c
2 changed files with 48 additions and 0 deletions

View File

@ -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);

View File

@ -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)
{