Enlightenment CVS committal Author : cedric Project : e17 Module : proto/eina
Dir : e17/proto/eina/src/include Modified Files: Makefile.am eina_array.h eina_hash.h eina_private.h Added Files: eina_accessor.h eina_iterator.h Log Message: Add first try for an accessor and iterator API, comment welcome (lack inlist and list currently). Rewrite EINA_ARRAY_ITER_NEXT, still fast, need one more parameter, but no more EINA_ARRAY_ITER_END. =================================================================== RCS file: /cvs/e/e17/proto/eina/src/include/Makefile.am,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- Makefile.am 8 Aug 2008 14:20:11 -0000 1.7 +++ Makefile.am 11 Aug 2008 16:30:15 -0000 1.8 @@ -18,7 +18,9 @@ eina_inline_array.x \ eina_magic.h \ eina_stringshare.h \ -eina_inline_list.x +eina_inline_list.x \ +eina_accessor.h \ +eina_iterator.h installed_mainheaderdir = $(prefix)/include/[EMAIL PROTECTED]@ installed_mainheader_DATA = Eina.h =================================================================== RCS file: /cvs/e/e17/proto/eina/src/include/eina_array.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- eina_array.h 8 Aug 2008 15:56:17 -0000 1.7 +++ eina_array.h 11 Aug 2008 16:30:15 -0000 1.8 @@ -22,8 +22,12 @@ #include <stdlib.h> #include "eina_types.h" +#include "eina_iterator.h" +#include "eina_accessor.h" typedef struct _Eina_Array Eina_Array; /**< A generic vector */ +typedef void** Eina_Array_Iterator; + struct _Eina_Array /** An array of data */ { void **data; /**< Pointer to a vector of pointer to payload */ @@ -42,16 +46,17 @@ EAPI void eina_array_flush (Eina_Array *array); EAPI void eina_array_remove (Eina_Array *array, Eina_Bool (*keep)(void *data, void *gdata), void *gdata); -static inline void * eina_array_get (Eina_Array *array, unsigned int index); -static inline void eina_array_append (Eina_Array *array, void *data); -static inline unsigned int eina_array_count (Eina_Array *array); +EAPI Eina_Iterator *eina_array_iterator_new(const Eina_Array *array); +EAPI Eina_Accessor *eina_array_accessor_new(const Eina_Array *array); -#define EINA_ARRAY_ITER_NEXT(array, index, item) \ - for ((index) = 0; (index) < eina_array_count(array); ++(index)) \ - { \ - (item) = eina_array_get((array), (index)); +static inline void * eina_array_get (const Eina_Array *array, unsigned int index); +static inline void eina_array_append (Eina_Array *array, void *data); +static inline unsigned int eina_array_count (const Eina_Array *array); -#define EINA_ARRAY_ITER_END } +#define EINA_ARRAY_ITER_NEXT(array, index, item, iterator) \ + for (index = 0, iterator = (array)->data, item = iterator != NULL ? *(iterator) : NULL; \ + index < eina_array_count(array); \ + ++(index), item = *(++(iterator))) #include "eina_inline_array.x" =================================================================== RCS file: /cvs/e/e17/proto/eina/src/include/eina_hash.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- eina_hash.h 6 Aug 2008 18:15:19 -0000 1.4 +++ eina_hash.h 11 Aug 2008 16:30:16 -0000 1.5 @@ -21,11 +21,21 @@ #define EINA_HASH_H_ #include "eina_types.h" +#include "eina_iterator.h" /** * */ typedef struct _Eina_Hash Eina_Hash; +typedef struct _Eina_Hash_Tuple Eina_Hash_Tuple; +struct _Eina_Hash_Tuple +{ + const void *key; + void *data; + + unsigned int key_length; +}; + typedef unsigned int (*Eina_Key_Length)(const void *key); #define EINA_KEY_LENGTH(Function) ((Eina_Key_Length)Function) typedef int (*Eina_Key_Cmp)(const void *key1, int key1_length, @@ -66,7 +76,10 @@ const void *key, int key_length, int key_hash, const void *data); -/* FIXME: Should go with iterator support. */ +EAPI Eina_Iterator * eina_hash_iterator_key_new(const Eina_Hash *hash); +EAPI Eina_Iterator * eina_hash_iterator_data_new(const Eina_Hash *hash); +EAPI Eina_Iterator * eina_hash_iterator_tuple_new(const Eina_Hash *hash); + typedef Eina_Bool (*Eina_Foreach)(const Eina_Hash *hash, const void *key, void *data, void *fdata); EAPI void eina_hash_foreach(const Eina_Hash *hash, Eina_Foreach cb, =================================================================== RCS file: /cvs/e/e17/proto/eina/src/include/eina_private.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- eina_private.h 6 Aug 2008 18:15:19 -0000 1.7 +++ eina_private.h 11 Aug 2008 16:30:16 -0000 1.8 @@ -39,6 +39,9 @@ #include <assert.h> +#include "eina_iterator.h" +#include "eina_accessor.h" + #ifndef PATH_MAX # define PATH_MAX 4096 #endif @@ -111,5 +114,41 @@ void (*shutdown)(void *data); } 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 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 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; +}; + +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_ */ ------------------------------------------------------------------------- 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