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])