Enlightenment CVS committal Author : cedric Project : e17 Module : proto/eina
Dir : e17/proto/eina/src/lib Modified Files: eina_hash.c eina_array.c eina_accessor.c Log Message: Easier API and follow gustavo's remark. =================================================================== RCS file: /cvs/e/e17/proto/eina/src/lib/eina_hash.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- eina_hash.c 11 Aug 2008 16:30:16 -0000 1.7 +++ eina_hash.c 11 Aug 2008 17:22:36 -0000 1.8 @@ -57,10 +57,14 @@ 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 @@ 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,34 +201,10 @@ it->bucket = bucket; it->current = move; - return EINA_TRUE; -} + if (data) + *data = it->get_content(it); -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; + return EINA_TRUE; } static void * @@ -767,14 +774,12 @@ 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 @@ 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,13 +816,11 @@ 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; } =================================================================== RCS file: /cvs/e/e17/proto/eina/src/lib/eina_array.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- eina_array.c 11 Aug 2008 16:30:16 -0000 1.7 +++ eina_array.c 11 Aug 2008 17:22:36 -0000 1.8 @@ -181,23 +181,17 @@ unsigned int index; }; -static Eina_Bool -eina_array_iterator_next(Eina_Iterator_Array *it) +static void * +eina_array_iterator_next(Eina_Iterator_Array *it, void **data) { - if (!(it->index + 1 < eina_array_count(it->array))) + if (!(it->index < eina_array_count(it->array))) return EINA_FALSE; + if (data) + *data = eina_array_get(it->array, it->index); it->index++; return EINA_TRUE; } -static void * -eina_array_iterator_get_content(Eina_Iterator_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_iterator_get_container(Eina_Iterator_Array *it) { @@ -228,7 +222,6 @@ 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 @@ 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 @@ 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); =================================================================== RCS file: /cvs/e/e17/proto/eina/src/lib/eina_accessor.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- eina_accessor.c 11 Aug 2008 16:30:16 -0000 1.1 +++ eina_accessor.c 11 Aug 2008 17:22:36 -0000 1.2 @@ -32,12 +32,11 @@ 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 @@ 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); } ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs