aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-01-13 17:32:11 +0100
committerAleksander Morgado <aleksander@lanedo.com>2012-03-15 14:14:51 +0100
commit0358c787c0dcc49e0350389a4480cb35a4adbfe0 (patch)
tree486d7ad78b0923df996b6e68e83473eaa375b1f0 /src
parentaf41076e7dbc05f2b92e567cb583e0bc7de4c987 (diff)
core: new boxed type for NULL-terminated array of gpointers
Diffstat (limited to 'src')
-rw-r--r--src/mm-private-boxed-types.c36
-rw-r--r--src/mm-private-boxed-types.h3
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__ */