forked from enlightenment/efl
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_rectangle.h \
|
||||
eina_types.h \
|
||||
eina_array.h \
|
||||
eina_inline_array.x \
|
||||
eina_stringshare.h
|
||||
|
||||
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"
|
||||
|
||||
/**
|
||||
* @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);
|
||||
|
||||
/** @} */
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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_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);
|
||||
|
|
|
@ -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[] =
|
||||
|
|
Loading…
Reference in New Issue