X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gobject%2Fgvalue.c;h=5277b777ec0b6a828f9b54315af55773acb84928;hb=9da85c7262325478e8730ae9f3e76bd0528a9a8c;hp=7be9f717e8fe8c779246c3780a97b1d0d9a85d13;hpb=a4e38786750d538b334b8a7a7cc9f5a3ff48bc33;p=platform%2Fupstream%2Fglib.git diff --git a/gobject/gvalue.c b/gobject/gvalue.c index 7be9f71..5277b77 100644 --- a/gobject/gvalue.c +++ b/gobject/gvalue.c @@ -12,9 +12,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. + * Public License along with this library; if not, see . */ /* @@ -28,7 +26,7 @@ #include "gvalue.h" #include "gvaluecollector.h" #include "gbsearcharray.h" -#include "gobjectalias.h" +#include "gtype-private.h" /** @@ -37,9 +35,9 @@ * other type * @see_also: The fundamental types which all support #GValue * operations and thus can be used as a type initializer for - * g_value_init() are defined by a separate interface. See the Standard - * Values API for details. + * g_value_init() are defined by a separate interface. See the + * [standard values API][gobject-Standard-Parameter-and-Value-Types] + * for details * @title: Generic values * * The #GValue structure is basically a variable container that consists @@ -57,8 +55,8 @@ * The code in the example program below demonstrates #GValue's * features. * - * |[ - * #include <glib-object.h> + * |[ + * #include * * static void * int2string (const GValue *src_value, @@ -74,42 +72,40 @@ * main (int argc, * char *argv[]) * { - * /* GValues must start zero-filled */ - * GValue a = {0}; - * GValue b = {0}; + * // GValues must be initialized + * GValue a = G_VALUE_INIT; + * GValue b = G_VALUE_INIT; * const gchar *message; * - * g_type_init (); + * // The GValue starts empty + * g_assert (!G_VALUE_HOLDS_STRING (&a)); * - * /* The GValue starts empty */ - * g_assert (!G_VALUE_HOLDS_STRING (&a)); + * // Put a string in it + * g_value_init (&a, G_TYPE_STRING); + * g_assert (G_VALUE_HOLDS_STRING (&a)); + * g_value_set_static_string (&a, "Hello, world!"); + * g_printf ("%s\n", g_value_get_string (&a)); * - * /* Put a string in it */ - * g_value_init (&a, G_TYPE_STRING); - * g_assert (G_VALUE_HOLDS_STRING (&a)); - * g_value_set_static_string (&a, "Hello, world!"); - * g_printf ("%s\n", g_value_get_string (&a)); + * // Reset it to its pristine state + * g_value_unset (&a); * - * /* Reset it to its pristine state */ - * g_value_unset (&a); + * // It can then be reused for another type + * g_value_init (&a, G_TYPE_INT); + * g_value_set_int (&a, 42); * - * /* It can then be reused for another type */ - * g_value_init (&a, G_TYPE_INT); - * g_value_set_int (&a, 42); + * // Attempt to transform it into a GValue of type STRING + * g_value_init (&b, G_TYPE_STRING); * - * /* Attempt to transform it into a GValue of type STRING */ - * g_value_init (&b, G_TYPE_STRING); - * - * /* An INT is transformable to a STRING */ + * // An INT is transformable to a STRING * g_assert (g_value_type_transformable (G_TYPE_INT, G_TYPE_STRING)); * - * g_value_transform (&a, &b); - * g_printf ("%s\n", g_value_get_string (&b)); + * g_value_transform (&a, &b); + * g_printf ("%s\n", g_value_get_string (&b)); * - * /* Attempt to transform it again using a custom transform function */ + * // Attempt to transform it again using a custom transform function * g_value_register_transform_func (G_TYPE_INT, G_TYPE_STRING, int2string); - * g_value_transform (&a, &b); - * g_printf ("%s\n", g_value_get_string (&b)); + * g_value_transform (&a, &b); + * g_printf ("%s\n", g_value_get_string (&b)); * return 0; * } * ]| @@ -140,7 +136,7 @@ static GBSearchConfig transform_bconfig = { /* --- functions --- */ void -g_value_c_init (void) +_g_value_c_init (void) { transform_array = g_bsearch_array_create (&transform_bconfig); } @@ -160,7 +156,7 @@ value_meminit (GValue *value, * * Initializes @value with the default value of @type. * - * Returns: the #GValue structure that has been passed in + * Returns: (transfer none): the #GValue structure that has been passed in */ GValue* g_value_init (GValue *value, @@ -179,12 +175,12 @@ g_value_init (GValue *value, 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_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_warning ("%s: cannot initialize GValue with type '%s', %s", G_STRLOC, g_type_name (g_type), g_type_value_table_peek (g_type) ? @@ -300,13 +296,13 @@ g_value_fits_pointer (const GValue *value) /** * g_value_peek_pointer: - * @value: An initialized #GValue structure. + * @value: An initialized #GValue structure * - * Return the value contents as pointer. This function asserts that + * Returns the value contents as pointer. This function asserts that * g_value_fits_pointer() returned %TRUE for the passed in value. * This is an internal function introduced mainly for C marshallers. * - * Returns: %TRUE if @value will fit inside a pointer value. + * Returns: (transfer none): the value contents as pointer */ gpointer g_value_peek_pointer (const GValue *value) @@ -328,7 +324,7 @@ g_value_peek_pointer (const GValue *value) /** * g_value_set_instance: * @value: An initialized #GValue structure. - * @instance: the instance + * @instance: (allow-none): the instance * * Sets @value from an instantiatable type via the * value_table's collect_value() function. @@ -377,6 +373,71 @@ g_value_set_instance (GValue *value, } } +/** + * g_value_init_from_instance: + * @value: An uninitialized #GValue structure. + * @instance: the instance + * + * Initializes and sets @value from an instantiatable type via the + * value_table's collect_value() function. + * + * Note: The @value will be initialised with the exact type of + * @instance. If you wish to set the @value's type to a different GType + * (such as a parent class GType), you need to manually call + * g_value_init() and g_value_set_instance(). + * + * Since: 2.42 + */ +void +g_value_init_from_instance (GValue *value, + gpointer instance) +{ + g_return_if_fail (value != NULL && G_VALUE_TYPE(value) == 0); + + if (G_IS_OBJECT (instance)) + { + /* Fast-path. + * If G_IS_OBJECT() succeeds we know: + * * that instance is present and valid + * * that it is a GObject, and therefore we can directly + * use the collect implementation (g_object_ref) */ + value_meminit (value, G_TYPE_FROM_INSTANCE (instance)); + value->data[0].v_pointer = g_object_ref (instance); + } + else + { + GType g_type; + GTypeValueTable *value_table; + GTypeCValue cvalue; + gchar *error_msg; + + g_return_if_fail (G_TYPE_CHECK_INSTANCE (instance)); + + g_type = G_TYPE_FROM_INSTANCE (instance); + value_table = g_type_value_table_peek (g_type); + g_return_if_fail (strcmp (value_table->collect_format, "p") == 0); + + memset (&cvalue, 0, sizeof (cvalue)); + cvalue.v_pointer = instance; + + /* setup and collect */ + value_meminit (value, g_type); + value_table->value_init (value); + error_msg = value_table->collect_value (value, 1, &cvalue, 0); + if (error_msg) + { + g_warning ("%s: %s", G_STRLOC, error_msg); + g_free (error_msg); + + /* we purposely leak the value here, it might not be + * in a sane state if an error condition occoured + */ + value_meminit (value, g_type); + value_table->value_init (value); + } + } +} + static GValueTransform transform_func_lookup (GType src_type, GType dest_type) @@ -425,7 +486,7 @@ transform_entries_cmp (gconstpointer bsearch_node1, } /** - * g_value_register_transform_func: + * g_value_register_transform_func: (skip) * @src_type: Source type. * @dest_type: Target type. * @transform_func: a function which transforms values of type @src_type @@ -453,7 +514,7 @@ g_value_register_transform_func (GType src_type, #if 0 /* let transform function replacement be a valid operation */ if (g_bsearch_array_lookup (transform_array, &transform_bconfig, &entry)) - g_warning ("reregistering value transformation function (%p) for `%s' to `%s'", + g_warning ("reregistering value transformation function (%p) for '%s' to '%s'", transform_func, g_type_name (src_type), g_type_name (dest_type)); @@ -469,7 +530,9 @@ g_value_register_transform_func (GType src_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. + * of type @src_type into values of type @dest_type. Note that for + * the types to be transformable, they must be compatible and a + * transform function must be registered. * * Returns: %TRUE if the transformation is possible, %FALSE otherwise. */ @@ -554,6 +617,3 @@ g_value_transform (const GValue *src_value, } return FALSE; } - -#define __G_VALUE_C__ -#include "gobjectaliasdef.c"