changeset 9607:55690917fefb HEAD

Added type safe array_bsearch().
author Timo Sirainen <tss@iki.fi>
date Fri, 10 Jul 2009 13:59:16 -0400
parents 26ff48e47764
children 5ab09480d6b4
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	Fri Jul 10 13:49:17 2009 -0400
+++ b/src/lib/array.c	Fri Jul 10 13:59:16 2009 -0400
@@ -96,3 +96,13 @@
 	qsort(buffer_get_modifiable_data(array->buffer, NULL),
 	      count, array->element_size, cmp);
 }
+
+void *array_bsearch_i(struct array *array, const void *key,
+		     int (*cmp)(const void *, const void *))
+{
+	unsigned int count;
+
+	count = array->buffer->used / array->element_size;
+	return bsearch(key, array->buffer->data,
+		       count, array->element_size, cmp);
+}
--- a/src/lib/array.h	Fri Jul 10 13:49:17 2009 -0400
+++ b/src/lib/array.h	Fri Jul 10 13:59:16 2009 -0400
@@ -246,4 +246,17 @@
 	array_sort_i(&(array)->arr, (int (*)(const void *, const void *))cmp)
 #endif
 
+void *array_bsearch_i(struct array *array, const void *key,
+		      int (*cmp)(const void *, const void *));
+#ifdef CONTEXT_TYPE_SAFETY
+#define array_bsearch(array, key, cmp) \
+	({(void)(1 ? 0 : cmp(key, ARRAY_TYPE_CAST_CONST(array)NULL)); \
+	array_bsearch_i(&(array)->arr, (const void *)key, \
+		(int (*)(const void *, const void *))cmp); })
+#else
+#define array_bsearch(array, key, cmp) \
+	array_bsearch_i(&(array)->arr, (const void *)key, \
+		(int (*)(const void *, const void *))cmp)
 #endif
+
+#endif