diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-01-13 17:32:11 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-15 14:14:51 +0100 |
commit | 0358c787c0dcc49e0350389a4480cb35a4adbfe0 (patch) | |
tree | 486d7ad78b0923df996b6e68e83473eaa375b1f0 /src | |
parent | af41076e7dbc05f2b92e567cb583e0bc7de4c987 (diff) |
core: new boxed type for NULL-terminated array of gpointers
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-private-boxed-types.c | 36 | ||||
-rw-r--r-- | src/mm-private-boxed-types.h | 3 |
2 files changed, 39 insertions, 0 deletions
diff --git a/src/mm-private-boxed-types.c b/src/mm-private-boxed-types.c index ad9d62d1..1f5d6a8b 100644 --- a/src/mm-private-boxed-types.c +++ b/src/mm-private-boxed-types.c @@ -50,3 +50,39 @@ mm_uint16_array_get_type (void) return g_define_type_id__volatile; } + + +static gpointer * +pointer_array_copy (gpointer *array) +{ + gpointer *dup; + guint i; + + if (!array) + return NULL; + + /* Get NULL-terminated array size */ + for (i = 0; array[i]; i++); + + dup = g_new (gpointer, i + 1); + memcpy (dup, array, i * sizeof (gpointer)); + dup[i] = NULL; + return dup; +} + +GType +mm_pointer_array_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + GType g_define_type_id = + g_boxed_type_register_static (g_intern_static_string ("MMPointerArray"), + (GBoxedCopyFunc) pointer_array_copy, + (GBoxedFreeFunc) g_free); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} diff --git a/src/mm-private-boxed-types.h b/src/mm-private-boxed-types.h index e13aaf9d..661ce991 100644 --- a/src/mm-private-boxed-types.h +++ b/src/mm-private-boxed-types.h @@ -23,6 +23,9 @@ G_BEGIN_DECLS GType mm_uint16_array_get_type (void) G_GNUC_CONST; #define MM_TYPE_UINT16_ARRAY (mm_uint16_array_get_type ()) +GType mm_pointer_array_get_type (void) G_GNUC_CONST; +#define MM_TYPE_POINTER_ARRAY (mm_pointer_array_get_type ()) + G_END_DECLS #endif /* __MM_PRIVATE_BOXED_TYPES_H__ */ |