Add array and cleanup lalloc namespace.
SVN revision: 35257
This commit is contained in:
parent
0eefad12bd
commit
edce92f017
|
@ -12,6 +12,8 @@ eina_mempool.h \
|
||||||
eina_module.h \
|
eina_module.h \
|
||||||
eina_rectangle.h \
|
eina_rectangle.h \
|
||||||
eina_types.h \
|
eina_types.h \
|
||||||
|
eina_array.h \
|
||||||
|
eina_inline_array.x \
|
||||||
eina_stringshare.h
|
eina_stringshare.h
|
||||||
|
|
||||||
installed_mainheaderdir = $(prefix)/include/eina-@VMAJ@
|
installed_mainheaderdir = $(prefix)/include/eina-@VMAJ@
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -4,20 +4,20 @@
|
||||||
#include "eina_types.h"
|
#include "eina_types.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @defgroup Array_Group Array
|
* @defgroup Lalloc_Group Lazy allocator
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef void (*Eina_Array_Alloc) (void *user_data, int num);
|
typedef void (*Eina_Lalloc_Alloc) (void *user_data, int num);
|
||||||
#define EINA_ARRAY_ALLOC(function) ((Eina_Array_Alloc)function)
|
#define EINA_LALLOC_ALLOC(function) ((Eina_Lalloc_Alloc)function)
|
||||||
typedef void (*Eina_Array_Free) (void *user_data);
|
typedef void (*Eina_Lalloc_Free) (void *user_data);
|
||||||
#define EINA_ARRAY_FREE(function) ((Eina_Array_Free)function)
|
#define EINA_LALLOC_FREE(function) ((Eina_Lalloc_Free)function)
|
||||||
|
|
||||||
typedef struct _Eina_Array Eina_Array;
|
typedef struct _Eina_Lalloc Eina_Lalloc;
|
||||||
EAPI void eina_array_free(Eina_Array *a);
|
EAPI void eina_lalloc_free(Eina_Lalloc *a);
|
||||||
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);
|
||||||
EAPI void eina_array_elements_add(Eina_Array *a, int num);
|
EAPI void eina_lalloc_elements_add(Eina_Lalloc *a, int num);
|
||||||
EAPI void eina_array_element_add(Eina_Array *a);
|
EAPI void eina_lalloc_element_add(Eina_Lalloc *a);
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ eina_mempool.c \
|
||||||
eina_list.c \
|
eina_list.c \
|
||||||
eina_module.c \
|
eina_module.c \
|
||||||
eina_value.c \
|
eina_value.c \
|
||||||
|
eina_array.c \
|
||||||
eina_stringshare.c
|
eina_stringshare.c
|
||||||
|
|
||||||
libeina_la_LIBADD = -ldl
|
libeina_la_LIBADD = -ldl
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
|
@ -1,25 +1,25 @@
|
||||||
#include "eina_lalloc.h"
|
#include "eina_lalloc.h"
|
||||||
#include "eina_private.h"
|
#include "eina_private.h"
|
||||||
|
|
||||||
struct _Eina_Array
|
struct _Eina_Lalloc
|
||||||
{
|
{
|
||||||
void *data;
|
void *data;
|
||||||
int num_allocated;
|
int num_allocated;
|
||||||
int num_elements;
|
int num_elements;
|
||||||
int acc;
|
int acc;
|
||||||
Eina_Array_Alloc alloc_cb;
|
Eina_Lalloc_Alloc alloc_cb;
|
||||||
Eina_Array_Free free_cb;
|
Eina_Lalloc_Free free_cb;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To be documented
|
* To be documented
|
||||||
* FIXME: To be fixed
|
* 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->data = data;
|
||||||
a->alloc_cb = alloc_cb;
|
a->alloc_cb = alloc_cb;
|
||||||
a->free_cb = free_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
|
* To be documented
|
||||||
* FIXME: To be fixed
|
* 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)
|
if (a->num_elements == a->num_allocated)
|
||||||
{
|
{
|
||||||
|
@ -50,7 +50,7 @@ EAPI void eina_array_element_add(Eina_Array *a)
|
||||||
* To be documented
|
* To be documented
|
||||||
* FIXME: To be fixed
|
* 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;
|
int tmp;
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ EAPI void eina_array_elements_add(Eina_Array *a, int num)
|
||||||
* To be documented
|
* To be documented
|
||||||
* FIXME: To be fixed
|
* 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);
|
a->free_cb(a->data);
|
||||||
free(a);
|
free(a);
|
||||||
|
|
|
@ -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"
|
#include "eina_private.h"
|
||||||
|
|
||||||
EAPI const unsigned int eina_prime_table[] =
|
EAPI const unsigned int eina_prime_table[] =
|
||||||
|
|
Loading…
Reference in New Issue