Data Structures | Macros | Typedefs | Functions
Iterator Functions

These functions manage iterators on containers. More...

Data Structures

struct  _Eina_Iterator
 structure of an iterator More...
 

Macros

#define FUNC_ITERATOR_NEXT(Function)   ((Eina_Iterator_Next_Callback)Function)
 Helper macro to cast Function to a Eina_Iterator_Next_Callback.
 
#define FUNC_ITERATOR_GET_CONTAINER(Function)   ((Eina_Iterator_Get_Container_Callback)Function)
 Helper macro to cast Function to a Eina_Iterator_Get_Container_Callback.
 
#define FUNC_ITERATOR_FREE(Function)   ((Eina_Iterator_Free_Callback)Function)
 Helper macro to cast Function to a Eina_Iterator_Free_Callback.
 
#define FUNC_ITERATOR_LOCK(Function)   ((Eina_Iterator_Lock_Callback)Function)
 Helper macro to cast Function to a Eina_Iterator_Lock_Callback.
 
#define EINA_ITERATOR_FOREACH(itr, data)
 Definition for the macro to iterate over all elements easily. More...
 

Typedefs

typedef struct _Eina_Iterator Eina_Iterator
 Abstract type for iterators.
 
typedef Eina_Bool(* Eina_Iterator_Next_Callback) (Eina_Iterator *it, void **data)
 Type for a callback that returns the next element in a container.
 
typedef void *(* Eina_Iterator_Get_Container_Callback) (Eina_Iterator *it)
 Type for a callback that returns the container.
 
typedef void(* Eina_Iterator_Free_Callback) (Eina_Iterator *it)
 Type for a callback that frees the container.
 
typedef Eina_Bool(* Eina_Iterator_Lock_Callback) (Eina_Iterator *it)
 Type for a callback that lock the container.
 

Functions

void eina_iterator_free (Eina_Iterator *iterator)
 Frees an iterator. More...
 
void * eina_iterator_container_get (Eina_Iterator *iterator)
 Returns the container of an iterator. More...
 
Eina_Bool eina_iterator_next (Eina_Iterator *iterator, void **data)
 Returns the value of the current element and go to the next one. More...
 
void eina_iterator_foreach (Eina_Iterator *iterator, Eina_Each_Cb callback, const void *fdata)
 Iterates over the container and execute a callback on each element. More...
 
Eina_Bool eina_iterator_lock (Eina_Iterator *iterator)
 Locks the container of the iterator. More...
 
Eina_Bool eina_iterator_unlock (Eina_Iterator *iterator)
 Unlocks the container of the iterator. More...
 
Eina_Iteratoreina_carray_iterator_new (void **array)
 Creates an Eina_Iterator that iterates through a NUL-terminated C array. More...
 
Eina_Iteratoreina_iterator_filter_new (Eina_Iterator *original, Eina_Each_Cb filter, Eina_Free_Cb free_cb, void *data)
 Creates a new iterator which which iterates throuw all elements with are accepted by the filter callback. More...
 

Detailed Description

These functions manage iterators on containers.

These functions allow to access elements of a container in a generic way, without knowing which container is used (a bit like iterators in the C++ STL). Iterators only allows sequential access (that is, from an element to the next one). For random access, see Accessor Functions.

Getting an iterator to access elements of a given container is done through the functions of that particular container. There is no function to create a generic iterator as iterators absolutely depend on the container. This means you won't find iterator creation function here, those can be found on the documentation of the container type you're using. Though created with container specific functions iterators are always deleted with the same function: eina_iterator_free().

To get the data and iterate, use eina_iterator_next(). To call a function on all the elements of a container, use eina_iterator_foreach().

Here an example

Macro Definition Documentation

◆ EINA_ITERATOR_FOREACH

#define EINA_ITERATOR_FOREACH (   itr,
  data 
)
Value:
while (eina_iterator_next((itr), \
(void **)(void *)&(data)))
Eina_Bool eina_iterator_next(Eina_Iterator *iterator, void **data)
Returns the value of the current element and go to the next one.
Definition: eina_iterator.c:116

Definition for the macro to iterate over all elements easily.

Parameters
itrThe iterator to use.
dataWhere to store * data, must be a pointer support getting its address since * eina_iterator_next() requires a pointer to pointer!

This macro is a convenient way to use iterators, very similar to EINA_LIST_FOREACH().

This macro can be used for freeing the data of a list, like in the following example. It has the same goal as the one documented in EINA_LIST_FOREACH(), but using iterators:

Eina_List *list;
char *data;
// list is already filled,
// its elements are just duplicated strings
free(data);
Note
This example is not optimal algorithm to release a list since it will walk the list twice, but it serves as an example. For optimized version use EINA_LIST_FREE()
Warning
The order in which the elements will be traversed depends on the underlying container and shouldn't be relied upon.
unless explicitly stated in functions returning iterators, do not modify the iterated object while you walk it, in this example using lists, do not remove list nodes or you might crash! This is not a limitiation of iterators themselves, rather in the iterators implementations to keep them as simple and fast as possible.
Examples:
ecore_con_client_example.c, eet-data-file_descriptor_01.c, eina_file_01.c, eina_list_03.c, and eina_tiler_01.c.

