diff array.h @ 34:653bb22d3c0c

For array.c: o No index needed in ARRAY_FOREACH or ARRAY_FOREACH_R, it is stored in the structure. o Added a function to remove by data : array_unref()
author David Demelier <markand@malikania.fr>
date Fri, 30 Sep 2011 16:38:40 +0200
parents e2c3a0a549d2
children 70a7bbe96b1d
line wrap: on
line diff
--- a/array.h	Sun Sep 25 19:16:21 2011 +0200
+++ b/array.h	Fri Sep 30 16:38:40 2011 +0200
@@ -21,22 +21,23 @@
 
 #define ARRAY_DEFAULT_BSIZE	128
 
+#define ARRAY_FIXED	0x00
+#define ARRAY_AUTO	0x01
+
 struct array {
 	void	*data;	/* array of data */
-	void	*tmp;	/* only used for array_swap() */
 	int	length;	/* number of element inside */
+	int	type;	/* array's flags (default FIXED) */
+	size_t	size;	/* current buffer size (allocated memory) */
+	size_t	unit;	/* unit size (sizeof the object) */
+	int	bsize;	/* block size (used when growing array) */
 
-#define ARRAY_FIXED	0x00000000
-#define ARRAY_AUTO	0x00000001
-	int	flags;	/* array's flags (default FIXED) */
-
-	/* Private should not be modified by user */
-	size_t	size;	/* current buffer size */
-	size_t	unit;	/* unit size (sizeof the object) */
-	size_t	bsize;	/* block size (used when growing array) */
+	/* Private, do not modify */
+	void	*_tmp;	/* only used for array_swap() */
+	int	_i;	/* only for ARRAY_FOREACH(_R) */
 };
 
-struct array	*array_new(const void *, size_t, size_t, int);
+struct array	*array_new(const void *, size_t, int, int);
 #define array_new_auto(size)		array_new(NULL, size, 0, ARRAY_AUTO)
 #define array_new_fixed(size, max)	array_new(NULL, size, max, ARRAY_FIXED)
 
@@ -46,23 +47,27 @@
 void	array_pop(struct array *);
 void	array_unqueue(struct array *);
 void	array_remove(struct array *, int);
+void	array_unref(struct array *, const void *);
 int	array_swap(struct array *, int, int);
 void	array_map(const struct array *, void (*fn)(void *, void *), void *);
 void	*array_find(const struct array *, int (*fn)(void *, void *), int *, void *);
 void	array_clear(struct array *);
 void	array_free(struct array *);
 
-#define ARRAY_FOREACH(a, var, i)						\
-	for (i = 0, var = a->data; i < a->length; ++i, ++var)
+#define ARRAY_FOREACH(a, var)							\
+	for (a->_i = 0, var = a->data; a->_i < a->length; ++a->_i, ++var)
 
-#define ARRAY_FOREACH_R(a, var, i)						\
-	for (i = 0,								\
+#define ARRAY_FOREACH_R(a, var)							\
+	for (a->_i = 0,								\
 	    var = (void *) ((char *) a->data + a->unit * (a->length - 1));	\
-	    i < a->length; ++i, --var)	
+	    a->_i < a->length; ++a->_i, --var)	
 
 #define ARRAY_HEAD(a)								\
 	a->data
 #define ARRAY_TAIL(a)								\
 	(void *) ((char *) a->data + (a->unit * (a->length - 1)))
+#define ARRAY_INDEX(a, i)							\
+	(void *) ((char *) a->data + (a->unit *					\
+	    ((i >= a->length) ? (a->length -1) : i)))
 
 #endif /* _ARRAY_H_ */