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);
This commit is contained in:
parent
793e4e0b5a
commit
d723990955
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -284,6 +284,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.
|
||||
|
|
Loading…
Reference in New Issue