Make inline only usefull function.

Return information about potential error during eina_array_remove.



SVN revision: 35888
This commit is contained in:
Cedric BAIL 2008-09-08 12:19:15 +00:00
parent facaddde1f
commit c52f7b7b62
4 changed files with 35 additions and 26 deletions

View File

@ -64,7 +64,7 @@ EAPI void eina_array_free (Eina_Array *array);
EAPI void eina_array_step_set (Eina_Array *array, unsigned int step);
EAPI void eina_array_clean (Eina_Array *array);
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);
EAPI Eina_Bool eina_array_remove (Eina_Array *array, Eina_Bool (*keep)(void *data, void *gdata), void *gdata);
static inline Eina_Bool eina_array_push (Eina_Array *array, const void *data);
static inline void *eina_array_pop (Eina_Array *array);

View File

@ -29,25 +29,7 @@
* @cond LOCAL
*/
static inline Eina_Bool
eina_array_grow(Eina_Array *array)
{
void **tmp;
unsigned int total;
total = array->total + array->step;
eina_error_set(0);
tmp = realloc(array->data, sizeof (void*) * total);
if (UNLIKELY(!tmp)) {
eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
return 0;
}
array->total = total;
array->data = tmp;
return 1;
}
EAPI Eina_Bool eina_array_grow(Eina_Array *array);
/**
* @endcond

View File

@ -102,6 +102,26 @@ eina_array_accessor_free(Eina_Accessor_Array *it)
free(it);
}
EAPI Eina_Bool
eina_array_grow(Eina_Array *array)
{
void **tmp;
unsigned int total;
total = array->total + array->step;
eina_error_set(0);
tmp = realloc(array->data, sizeof (void*) * total);
if (UNLIKELY(!tmp)) {
eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
return 0;
}
array->total = total;
array->data = tmp;
return 1;
}
/**
* @endcond
*/
@ -268,8 +288,12 @@ eina_array_flush(Eina_Array *array)
* with the function @p keep. @p gdata is an additional data to pass
* to @p keep. For performance reasons, there is no check of @p
* array. If it is @c NULL or invalid, the program may crash.
*
* This function always return a valid array. If it wasn't able to
* remove items due to an allocation failure, it will return EINA_FALSE
* and the error is set to #EINA_ERROR_OUT_OF_MEMORY.
*/
EAPI void
EAPI Eina_Bool
eina_array_remove(Eina_Array *array, Eina_Bool (*keep)(void *data, void *gdata), void *gdata)
{
void **tmp;
@ -278,7 +302,7 @@ eina_array_remove(Eina_Array *array, Eina_Bool (*keep)(void *data, void *gdata),
unsigned int limit;
unsigned int i;
if (array->total == 0) return ;
if (array->total == 0) return EINA_TRUE;
for (i = 0; i < array->count; ++i)
{
@ -305,14 +329,14 @@ eina_array_remove(Eina_Array *array, Eina_Bool (*keep)(void *data, void *gdata),
array->data = NULL;
}
return ;
return EINA_TRUE;
}
eina_error_set(0);
tmp = malloc(sizeof (void*) * array->total);
if (!tmp) {
eina_error_set(EINA_ERROR_OUT_OF_MEMORY);
return ;
return EINA_FALSE;
}
memcpy(tmp, array->data, limit * sizeof(void*));
@ -344,6 +368,8 @@ eina_array_remove(Eina_Array *array, Eina_Bool (*keep)(void *data, void *gdata),
array->data = tmp;
array->count = total;
return EINA_TRUE;
}
/**

View File

@ -1,3 +1,4 @@
/* EINA - EFL data type library
* Copyright (C) 2008 Cedric Bail
*
@ -75,7 +76,7 @@ START_TEST(eina_array_static)
eina_array_init();
eina_array_setup(&sea, 10);
eina_array_step_set(&sea, 10);
for (i = 0; i < 200; ++i)
{
@ -144,7 +145,7 @@ START_TEST(eina_array_remove_stuff)
fail_if(!tmp);
*tmp = 0;
}
eina_array_remove(ea, keep_int, NULL);
fail_if(eina_array_remove(ea, keep_int, NULL) != EINA_TRUE);
fail_if(eina_array_count(ea) != 990);
EINA_ARRAY_ITER_NEXT(ea, i, tmp, it)