mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-09-27 17:52:58 +02:00
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:
@@ -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)
|
||||
{
|
||||
|
@@ -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__ */
|
||||
|
@@ -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)
|
||||
|
@@ -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))
|
||||
|
Reference in New Issue
Block a user