summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Magno de Almeida <felipe@expertisesolutions.com.br>2016-03-06 17:24:34 -0300
committerFelipe Magno de Almeida <felipe@expertisesolutions.com.br>2016-03-06 17:24:34 -0300
commitd723990955289a5ca62605262f4bc4cd0aa8d25f (patch)
tree176114705445fc0119aedb801326aff9a6f5f5e4
parent793e4e0b5ad0d2a312afdda7c71257063c8c4a30 (diff)
downloadefl-d723990955289a5ca62605262f4bc4cd0aa8d25f.tar.gz
eina: Add Eina_Iterator implementation for C-array
This iterator is convenient when you already have a C-Array and you need to pass this array to a function receiving an Eina_Iterator. int array[] = {1, 2, 3, 4}; int* array2[] = {&array[0], &array[1], &array[2], &array[3], NULL}; Eina_Iterator* iterator = eina_carray_iterator_new((void**)array);
-rw-r--r--src/lib/eina/eina_iterator.c54
-rw-r--r--src/lib/eina/eina_iterator.h15
2 files changed, 69 insertions, 0 deletions
diff --git a/src/lib/eina/eina_iterator.c b/src/lib/eina/eina_iterator.c
index 59dc106011..5d621816b9 100644
--- a/src/lib/eina/eina_iterator.c
+++ b/src/lib/eina/eina_iterator.c
@@ -174,3 +174,57 @@ eina_iterator_unlock(Eina_Iterator *iterator)
return iterator->unlock(iterator);
return EINA_TRUE;
}
+
+typedef struct _Eina_Iterator_CArray Eina_Iterator_CArray;
+
+struct _Eina_Iterator_CArray
+{
+ Eina_Iterator iterator;
+
+ void** array;
+ void** current;
+};
+
+static Eina_Bool
+eina_carray_iterator_next(Eina_Iterator_CArray *it, void **data)
+{
+ if (!it->current || !*it->current)
+ return EINA_FALSE;
+
+ *data = *it->current++;
+
+ return EINA_TRUE;
+}
+
+static void**
+eina_carray_iterator_get_container(Eina_Iterator_CArray *it)
+{
+ return it->array;
+}
+
+static void
+eina_carray_iterator_free(Eina_Iterator_CArray *it)
+{
+ free(it);
+}
+
+EAPI Eina_Iterator*
+eina_carray_iterator_new(void** array)
+{
+ Eina_Iterator_CArray *it;
+
+ it = calloc(1, sizeof (Eina_Iterator_CArray));
+ if (!it) return NULL;
+
+ EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
+
+ it->array = it->current = array;
+
+ it->iterator.version = EINA_ITERATOR_VERSION;
+ it->iterator.next = FUNC_ITERATOR_NEXT(eina_carray_iterator_next);
+ it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(
+ eina_carray_iterator_get_container);
+ it->iterator.free = FUNC_ITERATOR_FREE(eina_carray_iterator_free);
+
+ return &it->iterator;
+}
diff --git a/src/lib/eina/eina_iterator.h b/src/lib/eina/eina_iterator.h
index 980dbfcae7..b379d2ee31 100644
--- a/src/lib/eina/eina_iterator.h
+++ b/src/lib/eina/eina_iterator.h
@@ -285,6 +285,21 @@ EAPI Eina_Bool eina_iterator_lock(Eina_Iterator *iterator) EINA_ARG_NONNULL(1);
EAPI Eina_Bool eina_iterator_unlock(Eina_Iterator *iterator) EINA_ARG_NONNULL(1);
/**
+ * @brief Creates an Eina_Iterator that iterates through a
+ * NUL-terminated C array.
+ *
+ * @param array The NUL-terminated array
+ *
+ * You can create it like this:
+ * int array[] = {1, 2, 3, 4};
+ * int* array2[] = {&array[0], &array[1], &array[2], &array[3], NULL};
+ *
+ * Eina_Iterator* iterator = eina_carray_iterator_new((void**)array);
+ *
+ */
+EAPI Eina_Iterator* eina_carray_iterator_new(void** array) EINA_ARG_NONNULL(1) EINA_WARN_UNUSED_RESULT;
+
+/**
* @def EINA_ITERATOR_FOREACH
* @brief Macro to iterate over all elements easily.
*