Easier API and follow gustavo's remark.

SVN revision: 35440
This commit is contained in:
Cedric BAIL 2008-08-11 17:22:36 +00:00
parent fd4aae2064
commit a46c20d137
8 changed files with 59 additions and 94 deletions

View File

@ -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,

View File

@ -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,

View File

@ -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_ */

View File

@ -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);
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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);

View File

@ -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);