diff options
Diffstat (limited to 'libnul.h')
-rw-r--r-- | libnul.h | 76 |
1 files changed, 70 insertions, 6 deletions
@@ -44,19 +44,36 @@ #define G_GNUC_WARN_UNUSED_RESULT #endif /* __GNUC__ */ +#define NUL_COMPILE_TIME_ASSERT(condition,text) \ + typedef char nul_error_##text[(condition)? 1 : -1] + #define NUL_UR G_GNUC_WARN_UNUSED_RESULT typedef void * nul_ptr_t; typedef void * const nul_const_ptr_t; /* - * Generic arrays + * Generic array implementation */ -nul_ptr_t nul_array_new (int element_size) NUL_UR; -nul_ptr_t nul_array_new_prefix (int element_size, int prefix_size); NUL_UR; -nul_ptr_t nul_array_append (nul_ptr_t array, nul_ptr_t element) NUL_UR; -gsize nul_array_len (nul_ptr_t array); -void nul_array_free (nul_ptr_t array); +nul_ptr_t nul_garray_new (int element_size) NUL_UR; +nul_ptr_t nul_garray_new_prefix (int element_size, int prefix_size) NUL_UR; +nul_ptr_t nul_garray_append (nul_ptr_t array, nul_ptr_t element) NUL_UR; +gsize nul_garray_len (nul_ptr_t array); +void nul_garray_free (nul_ptr_t array); + +#define nul_array_new(type) _nul_array_new_impl(type) +#define nul_array_append(array,value) _nul_array_append_impl(array,value) +#define nul_array_len(array) nul_garray_len(array) +#define nul_array_free(array) nul_garray_free(array) + +#define nul_prefix_array_new(type,member) \ + _nul_prefix_array_new_impl(type,member) +#define nul_prefix_array_append(array,member,value) \ + _nul_prefix_array_append_impl(array,member,value) +#define nul_prefix_array_len(array,member) \ + _nul_prefix_array_len_impl(array,member) +#define nul_prefix_array_free(array,member) \ + _nul_prefix_array_free_impl(array,member) /* * Pointer arrays @@ -320,4 +337,51 @@ void nul_dbus_invoke (nul_dbus_service_t *service, gpointer data, ...); + + +/* Implementation of the array macros */ + +#define _NUL_TYPE_CHECK_ARRAY(array,value) \ + NUL_COMPILE_TIME_ASSERT( \ + __builtin_types_compatible_p(typeof (*array),typeof(value)), \ + incompatible_types \ + ) + +#define _nul_array_new_impl(type) \ + ((type *)nul_garray_new(sizeof(type))) + +#define _nul_array_append_impl(array,value) \ + ((typeof (array)) \ + nul_garray_append(array, ({ \ + typeof (value) __nul_temp = value; \ + _NUL_TYPE_CHECK_ARRAY(array,value); \ + &__nul_temp; \ + }))) + +#define _nul_prefix_array_new_impl(type,member) \ + ((type *)nul_garray_new_prefix( \ + sizeof(((type *)NULL)->member[0]), \ + NUL_STRUCT_OFFSET(type,member))) + +#define _nul_prefix_array_append_impl(array,member,value) \ + ((typeof (array)) \ + nul_garray_append(array, ({ \ + typeof (value) __nul_temp = (value); \ + _NUL_TYPE_CHECK_ARRAY(&((array)->member)[0], (value)); \ + &__nul_temp; \ + }))) + +#define _nul_prefix_array_len_impl(array,member) \ + ({ (void)((array)->member); \ + nul_garray_len(array); \ + }) + +#define _nul_prefix_array_free_impl(array,member) \ + ({ (void)((array)->member); \ + nul_garray_free(array); \ + }) + + + + #endif |