summaryrefslogtreecommitdiff
path: root/libnul.h
diff options
context:
space:
mode:
Diffstat (limited to 'libnul.h')
-rw-r--r--libnul.h76
1 files changed, 70 insertions, 6 deletions
diff --git a/libnul.h b/libnul.h
index 3bf4106..766ea95 100644
--- a/libnul.h
+++ b/libnul.h
@@ -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