|
|
|
@ -361,4 +361,42 @@ |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
#define TYPED_GPTRARRAY_FULL(type_name, contained_type, free_func) \ |
|
|
|
typedef union { \ |
|
|
|
GPtrArray a; \ |
|
|
|
struct { \ |
|
|
|
contained_type **pdata; \ |
|
|
|
unsigned int len; \ |
|
|
|
}; \ |
|
|
|
} type_name; \ |
|
|
|
static_assert(sizeof(GPtrArray) == sizeof(type_name), "sizeof ptrarray type mismatch"); \ |
|
|
|
static_assert(G_STRUCT_OFFSET(GPtrArray, pdata) == G_STRUCT_OFFSET(type_name, pdata), \ |
|
|
|
"pdata offset mismatch"); \ |
|
|
|
static_assert(G_STRUCT_OFFSET(GPtrArray, len) == G_STRUCT_OFFSET(type_name, len), \ |
|
|
|
"len offset mismatch"); \ |
|
|
|
static inline type_name *type_name##_new_sized(unsigned int len) { \ |
|
|
|
void (*func)(contained_type *) = free_func; \ |
|
|
|
return (type_name *) g_ptr_array_new_full(len, (GDestroyNotify) func); \ |
|
|
|
} \ |
|
|
|
static inline type_name *type_name##_new(void) { \ |
|
|
|
return type_name##_new_sized(0); \ |
|
|
|
} |
|
|
|
|
|
|
|
#define TYPED_GPTRARRAY(type_name, contained_type) \ |
|
|
|
TYPED_GPTRARRAY_FULL(type_name, contained_type, NULL) |
|
|
|
|
|
|
|
#define t_ptr_array_set_size(A, l) ({ \ |
|
|
|
g_ptr_array_set_size(&(A)->a, l); \ |
|
|
|
}) |
|
|
|
|
|
|
|
#define t_ptr_array_free(A, fd) ({ \ |
|
|
|
g_ptr_array_free(&(A)->a, fd); \ |
|
|
|
}) |
|
|
|
|
|
|
|
#define t_ptr_array_add(A, e) ({ \ |
|
|
|
__typeof__(*(A)->pdata) __e = e; \ |
|
|
|
g_ptr_array_add(&(A)->a, __e); \ |
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
#endif |