changeset 9490:a6e1f054a808 HEAD

Added array_sort() for type-safe array sorting.
author Timo Sirainen <tss@iki.fi>
date Wed, 17 Jun 2009 14:52:30 -0400
parents e8301a8f9cf7
children 0059b2381024
files src/lib/array.c src/lib/array.h
diffstat 2 files changed, 23 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/array.c	Wed Jun 17 13:05:32 2009 -0400
+++ b/src/lib/array.c	Wed Jun 17 14:52:30 2009 -0400
@@ -3,6 +3,8 @@
 #include "lib.h"
 #include "array.h"
 
+#include <stdlib.h>
+
 void *array_idx_modifiable_i(struct array *array, unsigned int idx)
 {
 	size_t pos;
@@ -85,3 +87,12 @@
 		       element_size);
 	}
 }
+
+void array_sort_i(struct array *array, int (*cmp)(const void *, const void *))
+{
+	unsigned int count;
+
+	count = array->buffer->used / array->element_size;
+	qsort(buffer_get_modifiable_data(array->buffer, NULL),
+	      count, array->element_size, cmp);
+}
--- a/src/lib/array.h	Wed Jun 17 13:05:32 2009 -0400
+++ b/src/lib/array.h	Wed Jun 17 14:52:30 2009 -0400
@@ -234,4 +234,16 @@
 #define array_reverse(array) \
 	array_reverse_i(&(array)->arr)
 
+void array_sort_i(struct array *array, int (*cmp)(const void *, const void *));
+#ifdef CONTEXT_TYPE_SAFETY
+#define array_sort(array, cmp) \
+	({(void)(1 ? 0 : cmp(ARRAY_TYPE_CAST_CONST(array)NULL, \
+			     ARRAY_TYPE_CAST_CONST(array)NULL)); \
+	array_sort_i(&(array)->arr, \
+		(int (*)(const void *, const void *))cmp); })
+#else
+#define array_sort(array, cmp) \
+	array_sort_i(&(array)->arr, (int (*)(const void *, const void *))cmp)
 #endif
+
+#endif