changeset 8:127254037b30

Switch to a void * array instead of void **
author David Demelier <markand@malikania.fr>
date Wed, 07 Sep 2011 20:12:40 +0200
parents e8829146ebc7
children bf25ed2cf42a
files array.c array.h
diffstat 2 files changed, 47 insertions(+), 54 deletions(-) [+]
line wrap: on
line diff
--- a/array.c	Wed Sep 07 07:33:25 2011 +0200
+++ b/array.c	Wed Sep 07 20:12:40 2011 +0200
@@ -11,7 +11,7 @@
  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * WHSIZESOEVER RESULTING FROM LOSS OF USE, DSIZEA OR PROFITS, WHETHER IN AN
  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
@@ -22,30 +22,31 @@
 
 #include "array.h"
 
-#define SIZE(x)	(sizeof (void *) * (x))
+#define SIZE(x)	(arr->unit * (x))
 
 static int	array_grow(struct array *);
 
 struct array *
-array_new(const void *data, size_t bsize, int flags)
+array_new(const void *data, size_t unit, size_t bsize, int flags)
 {
 	struct array *arr;
 
-	if (!(arr = malloc(sizeof (struct array))))
+	if (unit == 0 || !(arr = malloc(sizeof (struct array))))
 		return NULL;
 
-	memset(arr, 0, sizeof (struct array));
 	arr->bsize	= (bsize == 0) ? ARRAY_DEFAULT_BSIZE : bsize;
-	arr->size	= bsize + 1;
 	arr->flags	= flags;
+	arr->unit	= unit;
+	arr->size	= SIZE(bsize);
+	arr->length	= 0;
 
-	if (!(arr->data = calloc(bsize + 1, sizeof (void *)))) {
+	if (!(arr->data = malloc(arr->size))) {
 		free(arr);
 		return NULL;
 	}
 
 	if (data)
-		arr->data[arr->length++] = (void *) data;
+		memcpy(&arr->data[0], data, arr->unit);
 
 	return arr;
 }
@@ -63,8 +64,8 @@
 	if (array_grow(arr) < 0)
 		return -1;
 
-	memmove(arr->data + 1, arr->data, SIZE(arr->length++));
-	arr->data[0] = (void *) data;
+	memmove(&arr->data[SIZE(1)], arr->data, SIZE(arr->length++));
+	memcpy(&arr->data[0], data, arr->unit);
 
 	return 0;
 }
@@ -81,9 +82,9 @@
 	if (index > arr->length - 1 || index < 0 || array_grow(arr) < 0)
 		return -1;
 
-	memmove(arr->data + index + 1, arr->data + index,
+	memmove(&arr->data[SIZE(index + 1)], &arr->data[SIZE(index)],
 	    SIZE(arr->length++ - index));
-	arr->data[index] = (void *) data;
+	memcpy(&arr->data[SIZE(index)], data, arr->unit);
 
 	return 0;
 }
@@ -98,7 +99,7 @@
 	if (array_grow(arr) < 0)
 		return -1;
 
-	arr->data[arr->length++] = (void *) data;
+	memcpy(&arr->data[SIZE(arr->length++)], data, arr->unit);
 
 	return 0;
 }
@@ -116,9 +117,9 @@
 	if (arr->length == 0)
 		return NULL;
 
-	data = arr->data[0];
-	memmove(arr->data, arr->data + 1, SIZE(arr->length));
-	arr->data[--arr->length] = NULL;
+	data = &arr->data[0];
+	memmove(&arr->data[0], &arr->data[SIZE(1)], SIZE(arr->length));
+	memset(&arr->data[SIZE(--arr->length)], 0, arr->unit);
 
 	return data;
 }
@@ -136,8 +137,8 @@
 	if (arr->length == 0)
 		return NULL;
 
-	data = arr->data[--arr->length];
-	arr->data[arr->length] = NULL;
+	data = &arr->data[SIZE(--arr->length)];
+	memset(&arr->data[SIZE(arr->length)], 0, arr->unit);
 
 	return data;
 }
@@ -155,10 +156,10 @@
 	if (arr->length == 0 || index < 0 || index > arr->length - 1)
 		return NULL;
 
-	data = arr->data[index];
-	memmove(arr->data + index, arr->data + index + 1,
+	data = &arr->data[index];
+	memmove(&arr->data[index], &arr->data[index + 1],
 	    SIZE(arr->length - index));
-	arr->data[--arr->length] = NULL;
+	memset(&arr->data[SIZE(--arr->length)], 0, arr->unit);
 
 	return data;
 }
