Browse Source

MT#55283 add typed GPtrArray primitives

Change-Id: I8552e75ec8f1b8c3a96163944891631268383cb7
pull/1776/head
Richard Fuchs 2 years ago
parent
commit
9c1f66b05c
1 changed files with 38 additions and 0 deletions
  1. +38
    -0
      lib/containers.h

+ 38
- 0
lib/containers.h View File

@ -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

Loading…
Cancel
Save