gobject: Add a boxed type for string references

Pretty simple boxed wrapper using the GRef API directly.

https://bugzilla.gnome.org/show_bug.cgi?id=622721
This commit is contained in:
Emmanuele Bassi
2015-01-27 11:08:28 +00:00
parent 3939c50e0e
commit 9541fbabea
4 changed files with 57 additions and 0 deletions

View File

@@ -184,6 +184,36 @@ g_strv_get_type (void)
return g_define_type_id__volatile;
}
/* This one can't use G_DEFINE_BOXED_TYPE (GStringRef, g_string_ref, g_string_ref, g_string_unref)
*
* We also use the g_ref_pointer_* API directly because the g_string_ref/unref
* functions are inlined and hidden by a macro, so we can't use them as function
* pointers.
*/
GType
g_string_ref_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 ("GStringRef"),
(GBoxedCopyFunc) g_ref_pointer_acquire,
(GBoxedFreeFunc) g_ref_pointer_release);
g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
}
return g_define_type_id__volatile;
}
/**
* g_variant_get_gtype:
*
* Since: 2.24
* Deprecated: 2.26
*/
GType
g_variant_get_gtype (void)
{

View File

@@ -288,6 +288,15 @@ typedef gsize GType;
*/
#define G_TYPE_CHECKSUM (g_checksum_get_type ())
/**
* G_TYPE_STRING_REF:
*
* The #GType for a boxed type holding a string reference.
*
* Since: 2.44
*/
#define G_TYPE_STRING_REF (g_string_ref_get_type ())
GLIB_AVAILABLE_IN_ALL
GType g_date_get_type (void) G_GNUC_CONST;
GLIB_AVAILABLE_IN_ALL
@@ -342,6 +351,8 @@ GLIB_AVAILABLE_IN_2_36
GType g_markup_parse_context_get_type (void) G_GNUC_CONST;
GLIB_AVAILABLE_IN_2_40
GType g_mapped_file_get_type (void) G_GNUC_CONST;
GLIB_AVAILABLE_IN_2_44
GType g_string_ref_get_type (void) G_GNUC_CONST;
GLIB_DEPRECATED_FOR('G_TYPE_VARIANT')
GType g_variant_get_gtype (void) G_GNUC_CONST;
@@ -353,6 +364,15 @@ GType g_variant_get_gtype (void) G_GNUC_CONST;
*/
typedef gchar** GStrv;
/**
* GStringRef:
*
* A C representable type for #G_TYPE_STRING_REF.
*
* Since: 2.44
*/
typedef char* GStringRef;
G_END_DECLS
#endif /* __GLIB_TYPES_H__ */

View File

@@ -22,5 +22,6 @@
#endif
G_DEFINE_AUTO_CLEANUP_FREE_FUNC(GStrv, g_strfreev, NULL)
G_DEFINE_AUTO_CLEANUP_FREE_FUNC(GStringRef, g_string_unref, NULL)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GObject, g_object_unref)
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GValue, g_value_unset)

View File

@@ -1397,6 +1397,12 @@ g_strdup_value_contents (const GValue *value)
g_string_append (tmp, "]");
contents = g_string_free (tmp, FALSE);
}
else if (G_VALUE_HOLDS (value, G_TYPE_STRING_REF))
{
GStringRef str = g_value_get_boxed (value);
contents = g_strdup_printf ("\"%s\"", str);
}
else if (G_VALUE_HOLDS_BOXED (value))
contents = g_strdup_printf ("((%s*) %p)", g_type_name (G_VALUE_TYPE (value)), p);
else if (G_VALUE_HOLDS_POINTER (value))