Mercurial > code
changeset 59:8a8db17c02a4
parray.h
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 09 Nov 2011 19:24:17 +0100 |
parents | 669f2734557d |
children | d6d8b753d7de |
files | array.c array.h parray.h |
diffstat | 3 files changed, 39 insertions(+), 30 deletions(-) [+] |
line wrap: on
line diff
--- a/array.c Wed Nov 09 18:36:04 2011 +0100 +++ b/array.c Wed Nov 09 19:24:17 2011 +0100 @@ -151,7 +151,7 @@ int i; for (i = 0; i < arr->length; ++i) { - elm = ARRAY_INDEX(arr, i); + elm = (char *) arr->data + OFFSET(i); if (memcmp(elm, data, arr->unit) == 0) array_remove(arr, i);
--- a/array.h Wed Nov 09 18:36:04 2011 +0100 +++ b/array.h Wed Nov 09 19:24:17 2011 +0100 @@ -21,11 +21,11 @@ /* Add some nonnull attributes for gcc/clang */ #ifdef __GNUC__ -#define __at_malloc __attribute__ ((malloc)) -#define __at_nonnull(...) __attribute__ ((nonnull (__VA_ARGS__))) +# define __at_malloc __attribute__ ((malloc)) +# define __at_nonnull(...) __attribute__ ((nonnull (__VA_ARGS__))) #else -#define __at_malloc -#define __at_nonnull(...) +# define __at_malloc +# define __at_nonnull(...) #endif #define ARRAY_DEFAULT_BSIZE 128 @@ -63,21 +63,21 @@ void array_clear(struct array *) __at_nonnull(1); void array_free(struct array *) __at_nonnull(1); -#define ARRAY_HEAD(a) \ - (a->data) -#define ARRAY_TAIL(a) \ - ((void *) ((char *) (a)->data + \ - ((a)->unit * (((a)->length == 0) ? 0 : ((a)->length - 1))))) -#define ARRAY_INDEX(a, i) \ - (((i) < 0 || (a)->length == 0) ? (ARRAY_HEAD((a))) /* < 0 head */ \ - : ((i) >= (a)->length) ? (ARRAY_TAIL((a))) /* > l tail */ \ - : ((void *) ((char *) (a)->data + ((a)->unit * (i))))) /* correct */ +#define ARRAY_HEAD(a, type) \ + (((type *)a->data)[0]) +#define ARRAY_TAIL(a, type) \ + (((type *)a->data)[(a->length == 0) ? 0 : a->length - 1]) +#define ARRAY_INDEX(a, i, type) \ + ((type *)(a)->data)[((i) < 0) \ + ? 0 : ((i) >= (a)->length) ? (a)->length - 1 : (i)] #define ARRAY_FOREACH_R(a, var) \ for ((a)->i = 0, var = ARRAY_TAIL((a)); \ (a)->i < (a)->length; ++(a)->i, --var) -#define ARRAY_FOREACH(a, var) \ - for ((a)->i = 0, var = (a)->data; (a)->i < (a)->length; ++(a)->i, ++var) +#define ARRAY_FOREACH(a, var, type) \ + for ((a)->i = 0, var = ARRAY_HEAD((a), type); \ + (a)->i < (a)->length; \ + ++(a)->i, var = ARRAY_INDEX((a), (a)->i, type)) #endif /* _ARRAY_H_ */
--- a/parray.h Wed Nov 09 18:36:04 2011 +0100 +++ b/parray.h Wed Nov 09 19:24:17 2011 +0100 @@ -19,6 +19,15 @@ #ifndef _PARRAY_H_ #define _PARRAY_H_ +/* Add some nonnull attributes for gcc/clang */ +#ifdef __GNUC__ +# define __at_malloc __attribute__ ((malloc)) +# define __at_nonnull(...) __attribute__ ((nonnull (__VA_ARGS__))) +#else +# define __at_malloc +# define __at_nonnull(...) +#endif + #define PARRAY_DEFAULT_BSIZE 128 enum parray_type { @@ -38,20 +47,20 @@ typedef void (*parray_map_fn)(void *, void *); typedef int (*parray_cmp_fn)(void *, void *); -struct parray *parray_new(enum parray_type, int); -int parray_push(struct parray *, void *); -int parray_insert(struct parray *, void *, int); -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 *); -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 *); -void *parray_find(const struct parray *, parray_cmp_fn, int *, void *); -void parray_clear(struct parray *); -void parray_free(struct parray *); +struct parray *parray_new(enum parray_type, int) __at_malloc; +int parray_push(struct parray *, void *) __at_nonnull(1); +int parray_insert(struct parray *, void *, int) __at_nonnull(1); +int parray_append(struct parray *, void *) __at_nonnull(1); +void parray_pop(struct parray *) __at_nonnull(1); +void parray_unqueue(struct parray *) __at_nonnull(1); +void parray_remove(struct parray *, int) __at_nonnull(1); +void parray_unref(struct parray *, const void *) __at_nonnull(1); +int parray_iswap(struct parray *, int, int) __at_nonnull(1); +int parray_pswap(struct parray *, const void *, const void *) __at_nonnull(1); +void parray_map(const struct parray *, parray_map_fn, void *) __at_nonnull(1, 2); +void *parray_find(const struct parray *, parray_cmp_fn, int *, void *) __at_nonnull(1, 2); +void parray_clear(struct parray *) __at_nonnull(1); +void parray_free(struct parray *) __at_nonnull(1); #define PARRAY_HEAD(a) \ (a->datas[0])