Mercurial > dovecot > core-2.2
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)