summaryrefslogtreecommitdiff
path: root/src/lib/eina/eina_iterator.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/eina/eina_iterator.c')
-rw-r--r--src/lib/eina/eina_iterator.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/lib/eina/eina_iterator.c b/src/lib/eina/eina_iterator.c
index 1043a9c6e0..26d05f4045 100644
--- a/src/lib/eina/eina_iterator.c
+++ b/src/lib/eina/eina_iterator.c
@@ -429,3 +429,62 @@ eina_iterator_filter_new(Eina_Iterator *iterator, Eina_Each_Cb filter, Eina_Free
return &it->iterator;
}
+
+typedef struct {
+ Eina_Iterator iterator;
+
+ void *data;
+ Eina_Iterator *original;
+ Eina_Process_Cb cb;
+ Eina_Free_Cb free;
+} Eina_Iterator_Processor;
+
+static Eina_Bool
+eina_iterator_process_next(Eina_Iterator_Processor *it, void **data)
+{
+ if (!eina_iterator_next(it->original, data))
+ return EINA_FALSE;
+
+ *data = it->cb(it->original, *data, it->data);
+
+ return EINA_TRUE;
+}
+
+static void*
+eina_iterator_process_get_container(Eina_Iterator_Processor *it)
+{
+ return it->original;
+}
+
+static void
+eina_iterator_process_free(Eina_Iterator_Processor *it)
+{
+ if (it->free)
+ it->free(it->data);
+ eina_iterator_free(it->original);
+ free(it);
+}
+
+EAPI Eina_Iterator*
+eina_iterator_processed_new(Eina_Iterator *iterator, Eina_Process_Cb process, Eina_Free_Cb free_cb, void *data)
+{
+ Eina_Iterator_Processor *it;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(iterator, NULL);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(process, NULL);
+
+ it = calloc(1, sizeof(Eina_Iterator_Processor));
+ it->data = data;
+ it->cb = process;
+ it->free = free_cb;
+ it->original = iterator;
+
+ EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
+
+ it->iterator.version = EINA_ITERATOR_VERSION;
+ it->iterator.next = FUNC_ITERATOR_NEXT(eina_iterator_process_next);
+ it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(eina_iterator_process_get_container);
+ it->iterator.free = FUNC_ITERATOR_FREE(eina_iterator_process_free);
+
+ return &it->iterator;
+}