diff --git a/legacy/eina/src/include/eina_accessor.h b/legacy/eina/src/include/eina_accessor.h index 45269aa7aa..21d514b978 100644 --- a/legacy/eina/src/include/eina_accessor.h +++ b/legacy/eina/src/include/eina_accessor.h @@ -26,7 +26,7 @@ typedef struct _Eina_Accessor Eina_Accessor; EAPI void eina_accessor_free (Eina_Accessor *accessor); -EAPI void *eina_accessor_data_get (Eina_Accessor *accessor, unsigned int position); +EAPI Eina_Bool eina_accessor_data_get (Eina_Accessor *accessor, unsigned int position, void **data); EAPI void *eina_accessor_container_get (Eina_Accessor *accessor); EAPI void eina_accessor_over (Eina_Accessor *accessor, diff --git a/legacy/eina/src/include/eina_iterator.h b/legacy/eina/src/include/eina_iterator.h index 04ce7b36b2..adcc679101 100644 --- a/legacy/eina/src/include/eina_iterator.h +++ b/legacy/eina/src/include/eina_iterator.h @@ -26,10 +26,8 @@ typedef struct _Eina_Iterator Eina_Iterator; EAPI void eina_iterator_free (Eina_Iterator *iterator); -EAPI void *eina_iterator_data_get (Eina_Iterator *iterator); EAPI void *eina_iterator_container_get (Eina_Iterator *iterator); - -EAPI Eina_Error eina_iterator_next (Eina_Iterator *iterator); +EAPI Eina_Bool eina_iterator_next (Eina_Iterator *iterator, void **data); EAPI void eina_iterator_foreach (Eina_Iterator *iterator, Eina_Each callback, diff --git a/legacy/eina/src/include/eina_private.h b/legacy/eina/src/include/eina_private.h index fece17cf53..a53fb97364 100644 --- a/legacy/eina/src/include/eina_private.h +++ b/legacy/eina/src/include/eina_private.h @@ -115,30 +115,25 @@ typedef struct _Eina_Mempool_Backend } Eina_Mempool_Backend; /* Iterator/accessor private type */ -typedef Eina_Bool (*Eina_Iterator_Next_Callback)(Eina_Iterator *it); -typedef void *(*Eina_Iterator_Get_Content_Callback)(Eina_Iterator *it); +typedef Eina_Bool (*Eina_Iterator_Next_Callback)(Eina_Iterator *it, void **data); typedef void *(*Eina_Iterator_Get_Container_Callback)(Eina_Iterator *it); typedef void (*Eina_Iterator_Free_Callback)(Eina_Iterator *it); #define FUNC_ITERATOR_NEXT(Function) ((Eina_Iterator_Next_Callback)Function) -#define FUNC_ITERATOR_GET_CONTENT(Function) ((Eina_Iterator_Get_Content_Callback)Function) #define FUNC_ITERATOR_GET_CONTAINER(Function) ((Eina_Iterator_Get_Container_Callback)Function) #define FUNC_ITERATOR_FREE(Function) ((Eina_Iterator_Free_Callback)Function) -typedef Eina_Bool (*Eina_Accessor_Jump_At_Callback)(Eina_Accessor *it, unsigned int index); -typedef void *(*Eina_Accessor_Get_Content_Callback)(Eina_Accessor *it); +typedef Eina_Bool (*Eina_Accessor_Jump_At_Callback)(Eina_Accessor *it, unsigned int index, void **data); typedef void *(*Eina_Accessor_Get_Container_Callback)(Eina_Accessor *it); typedef void (*Eina_Accessor_Free_Callback)(Eina_Accessor *it); #define FUNC_ACCESSOR_JUMP_AT(Function) ((Eina_Accessor_Jump_At_Callback)Function) -#define FUNC_ACCESSOR_GET_CONTENT(Function) ((Eina_Accessor_Get_Content_Callback)Function) #define FUNC_ACCESSOR_GET_CONTAINER(Function) ((Eina_Accessor_Get_Container_Callback)Function) #define FUNC_ACCESSOR_FREE(Function) ((Eina_Accessor_Free_Callback)Function) struct _Eina_Iterator { Eina_Iterator_Next_Callback next; - Eina_Iterator_Get_Content_Callback get_content; Eina_Iterator_Get_Container_Callback get_container; Eina_Iterator_Free_Callback free; }; @@ -146,9 +141,9 @@ struct _Eina_Iterator struct _Eina_Accessor { Eina_Accessor_Jump_At_Callback jump_at; - Eina_Accessor_Get_Content_Callback get_content; Eina_Accessor_Get_Container_Callback get_container; Eina_Accessor_Free_Callback free; }; #endif /* EINA_PRIVATE_H_ */ + diff --git a/legacy/eina/src/lib/eina_accessor.c b/legacy/eina/src/lib/eina_accessor.c index 3599a07e05..3f31a0f14a 100644 --- a/legacy/eina/src/lib/eina_accessor.c +++ b/legacy/eina/src/lib/eina_accessor.c @@ -32,12 +32,11 @@ eina_accessor_free(Eina_Accessor *accessor) if (accessor) accessor->free(accessor); } -EAPI void * -eina_accessor_data_get(Eina_Accessor *accessor, unsigned int position) +EAPI Eina_Bool +eina_accessor_data_get(Eina_Accessor *accessor, unsigned int position, void **data) { - if (!accessor) return NULL; - if (accessor->jump_at(accessor, position) != EINA_TRUE) return NULL; - return accessor->get_content(accessor); + if (!accessor) return EINA_FALSE; + return accessor->jump_at(accessor, position, data); } EAPI void * @@ -61,16 +60,8 @@ eina_accessor_over(Eina_Accessor *accessor, if (!accessor) return ; if (!(start < end)) return ; - if (accessor->jump_at(accessor, start) != EINA_TRUE) return ; - - container = accessor->get_container(accessor); - do { - data = accessor->get_content(accessor); - + for (i = start; i < end && accessor->jump_at(accessor, i, &data) == EINA_TRUE; ++i) if (cb(container, data, (void*) fdata) != EINA_TRUE) return ; - - ++i; - } while (i < end && accessor->jump_at(accessor, i) == EINA_TRUE); } diff --git a/legacy/eina/src/lib/eina_array.c b/legacy/eina/src/lib/eina_array.c index 02287b6206..42dfe6e878 100644 --- a/legacy/eina/src/lib/eina_array.c +++ b/legacy/eina/src/lib/eina_array.c @@ -181,21 +181,15 @@ struct _Eina_Iterator_Array unsigned int index; }; -static Eina_Bool -eina_array_iterator_next(Eina_Iterator_Array *it) -{ - if (!(it->index + 1 < eina_array_count(it->array))) - return EINA_FALSE; - it->index++; - return EINA_TRUE; -} - static void * -eina_array_iterator_get_content(Eina_Iterator_Array *it) +eina_array_iterator_next(Eina_Iterator_Array *it, void **data) { if (!(it->index < eina_array_count(it->array))) - return NULL; - return eina_array_get(it->array, it->index); + return EINA_FALSE; + if (data) + *data = eina_array_get(it->array, it->index); + it->index++; + return EINA_TRUE; } static Eina_Array * @@ -228,7 +222,6 @@ eina_array_iterator_new(const Eina_Array *array) it->array = array; it->iterator.next = FUNC_ITERATOR_NEXT(eina_array_iterator_next); - it->iterator.get_content = FUNC_ITERATOR_GET_CONTENT(eina_array_iterator_get_content); it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(eina_array_iterator_get_container); it->iterator.free = FUNC_ITERATOR_FREE(eina_array_iterator_free); @@ -241,26 +234,18 @@ struct _Eina_Accessor_Array Eina_Accessor accessor; const Eina_Array *array; - unsigned int index; }; static Eina_Bool -eina_array_accessor_jump_at(Eina_Accessor_Array *it, unsigned int index) +eina_array_accessor_jump_at(Eina_Accessor_Array *it, unsigned int index, void **data) { if (!(index < eina_array_count(it->array))) return EINA_FALSE; - it->index = index; + if (data) + *data = eina_array_get(it->array, index); return EINA_TRUE; } -static void * -eina_array_accessor_get_content(Eina_Accessor_Array *it) -{ - if (!(it->index < eina_array_count(it->array))) - return NULL; - return eina_array_get(it->array, it->index); -} - static Eina_Array * eina_array_accessor_get_container(Eina_Accessor_Array *it) { @@ -290,7 +275,6 @@ eina_array_accessor_new(const Eina_Array *array) it->array = array; it->accessor.jump_at = FUNC_ACCESSOR_JUMP_AT(eina_array_accessor_jump_at); - it->accessor.get_content = FUNC_ACCESSOR_GET_CONTENT(eina_array_accessor_get_content); it->accessor.get_container = FUNC_ACCESSOR_GET_CONTAINER(eina_array_accessor_get_container); it->accessor.free = FUNC_ACCESSOR_FREE(eina_array_accessor_free); diff --git a/legacy/eina/src/lib/eina_hash.c b/legacy/eina/src/lib/eina_hash.c index 11cd5db8a8..289fda9eb5 100644 --- a/legacy/eina/src/lib/eina_hash.c +++ b/legacy/eina/src/lib/eina_hash.c @@ -57,10 +57,14 @@ struct _Eina_Hash_Foreach const void *fdata; }; +typedef void *(*Eina_Iterator_Get_Content_Callback)(Eina_Iterator_Hash *it); +#define FUNC_ITERATOR_GET_CONTENT(Function) ((Eina_Iterator_Get_Content_Callback)Function) + struct _Eina_Iterator_Hash { Eina_Iterator iterator; + Eina_Iterator_Get_Content_Callback get_content; const Eina_Hash *hash; Eina_Inlist *current; @@ -134,8 +138,35 @@ _eina_foreach_cb(const Eina_Hash *hash, Eina_Hash_Tuple *data, Eina_Hash_Foreach return fdata->cb((Eina_Hash *) hash, data->key, data->data, (void*) fdata->fdata); } +static void * +_eina_hash_iterator_data_get_content(Eina_Iterator_Hash *it) +{ + Eina_Hash_El *stuff = (Eina_Hash_El *) it->current; + + if (!stuff) return NULL; + return stuff->tuple.data; +} + +static void * +_eina_hash_iterator_key_get_content(Eina_Iterator_Hash *it) +{ + Eina_Hash_El *stuff = (Eina_Hash_El *) it->current; + + if (!stuff) return NULL; + return (void *) stuff->tuple.key; +} + +static Eina_Hash_Tuple * +_eina_hash_iterator_tuple_get_content(Eina_Iterator_Hash *it) +{ + Eina_Hash_El *stuff = (Eina_Hash_El *) it->current; + + if (!stuff) return NULL; + return &stuff->tuple; +} + static Eina_Bool -_eina_hash_iterator_next(Eina_Iterator_Hash *it) +_eina_hash_iterator_next(Eina_Iterator_Hash *it, void **data) { Eina_Inlist *move; int bucket; @@ -170,36 +201,12 @@ _eina_hash_iterator_next(Eina_Iterator_Hash *it) it->bucket = bucket; it->current = move; + if (data) + *data = it->get_content(it); + return EINA_TRUE; } -static void * -_eina_hash_iterator_data_get_content(Eina_Iterator_Hash *it) -{ - Eina_Hash_El *stuff = (Eina_Hash_El *) it->current; - - if (!stuff) return NULL; - return stuff->tuple.data; -} - -static void * -_eina_hash_iterator_key_get_content(Eina_Iterator_Hash *it) -{ - Eina_Hash_El *stuff = (Eina_Hash_El *) it->current; - - if (!stuff) return NULL; - return (void *) stuff->tuple.key; -} - -static Eina_Hash_Tuple * -_eina_hash_iterator_tuple_get_content(Eina_Iterator_Hash *it) -{ - Eina_Hash_El *stuff = (Eina_Hash_El *) it->current; - - if (!stuff) return NULL; - return &stuff->tuple; -} - static void * _eina_hash_iterator_get_container(Eina_Iterator_Hash *it) { @@ -767,14 +774,12 @@ eina_hash_iterator_data_new(const Eina_Hash *hash) if (!it) return NULL; it->hash = hash; + it->get_content = FUNC_ITERATOR_GET_CONTENT(_eina_hash_iterator_data_get_content); it->iterator.next = FUNC_ITERATOR_NEXT(_eina_hash_iterator_next); - it->iterator.get_content = FUNC_ITERATOR_GET_CONTENT(_eina_hash_iterator_data_get_content); it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_eina_hash_iterator_get_container); it->iterator.free = FUNC_ITERATOR_FREE(_eina_hash_iterator_free); - _eina_hash_iterator_next(it); - return &it->iterator; } @@ -790,14 +795,12 @@ eina_hash_iterator_key_new(const Eina_Hash *hash) if (!it) return NULL; it->hash = hash; + it->get_content = FUNC_ITERATOR_GET_CONTENT(_eina_hash_iterator_key_get_content); it->iterator.next = FUNC_ITERATOR_NEXT(_eina_hash_iterator_next); - it->iterator.get_content = FUNC_ITERATOR_GET_CONTENT(_eina_hash_iterator_key_get_content); it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_eina_hash_iterator_get_container); it->iterator.free = FUNC_ITERATOR_FREE(_eina_hash_iterator_free); - _eina_hash_iterator_next(it); - return &it->iterator; } @@ -813,14 +816,12 @@ eina_hash_iterator_tuple_new(const Eina_Hash *hash) if (!it) return NULL; it->hash = hash; + it->get_content = FUNC_ITERATOR_GET_CONTENT(_eina_hash_iterator_tuple_get_content); it->iterator.next = FUNC_ITERATOR_NEXT(_eina_hash_iterator_next); - it->iterator.get_content = FUNC_ITERATOR_GET_CONTENT(_eina_hash_iterator_tuple_get_content); it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_eina_hash_iterator_get_container); it->iterator.free = FUNC_ITERATOR_FREE(_eina_hash_iterator_free); - _eina_hash_iterator_next(it); - return &it->iterator; } diff --git a/legacy/eina/src/tests/eina_test_accessor.c b/legacy/eina/src/tests/eina_test_accessor.c index f1720b227c..a5fd8d2486 100644 --- a/legacy/eina/src/tests/eina_test_accessor.c +++ b/legacy/eina/src/tests/eina_test_accessor.c @@ -60,7 +60,7 @@ START_TEST(eina_accessor_array_simple) it = eina_array_accessor_new(ea); fail_if(!it); - tmp = eina_accessor_data_get(it, 100); + fail_if(eina_accessor_data_get(it, 100, &tmp) != EINA_TRUE); fail_if(!tmp); fail_if(*tmp != 100); diff --git a/legacy/eina/src/tests/eina_test_iterator.c b/legacy/eina/src/tests/eina_test_iterator.c index 51e60c0171..1b5be7765e 100644 --- a/legacy/eina/src/tests/eina_test_iterator.c +++ b/legacy/eina/src/tests/eina_test_iterator.c @@ -61,16 +61,12 @@ START_TEST(eina_iterator_array_simple) it = eina_array_iterator_new(ea); fail_if(!it); - tmp = eina_iterator_data_get(it); - fail_if(!tmp); - fail_if(*tmp != 0); - i = -1; eina_iterator_foreach(it, EINA_EACH(eina_iterator_array_check), &i); fail_if(i != 199); fail_if(eina_iterator_container_get(it) != ea); - fail_if(eina_iterator_next(it) != EINA_FALSE); + fail_if(eina_iterator_next(it, &tmp) != EINA_FALSE); eina_iterator_free(it);