@@ -171,10 +172,10 @@
 void
 array_map(struct array *arr, void (*fn)(void *, void *), void *udata)
 {
-	size_t i;
+	int i;
 
-	for (i = 0; arr->data[i]; ++i)
-		fn(arr->data[i], udata);
+	for (i = 0; i < arr->length; ++i)
+		fn(&arr->data[i], udata);
 }
 
 /*
@@ -187,15 +188,14 @@
 void *
 array_find(struct array *arr, int (*fn)(void *, void *), void *udata, int *idx)
 {
-	size_t i;
-	int st;
+	int st, i;
 	void *data;
 
-	for (i = st = 0; arr->data[i] && !st; ++i)
-		st = fn(arr->data[i], udata);
+	for (i = st = 0; i < arr->length && !st; ++i)
+		st = fn(&arr->data[i], udata);
 
 	if (st)	{
-		data = arr->data[--i];
+		data = &arr->data[--i];
 		if (idx)
 			*idx = i;
 	} else
@@ -210,16 +210,9 @@
  */
 
 void
-array_clear(struct array *arr, int trashit)
+array_clear(struct array *arr)
 {
-	if (trashit) {
-		size_t i;
-
-		for (i = 0; arr->data[i]; ++i)
-			free(arr->data[i]);
-	}
-
-	memset(arr->data, 0, SIZE(arr->size));
+	memset(arr->data, 0, arr->size);
 	arr->length = 0;
 }
 
@@ -228,9 +221,9 @@
  */
 
 void
-array_free(struct array *arr, int trashit)
+array_free(struct array *arr)
 {
-	array_clear(arr, trashit);
+	array_clear(arr);
 
 	free(arr->data);
 	free(arr);
@@ -245,18 +238,17 @@
 static int
 array_grow(struct array *arr)
 {
-	if (arr->size - 1 > arr->length)
+	if (arr->size / arr->unit > arr->length)
 		return 0;
 
 	if (arr->flags & ARRAY_AUTO) {
-		if (!(arr->data = realloc(arr->data, SIZE(arr->size + arr->bsize))))
+		if (!(arr->data = realloc(arr->data, arr->size +
+		    SIZE(arr->bsize))))
 			return -1;
 
 		arr->size += arr->bsize;
 	} else
-		return (arr->size - 1 == arr->length) ? -1 : 0;
-
-	memset(arr->data + arr->length, 0, SIZE(arr->size - arr->length));
+		return ((arr->size / arr->unit) <= arr->length) ? -1 : 0;
 
 	return 0;
 }
--- a/array.h	Wed Sep 07 07:33:25 2011 +0200
+++ b/array.h	Wed Sep 07 20:12:40 2011 +0200
@@ -22,8 +22,8 @@
 #define ARRAY_DEFAULT_BSIZE	128
 
 struct array {
-	void	**data;	/* array of data */
-	size_t	length;	/* number of element in array */
+	void	*data;	/* array of data */
+	int	length;	/* number of element inside */
 
 #define ARRAY_FIXED	0x00000000
 #define ARRAY_AUTO	0x00000001
@@ -31,12 +31,13 @@
 
 	/* Private should not be modified by user */
 	size_t	size;	/* current buffer size */
-	size_t	bsize;	/* block size */
+	size_t	bsize;	/* block size (used when growing array) */
+	size_t	unit;	/* unit size (sizeof the object) */
 };
 
-struct array	*array_new(const void *, size_t, int);
-#define array_new_auto(size)	array_new(NULL, size, ARRAY_AUTO)
-#define array_new_fixed(max)	array_new(NULL, max, ARRAY_FIXED)
+struct array	*array_new(const void *, size_t, size_t, 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)
 
 int	array_push(struct array *, const void *);
 int	array_insert(struct array *, const void *, int);
@@ -46,12 +47,12 @@
 void	*array_remove(struct array *, int);
 void	array_map(struct array *, void (*fn)(void *, void *), void *);
 void	*array_find(struct array *, int (*fn)(void *, void *), void *, int *);
-void	array_clear(struct array *, int);
-void	array_free(struct array *, int);
+void	array_clear(struct array *);
+void	array_free(struct array *);
 
 #define ARRAY_FOREACH(array, entry, tmp, type)					\
 	for ((tmp) = (type **) (array)->data, entry = *tmp;			\
 	    (entry) != NULL;							\
 	    ++(tmp), (entry) = (*tmp))
 
-#endif /* _ARRAY_H */
+#endif /* _ARRAY_H_ */