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
 }