diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2013-06-13 14:23:08 +0200 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2013-06-13 14:23:08 +0200 |
commit | 53c02a31ac20d4b52a2846779036c582170169bc (patch) | |
tree | 22ccd33eae9c7e829d66ff9a3485442fa048ee6f | |
parent | d87457056803309c8263177dd27ad6f803d92684 (diff) | |
download | efl-53c02a31ac20d4b52a2846779036c582170169bc.tar.gz |
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);
-rw-r--r-- | src/lib/eina/eina_list.c | 20 | ||||
-rw-r--r-- | src/lib/eina/eina_list.h | 12 | ||||
-rw-r--r-- | src/lib/eina/eina_types.h | 12 | ||||
-rw-r--r-- | src/tests/eina/eina_test_list.c | 18 |
4 files changed, 60 insertions, 2 deletions
diff --git a/src/lib/eina/eina_list.c b/src/lib/eina/eina_list.c index 96b7fcbe31..3cf7940a4b 100644 --- a/src/lib/eina/eina_list.c +++ b/src/lib/eina/eina_list.c @@ -1179,6 +1179,26 @@ eina_list_filter(Eina_List *list, Eina_Filter_Cb func) } 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) { unsigned int n, i, j; diff --git a/src/lib/eina/eina_list.h b/src/lib/eina/eina_list.h index 8f91a8043d..3163031ef3 100644 --- a/src/lib/eina/eina_list.h +++ b/src/lib/eina/eina_list.h @@ -959,6 +959,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. * * @param list The list handle to shuffle. diff --git a/src/lib/eina/eina_types.h b/src/lib/eina/eina_types.h index 66d1ab1481..c5e213cf11 100644 --- a/src/lib/eina/eina_types.h +++ b/src/lib/eina/eina_types.h @@ -348,6 +348,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 * inclusive must be returned. diff --git a/src/tests/eina/eina_test_list.c b/src/tests/eina/eina_test_list.c index d4eb08086e..45c296d56b 100644 --- a/src/tests/eina/eina_test_list.c +++ b/src/tests/eina/eina_test_list.c @@ -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); |