Mercurial > code
changeset 117:bbe86bdb55da
Update parray for a lot of things
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 28 Feb 2012 20:57:48 +0100 |
parents | 268566dcc2c4 |
children | 3c51b1f2974e |
files | parray.c parray.h |
diffstat | 2 files changed, 51 insertions(+), 79 deletions(-) [+] |
line wrap: on
line diff
--- a/parray.c Thu Feb 16 21:01:19 2012 +0100 +++ b/parray.c Tue Feb 28 20:57:48 2012 +0100 @@ -36,10 +36,10 @@ arr->size = LENGTH(arr->bsize); - if ((arr->datas = arr->malloc(arr->size)) == NULL) + if ((arr->data = arr->malloc(arr->size)) == NULL) return -1; - memset(arr->datas, 0, arr->bsize); + memset(arr->data, 0, LENGTH(arr->bsize)); return 0; } @@ -49,7 +49,7 @@ * l -> optional array block size of type int * m -> malloc function that must matches void * (*malloc)(size_t) * r -> realloc function that must matches void * (*realloc)(void *, size_t) - * t -> type of array of type enum array_type + * t -> type of array of type int */ void @@ -68,7 +68,7 @@ arr->malloc = va_arg(ap, void * (*)(size_t)); break; case 'r': - arr->realloc = va_arg(ap, void *(*)(void *, size_t)); + arr->realloc = va_arg(ap, void * (*)(void *, size_t)); break; case 't': arr->type = va_arg(ap, int); @@ -90,26 +90,29 @@ if (parray_grow(arr) < 0) return -1; - memmove(&arr->datas[1], &arr->datas[0], LENGTH(arr->length++)); - arr->datas[0] = data; + memmove(&arr->data[1], &arr->data[0], LENGTH(arr->length++)); + arr->data[0] = data; return 0; } /* * Insert the data at the specified index. The function returns -1 on - * allocation failure or when the index is outof bounds otherwise 0 is returned. + * allocation failure. */ int parray_insert(struct parray *arr, void *data, int index) { - if (index > arr->length - 1 || index < 0 || parray_grow(arr) < 0) - return -1; + if (index < 0) + return parray_push(arr, data); + if (index >= arr->length) + return parray_append(arr, data); - memmove(&arr->datas[index + 1], &arr->datas[index], + /* Good place */ + memmove(&arr->data[index + 1], &arr->data[index], LENGTH(arr->length++ - index)); - arr->datas[index] = data; + arr->data[index] = data; return 0; } @@ -124,7 +127,7 @@ if (parray_grow(arr) < 0) return -1; - arr->datas[arr->length++] = data; + arr->data[arr->length++] = data; return 0; } @@ -137,8 +140,8 @@ parray_pop(struct parray *arr) { if (arr->length > 0) { - memmove(&arr->datas[0], &arr->datas[1], LENGTH(--arr->length)); - arr->datas[arr->length] = NULL; + memmove(&arr->data[0], &arr->data[1], LENGTH(--arr->length)); + arr->data[arr->length] = NULL; } } @@ -150,7 +153,7 @@ parray_unqueue(struct parray *arr) { if (arr->length > 0) - arr->datas[--arr->length] = NULL; + arr->data[--arr->length] = NULL; } /* @@ -158,12 +161,12 @@ */ void -parray_remove(struct parray *arr, int index) +parray_iremove(struct parray *arr, int index) { if (arr->length > 0 && index >= 0 && index < arr->length) { - memmove(&arr->datas[index], &arr->datas[index + 1], + memmove(&arr->data[index], &arr->data[index + 1], LENGTH(arr->length - index - 1)); - arr->datas[--arr->length] = NULL; + arr->data[--arr->length] = NULL; } } @@ -173,16 +176,16 @@ */ void -parray_unref(struct parray *arr, const void *data) +parray_premove(struct parray *arr, const void *data) { void *elm; int i; - for (i = 0; i < arr->length; ++i) { - elm = PARRAY_INDEX(arr, i); - - if (elm == data) - parray_remove(arr, i); + PARRAY_FOREACH(arr, elm, i) { + if (elm == data) { + parray_iremove(arr, i); + break; + } } } @@ -201,9 +204,9 @@ if (i1 >= arr->length || i1 < 0 || i2 >= arr->length || i2 < 0) return -1; - tmp = arr->datas[i1]; - arr->datas[i1] = arr->datas[i2]; - arr->datas[i2] = tmp; + tmp = arr->data[i1]; + arr->data[i1] = arr->data[i2]; + arr->data[i2] = tmp; return 0; } @@ -220,13 +223,13 @@ int found, i1, i2; for (i1 = found = 0; !found && i1 < arr->length; ++i1) - found = arr->datas[i1] == o1; + found = arr->data[i1] == o1; if (!found) return -1; for (i2 = found = 0; !found && i2 < arr->length; ++i2) - found = arr->datas[i2] == o2; + found = arr->data[i2] == o2; if (!found) return -1; @@ -245,7 +248,7 @@ int i; for (i = 0; i < arr->length; ++i) - fn(arr->datas[i], udata); + fn(arr->data[i], udata); } /* @@ -261,10 +264,10 @@ int st, i; for (i = st = 0; i < arr->length && st != 1; ++i) - st = fn(arr->datas[i], u); + st = fn(arr->data[i], u); if (st) - *(void **)ptr = arr->datas[--i]; + *(void **)ptr = arr->data[--i]; else i = -1; @@ -278,7 +281,7 @@ void parray_clear(struct parray *arr) { - memset(arr->datas, 0, arr->size); + memset(arr->data, 0, arr->size); arr->length = 0; } @@ -289,7 +292,7 @@ void parray_free(struct parray *arr) { - free(arr->datas); + free(arr->data); } /* @@ -305,7 +308,7 @@ return 0; if (arr->type == PARRAY_AUTO) { - if ((arr->datas = arr->realloc(arr->datas, arr->size + + if ((arr->data = arr->realloc(arr->data, arr->size + LENGTH(arr->bsize))) == NULL) return -1;
--- a/parray.h Thu Feb 16 21:01:19 2012 +0100 +++ b/parray.h Tue Feb 28 20:57:48 2012 +0100 @@ -29,18 +29,15 @@ #define PARRAY_DEFAULT_BSIZE 128 #endif -enum parray_type { - PARRAY_AUTO = 0, - PARRAY_FIXED = 1 -}; +#define PARRAY_AUTO 0 +#define PARRAY_FIXED 1 struct parray { - enum parray_type type; /* array type (default FIXED) */ - void **datas; /* array of data */ - int length; /* number of element inside */ - size_t size; /* current buffer size (allocated memory) */ - int bsize; /* block size (used when growing array) */ - int i; /* only for PARRAY_FOREACH(_R) */ + int type; /* array type (default FIXED) */ + void **data; /* array of data */ + int length; /* number of element inside */ + size_t size; /* current buffer size (allocated memory) */ + int bsize; /* block size (used when growing array) */ /* Own allocation functions */ void * (*malloc)(size_t); @@ -57,8 +54,8 @@ int parray_append(struct parray *, void *); void parray_pop(struct parray *); void parray_unqueue(struct parray *); -void parray_remove(struct parray *, int); -void parray_unref(struct parray *, const void *); +void parray_iremove(struct parray *, int); +void parray_premove(struct parray *, const void *); int parray_iswap(struct parray *, int, int); int parray_pswap(struct parray *, const void *, const void *); void parray_map(const struct parray *, parray_map_fn, void *); @@ -66,38 +63,10 @@ void parray_clear(struct parray *); void parray_free(struct parray *); -#define PARRAY_HEAD(a) \ - (a->datas[0]) -#define PARRAY_TAIL(a) \ - (a->datas[(a->length == 0) ? 0 : a->length - 1]) -#define PARRAY_INDEX(a, i) \ - (((i) < 0 || (a)->length == 0) ? (PARRAY_HEAD((a))) /* < 0 head */ \ - : ((i) >= (a)->length) ? (PARRAY_TAIL((a))) /* > l tail */ \ - : ((a)->datas[i])) /* correct */ - -#define PARRAY_FOREACH_R(a, var) \ - for ((a)->i = 0, var = PARRAY_TAIL((a)); \ - (a)->i < (a)->length; ++(a)->i, var = PARRAY_INDEX((a), (a)->i)) - -#define PARRAY_FOREACH(a, var) \ - for ((a)->i = 0, var = PARRAY_INDEX((a), (a)->i); \ - (a)->i < (a)->length; ++(a)->i, var = PARRAY_INDEX((a), (a)->i)) - -/* Only for PARRAY_FIXED */ -#define PARRAY_FULL(a) \ - ((a)->length == (a)->bsize) - -#define PARRAY_FLUSH(a) \ -do { \ - void *i; \ - \ - PARRAY_FOREACH_R(a, i) { \ - free(i); \ - parray_unqueue((a)); \ - } \ - \ - (a)->length = 0; \ -} while (/* CONSTCOND */ 0); +#define PARRAY_FOREACH(a, o, i) \ + for (i = 0, o = (a)->data[i]; \ + i < (a)->length; \ + ++i, o = (a)->data[i]) #ifdef __cplusplus }