Referenced by ecore_file_dir_is_empty(), ecore_file_ls(), edje_available_modules_get(), edje_edit_clean_save_as(), edje_edit_data_list_get(), edje_edit_data_source_generate(), edje_edit_font_path_get(), edje_edit_fonts_list_get(), edje_edit_full_source_generate(), edje_edit_group_add(), edje_edit_group_aliased_get(), edje_edit_group_aliases_get(), edje_edit_group_copy(), edje_edit_group_data_list_get(), edje_edit_image_replace(), edje_edit_image_set_del(), edje_edit_set_usage_list_get(), edje_edit_sound_tones_list_get(), edje_edit_vector_usage_list_get(), edje_evas_global_perspective_get(), edje_mmap_collection_list(), edje_mmap_group_exists(), eina_file_flush(), eina_tiler_subtract(), eldbus_init(), elm_color_class_editor_add(), elm_ctxpopup_items_get(), elm_menu_items_get(), and elm_prefs_data_version_get().

Function Documentation

◆ eina_iterator_free()

void eina_iterator_free ( Eina_Iterator iterator)

◆ eina_iterator_container_get()

void* eina_iterator_container_get ( Eina_Iterator iterator)

Returns the container of an iterator.

Parameters
iteratorThe iterator.
Returns
The container which created the iterator.

This function returns the container which created iterator. If iterator is NULL, this function returns NULL.

◆ eina_iterator_next()

Eina_Bool eina_iterator_next ( Eina_Iterator iterator,
void **  data 
)

Returns the value of the current element and go to the next one.

Parameters
iteratorThe iterator.
dataThe data of the element.
Returns
EINA_TRUE on success, EINA_FALSE otherwise.

This function returns the value of the current element pointed by iterator in data, then goes to the next element. If iterator is NULL or if a problem occurred, EINA_FALSE is returned, otherwise EINA_TRUE is returned.

References EINA_FALSE.

Referenced by ecore_wl2_display_create(), edje_color_class_list(), edje_edit_full_source_generate(), edje_mmap_3d_has(), edje_size_class_active_iterator_new(), edje_size_class_list(), edje_text_class_list(), eina_carray_iterator_new(), eina_cow_gc(), eina_tiler_equal(), eina_tiler_intersection(), elm_layout_content_swallow_list_get(), efl::eina::iterator< T, Enable >::operator++(), and efl::eina::iterator< T, typename std::enable_if< ::efl::eo::is_eolian_object< T >::value, void >::type >::operator++().

◆ eina_iterator_foreach()

void eina_iterator_foreach ( Eina_Iterator iterator,
Eina_Each_Cb  callback,
const void *  fdata 
)

Iterates over the container and execute a callback on each element.

Parameters
iteratorThe iterator.
callbackThe callback called on each iteration.
fdataThe data passed to the callback.

This function iterates over the elements pointed by iterator, beginning from the current element. For Each element, the callback cb is called with the data fdata. If iterator is NULL, the function returns immediately. Also, if cb returns EINA_FALSE, the iteration stops at that point, if cb returns EINA_TRUE the iteration continues.

◆ eina_iterator_lock()

Eina_Bool eina_iterator_lock ( Eina_Iterator iterator)

Locks the container of the iterator.

Parameters
iteratorThe iterator.
Returns
EINA_TRUE on success, EINA_FALSE otherwise.

If the container of the iterator permits it, it will be locked. When a container is locked calling eina_iterator_foreach() on it will return immediately. If iterator is NULL or if a problem occurred, EINA_FALSE is returned, otherwise EINA_TRUE is returned. If the container isn't lockable, it will return EINA_TRUE.

Warning
None of the existing eina data structures are lockable.

◆ eina_iterator_unlock()

Eina_Bool eina_iterator_unlock ( Eina_Iterator iterator)

Unlocks the container of the iterator.

Parameters
iteratorThe iterator.
Returns
EINA_TRUE on success, EINA_FALSE otherwise.

If the container of the iterator permits it and was previously locked, it will be unlocked. If iterator is NULL or if a problem occurred, EINA_FALSE is returned, otherwise EINA_TRUE is returned. If the container is not lockable, it will return EINA_TRUE.

Warning
None of the existing eina data structures are lockable.

◆ eina_carray_iterator_new()

Eina_Iterator* eina_carray_iterator_new ( void **  array)

Creates an Eina_Iterator that iterates through a NUL-terminated C array.

Parameters
arrayThe 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);

Since
1.18

References EINA_FALSE, eina_iterator_free(), eina_iterator_next(), EINA_MAGIC_SET, EINA_TRUE, FUNC_ITERATOR_FREE, FUNC_ITERATOR_GET_CONTAINER, and FUNC_ITERATOR_NEXT.

◆ eina_iterator_filter_new()

Eina_Iterator* eina_iterator_filter_new ( Eina_Iterator original,
Eina_Each_Cb  filter,
Eina_Free_Cb  free_cb,
void *  data 
)

Creates a new iterator which which iterates throuw all elements with are accepted by the filter callback.

Parameters
originalthe iterator the use as original set
filterif the callback returns true the element from the original set is taken into the the new set.
free_cbwhen the iterator is gone this callback will be called with data as argument
datathe data which is passed to the filter callback

The iterator is filtered while it is beeing iterated. The original iterator you pass in here is is then owned and will be freed once the the new iterator is freed.

Since
1.19