Add array and cleanup lalloc namespace.

SVN revision: 35257
This commit is contained in:
Cedric BAIL 2008-07-30 16:34:54 +00:00
parent 0eefad12bd
commit edce92f017
8 changed files with 198 additions and 20 deletions

View File

@ -12,6 +12,8 @@ eina_mempool.h \
eina_module.h \
eina_rectangle.h \
eina_types.h \
eina_array.h \
eina_inline_array.x \
eina_stringshare.h
installed_mainheaderdir = $(prefix)/include/eina-@VMAJ@

View File

@ -0,0 +1,24 @@
#ifndef EINA_ARRAY_H_
#define EINA_ARRAY_H_
#include "eina_types.h"
typedef struct _Eina_Array Eina_Array; /**< A generic vector */
struct _Eina_Array /** An array of data */
{
void **data; /**< Pointer to a vector of pointer to payload */
unsigned int total; /**< Total number of slot in the vector */
unsigned int count; /**< Number of activ slot in the vector */
unsigned int step; /**< How much must we grow the vector When it is full */
};
EAPI Eina_Array *eina_array_new (unsigned int step);
EAPI void eina_array_setup (Eina_Array *array, unsigned int step);
EAPI void eina_array_free (Eina_Array *array);
EAPI void eina_array_append (Eina_Array *array, void *data);
EAPI void *eina_array_get (Eina_Array *array, unsigned int index);
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);
#endif

View File

@ -0,0 +1,41 @@
#ifndef EVAS_INLINE_ARRAY_H
#define EVAS_INLINE_ARRAY_H
#ifdef __GNUC__
# define UNLIKELY(x) __builtin_expect(!!(x), 0)
#else
# define UNLIKELY(x) (x)
#endif
static inline Eina_Bool
_eina_array_grow(Eina_Array *array)
{
void **tmp;
size_t total;
total = array->total + array->step;
tmp = realloc(array->data, sizeof (void*) * total);
if (!tmp) return 0;
array->total = total;
array->data = tmp;
return 1;
}
static inline void
_eina_array_append(Eina_Array *array, void *data)
{
if (UNLIKELY((array->count + array->step) > array->total))
if (!_eina_array_grow(array)) return ;
array->data[array->count++] = data;
}
static inline void *
_eina_array_get(Eina_Array *array, unsigned int index)
{
return array->data[index];
}
#endif

View File

@ -4,20 +4,20 @@
#include "eina_types.h"
/**
* @defgroup Array_Group Array
* @defgroup Lalloc_Group Lazy allocator
* @{
*/
typedef void (*Eina_Array_Alloc) (void *user_data, int num);
#define EINA_ARRAY_ALLOC(function) ((Eina_Array_Alloc)function)
typedef void (*Eina_Array_Free) (void *user_data);
#define EINA_ARRAY_FREE(function) ((Eina_Array_Free)function)
typedef void (*Eina_Lalloc_Alloc) (void *user_data, int num);
#define EINA_LALLOC_ALLOC(function) ((Eina_Lalloc_Alloc)function)
typedef void (*Eina_Lalloc_Free) (void *user_data);
#define EINA_LALLOC_FREE(function) ((Eina_Lalloc_Free)function)
typedef struct _Eina_Array Eina_Array;
EAPI void eina_array_free(Eina_Array *a);
EAPI Eina_Array *eina_array_new(void *data, Eina_Array_Alloc alloc_cb, Eina_Array_Free free_cb, int num_init);
EAPI void eina_array_elements_add(Eina_Array *a, int num);
EAPI void eina_array_element_add(Eina_Array *a);
typedef struct _Eina_Lalloc Eina_Lalloc;
EAPI void eina_lalloc_free(Eina_Lalloc *a);
EAPI Eina_Lalloc *eina_lalloc_new(void *data, Eina_Lalloc_Alloc alloc_cb, Eina_Lalloc_Free free_cb, int num_init);
EAPI void eina_lalloc_elements_add(Eina_Lalloc *a, int num);
EAPI void eina_lalloc_element_add(Eina_Lalloc *a);
/** @} */

View File

@ -15,6 +15,7 @@ eina_mempool.c \
eina_list.c \
eina_module.c \
eina_value.c \
eina_array.c \
eina_stringshare.c
libeina_la_LIBADD = -ldl

