summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2013-06-13 14:23:08 +0200
committerJérémy Zurcher <jeremy@asynk.ch>2013-06-13 14:23:08 +0200
commit53c02a31ac20d4b52a2846779036c582170169bc (patch)
tree22ccd33eae9c7e829d66ff9a3485442fa048ee6f
parentd87457056803309c8263177dd27ad6f803d92684 (diff)
downloadefl-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.c20
-rw-r--r--src/lib/eina/eina_list.h12
-rw-r--r--src/lib/eina/eina_types.h12
-rw-r--r--src/tests/eina/eina_test_list.c18
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);