add EAPI eina_list_map(Eina_List *list, Eina_Map_Cb func)

- eina_list_map applies func on each node of list
- typedef void (*Eina_Map_Cb)(const void *data);
This commit is contained in:
Jérémy Zurcher 2013-06-13 14:23:08 +02:00
parent d874570568
commit 53c02a31ac
4 changed files with 60 additions and 2 deletions

View File

@ -1178,6 +1178,26 @@ eina_list_filter(Eina_List *list, Eina_Filter_Cb func)
return lfiltered;
}
EAPI Eina_List *
eina_list_map(Eina_List *list, Eina_Map_Cb func)
{
const Eina_List *l;
void *data;
if (!list)
return NULL;
EINA_MAGIC_CHECK_LIST(list, NULL);
if (func == NULL)
return list;
EINA_LIST_FOREACH(list, l, data)
func(data);
return list;
}
EAPI Eina_List *
eina_list_shuffle(Eina_List *list, Eina_Random_Cb func)
{

View File

@ -958,6 +958,18 @@ EAPI Eina_List *eina_list_sort(Eina_List *list, unsigned int limit, E
*/
EAPI Eina_List *eina_list_filter(Eina_List *list, Eina_Filter_Cb func) EINA_WARN_UNUSED_RESULT;
/**
* @brief Apply a function on all nodes of list
*
* @param list The list to apply function on.
* @param func The function to apply on nodes.
* @return The same list.
* @since 1.8
*
* @warning @p list must be a pointer to the first element of the list.
*/
EAPI Eina_List *eina_list_map(Eina_List *list, Eina_Map_Cb func) EINA_WARN_UNUSED_RESULT;
/**
* @brief Shuffle list.
*

View File

@ -347,6 +347,18 @@ typedef Eina_Bool (*Eina_Filter_Cb)(const void *data);
*/
#define EINA_FILTER_CB(function) ((Eina_Filter_Cb)function)
/**
* @typedef Eina_Map_Cb
* Function to be applied on nodes.
*/
typedef void (*Eina_Map_Cb)(const void *data);
/**
* @def EINA_MAP_CB
* Macro to cast to Eina_Map_Cb.
*/
#define EINA_MAP_CB(function) ((Eina_Map_Cb)function)
/**
* @typedef Eina_Random_Cb
* Function used in shuffling functions. An integer betwen min and max

View File

@ -501,12 +501,18 @@ static Eina_Bool filter_cb(int *data)
return ( (*data < 81) ? EINA_TRUE : EINA_FALSE );
}
static void map_cb(int *data)
{
*data = *data * 3;
}
START_TEST(eina_test_filter)
{
int i;
int *p;
int data[] = { 6, 9, 93, 42, 1, 7, 9, 81, 1664, 1337 };
int result[] = { 6, 9, 42, 1, 7, 9, 81 };
int result1[] = { 6, 9, 42, 1, 7, 9 };
int result2[] = { 18, 27, 126, 3, 21, 27 };
Eina_List *list = NULL;
Eina_List *l = NULL;
@ -529,7 +535,15 @@ START_TEST(eina_test_filter)
for (i = 0; i < 6; i++)
{
p = eina_list_nth(l, i);
fail_if(*p != result[i]);
fail_if(*p != result1[i]);
}
l = eina_list_map(l, EINA_MAP_CB(map_cb));
fail_if(eina_list_count(l) != 6);
for (i = 0; i < 6; i++)
{
p = eina_list_nth(l, i);
fail_if(*p != result2[i]);
}
l = eina_list_free(l);