/** * g_value_type_compatible: * @src_type: source type to be copied. * @dest_type: destination type for copying. * * Returns whether a #GValue of type @src_type can be copied into * a #GValue of type @dest_type. * * Returns: %TRUE if g_value_copy() is possible with @src_type and @dest_type. */ gboolean g_value_type_compatible (GType src_type, GType dest_type) { g_return_val_if_fail (G_TYPE_IS_VALUE (src_type), FALSE); g_return_val_if_fail (G_TYPE_IS_VALUE (dest_type), FALSE); return (g_type_is_a (src_type, dest_type) && g_type_value_table_peek (dest_type) == g_type_value_table_peek (src_type)); }
/** * g_value_type_transformable: * @src_type: Source type. * @dest_type: Target type. * * Check whether g_value_transform() is able to transform values * of type @src_type into values of type @dest_type. * * Returns: %TRUE if the transformation is possible, %FALSE otherwise. */ gboolean g_value_type_transformable (GType src_type, GType dest_type) { g_return_val_if_fail (G_TYPE_IS_VALUE (src_type), FALSE); g_return_val_if_fail (G_TYPE_IS_VALUE (dest_type), FALSE); return (g_value_type_compatible (src_type, dest_type) || transform_func_lookup (src_type, dest_type) != NULL); }
/** * g_value_init: * @value: A zero-filled (uninitialized) #GValue structure. * @g_type: Type the #GValue should hold values of. * * Initializes @value with the default value of @type. * * Returns: (transfer none): the #GValue structure that has been passed in */ GValue* g_value_init (GValue *value, GType g_type) { /* g_return_val_if_fail (G_TYPE_IS_VALUE (g_type), NULL); be more elaborate below */ g_return_val_if_fail (value != NULL, NULL); /* g_return_val_if_fail (G_VALUE_TYPE (value) == 0, NULL); be more elaborate below */ if (G_TYPE_IS_VALUE (g_type) && G_VALUE_TYPE (value) == 0) { GTypeValueTable *value_table = g_type_value_table_peek (g_type); /* setup and init */ value_meminit (value, g_type); value_table->value_init (value); } else if (G_VALUE_TYPE (value)) g_warning ("%s: cannot initialize GValue with type '%s', the value has already been initialized as '%s'", G_STRLOC, g_type_name (g_type), g_type_name (G_VALUE_TYPE (value))); else /* !G_TYPE_IS_VALUE (g_type) */ g_warning ("%s: cannot initialize GValue with type '%s', %s", G_STRLOC, g_type_name (g_type), g_type_value_table_peek (g_type) ? "this type is abstract with regards to GValue use, use a more specific (derived) type" : "this type has no GTypeValueTable implementation"); return value; }
/** * g_value_dup_boxed: * @value: a valid #GValue of %G_TYPE_BOXED derived type * * Get the contents of a %G_TYPE_BOXED derived #GValue. Upon getting, * the boxed value is duplicated and needs to be later freed with * g_boxed_free(), e.g. like: g_boxed_free (G_VALUE_TYPE (@value), * return_value); * * Returns: boxed contents of @value */ gpointer g_value_dup_boxed (const GValue *value) { g_return_val_if_fail (G_VALUE_HOLDS_BOXED (value), NULL); g_return_val_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)), NULL); return value->data[0].v_pointer ? g_boxed_copy (G_VALUE_TYPE (value), value->data[0].v_pointer) : NULL; }
/** * g_value_get_boxed: * @value: a valid #GValue of %G_TYPE_BOXED derived type * * Get the contents of a %G_TYPE_BOXED derived #GValue. * * Returns: boxed contents of @value */ gpointer g_value_get_boxed (const GValue *value) { g_return_val_if_fail (G_VALUE_HOLDS_BOXED (value), NULL); g_return_val_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value)), NULL); return value->data[0].v_pointer; }
/** * g_value_take_boxed: * @value: a valid #GValue of %G_TYPE_BOXED derived type * @v_boxed: duplicated unowned boxed value to be set * * Sets the contents of a %G_TYPE_BOXED derived #GValue to @v_boxed * and takes over the ownership of the callers reference to @v_boxed; * the caller doesn't have to unref it any more. * * Since: 2.4 */ void g_value_take_boxed (GValue *value, gconstpointer boxed) { g_return_if_fail (G_VALUE_HOLDS_BOXED (value)); g_return_if_fail (G_TYPE_IS_VALUE (G_VALUE_TYPE (value))); value_set_boxed_internal (value, boxed, FALSE, TRUE); }