View File

@ -0,0 +1,110 @@
/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <stdlib.h>
#include "eina_array.h"
#include "eina_inline_array.x"
EAPI void
eina_array_append(Eina_Array *array, void *data)
{
_eina_array_append(array, data);
}
EAPI void *
eina_array_get(Eina_Array *array, unsigned int index)
{
return _eina_array_get(array, index);
}
EAPI void
eina_array_clean(Eina_Array *array)
{
array->count = 0;
}
EAPI void
eina_array_setup(Eina_Array *array, unsigned int step)
{
array->step = step;
}
EAPI void
eina_array_flush(Eina_Array *array)
{
array->count = 0;
array->total = 0;
if (array->data) free(array->data);
array->data = NULL;
}
EAPI Eina_Array *
eina_array_new(unsigned int step)
{
Eina_Array *array;
array = malloc(sizeof (Eina_Array));
if (!array) return NULL;
array->data = NULL;
array->total = 0;
array->count = 0;
array->step = step;
return array;
}
EAPI void
eina_array_free(Eina_Array *array)
{
eina_array_flush(array);
free(array);
}
EAPI void
eina_array_remove(Eina_Array *array, Eina_Bool (*keep)(void *data, void *gdata), void *gdata)
{
void **tmp;
unsigned int total = 0;
unsigned int i;
if (array->total == 0) return ;
tmp = malloc(sizeof (void*) * array->total);
if (!tmp) return ;
for (i = 0; i < array->count; i++)
{
void *data;
data = _eina_array_get(array, i);
if (keep(data, gdata))
{
tmp[total] = data;
total++;
}
}
free(array->data);
if (total == 0)
{
array->total = 0;
array->data = NULL;
free(tmp);
}
else
{
array->data = tmp;
}
array->count = total;
}

View File

@ -1,25 +1,25 @@
#include "eina_lalloc.h"
#include "eina_private.h"
struct _Eina_Array
struct _Eina_Lalloc
{
void *data;
int num_allocated;
int num_elements;
int acc;
Eina_Array_Alloc alloc_cb;
Eina_Array_Free free_cb;
Eina_Lalloc_Alloc alloc_cb;
Eina_Lalloc_Free free_cb;
};
/**
* To be documented
* FIXME: To be fixed
*/
EAPI Eina_Array * eina_array_new(void *data, Eina_Array_Alloc alloc_cb, Eina_Array_Free free_cb, int num_init)
EAPI Eina_Lalloc * eina_lalloc_new(void *data, Eina_Lalloc_Alloc alloc_cb, Eina_Lalloc_Free free_cb, int num_init)
{
Eina_Array *a;
Eina_Lalloc *a;
a = calloc(1, sizeof(Eina_Array));
a = calloc(1, sizeof(Eina_Lalloc));
a->data = data;
a->alloc_cb = alloc_cb;
a->free_cb = free_cb;
@ -35,7 +35,7 @@ EAPI Eina_Array * eina_array_new(void *data, Eina_Array_Alloc alloc_cb, Eina_Arr
* To be documented
* FIXME: To be fixed
*/
EAPI void eina_array_element_add(Eina_Array *a)
EAPI void eina_lalloc_element_add(Eina_Lalloc *a)
{
if (a->num_elements == a->num_allocated)
{
@ -50,7 +50,7 @@ EAPI void eina_array_element_add(Eina_Array *a)
* To be documented
* FIXME: To be fixed
*/
EAPI void eina_array_elements_add(Eina_Array *a, int num)
EAPI void eina_lalloc_elements_add(Eina_Lalloc *a, int num)
{
int tmp;
@ -71,7 +71,7 @@ EAPI void eina_array_elements_add(Eina_Array *a, int num)
* To be documented
* FIXME: To be fixed
*/
EAPI void eina_array_free(Eina_Array *a)
EAPI void eina_lalloc_free(Eina_Lalloc *a)
{
a->free_cb(a->data);
free(a);

View File

@ -24,7 +24,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include "Eina.h"
#include "eina_types.h"
#include "eina_private.h"
EAPI const unsigned int eina_prime_table[] =