changeset 4601:664011f3b1fb HEAD

Some more array changes. v and v_modifiable are now pointer-to-pointers so that they can actually be used to access the array's contents directly. Only array_idx() uses this currently though, and only if asserts are disabled.
author Timo Sirainen <tss@iki.fi>
date Sat, 16 Sep 2006 16:31:14 +0300
parents 40e3583001ad
children 444edc8abef9
files src/lib/array-decl.h src/lib/array.h
diffstat 2 files changed, 14 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/array-decl.h	Mon Sep 11 22:13:04 2006 +0300
+++ b/src/lib/array-decl.h	Sat Sep 16 16:31:14 2006 +0300
@@ -1,11 +1,11 @@
 #ifndef __ARRAY_DECL_H
 #define __ARRAY_DECL_H
 
-#define ARRAY_DEFINE(name, array_type) union { struct array arr; array_type const *v; array_type *v_modifiable; } name
+#define ARRAY_DEFINE(name, array_type) union { struct array arr; array_type const *const *v; array_type **v_modifiable; } name
 #define ARRAY_INIT { { 0, 0 } }
 
 #define ARRAY_DEFINE_TYPE(name, array_type) \
-	union array ## __ ## name { struct array arr; array_type const *v; array_type *v_modifiable; }
+	union array ## __ ## name { struct array arr; array_type const *const *v; array_type **v_modifiable; }
 #define ARRAY_TYPE(name) \
 	union array ## __ ## name
 
--- a/src/lib/array.h	Mon Sep 11 22:13:04 2006 +0300
+++ b/src/lib/array.h	Sat Sep 16 16:31:14 2006 +0300
@@ -33,7 +33,7 @@
 #include "buffer.h"
 
 #define p_array_init(array, pool, init_count) \
-	array_create(array, pool, sizeof(*(array)->v), init_count);
+	array_create(array, pool, sizeof(**(array)->v), init_count);
 #define i_array_init(array, init_count) \
 	p_array_init(array, default_pool, init_count)
 #define t_array_init(array, init_count) \
@@ -41,11 +41,11 @@
 
 #ifdef __GNUC__
 #  define ARRAY_TYPE_CAST_CONST(array) \
-	(typeof((array)->v))
+	(typeof(*(array)->v))
 #  define ARRAY_TYPE_CAST_MODIFIABLE(array) \
-	(typeof((array)->v_modifiable))
+	(typeof(*(array)->v_modifiable))
 #  define ARRAY_TYPE_CHECK(array, data) \
-	typeof(const typeof(*(array)->v_modifiable) *) \
+	typeof(const typeof(**(array)->v_modifiable) *) \
 		__tmp_array_data2 __attr_unused__ = \
 			(typeof(const typeof(typeof(*(data)) *)))NULL;
 #else
@@ -159,8 +159,13 @@
 	i_assert(idx * array->element_size < array->buffer->used);
 	return CONST_PTR_OFFSET(array->buffer->data, idx * array->element_size);
 }
-#define array_idx(array, idx) \
+#ifdef DISABLE_ASSERTS
+#  define array_idx(array, idx) \
+	&((*(array)->v)[idx])
+#else
+#  define array_idx(array, idx) \
 	ARRAY_TYPE_CAST_CONST(array)_array_idx(&(array)->arr, idx)
+#endif
 
 static inline void *
 _array_get_modifiable(struct array *array, unsigned int *count_r)
@@ -186,9 +191,9 @@
 	}
 	return buffer_get_space_unsafe(array->buffer, pos, array->element_size);
 }
-#define array_idx_modifiable(array, count) \
+#define array_idx_modifiable(array, idx) \
 	ARRAY_TYPE_CAST_MODIFIABLE(array) \
-		_array_idx_modifiable(&(array)->arr, count)
+		_array_idx_modifiable(&(array)->arr, idx)
 
 static inline void
 _array_idx_set(struct array *array, unsigned int idx, const void *data)