GObject (2)——Dynamic Type


The GLib Dynamic Type SystemThe GType/GObject library was not only designed to offer OO-like features to C programmers but also transparent cross-language interoperability.


Copy functions
static void test_int (void)
{
GValue a_value = {0, };
GValue b_value = {0, };
guint64 a, b;

a = 0xdeadbeaf;

g_value_init (&a_value, G_TYPE_UINT64);
g_value_set_uint64 (&a_value, a);

g_value_init (&b_value, G_TYPE_UINT64);
g_value_copy (&a_value, &b_value);

b = g_value_get_uint64 (&b_value);

if (a == b) {
g_print ("Yay !! 10 lines of code to copy around a uint64.n");
} else {
g_print ("Are you sure this is not a Z80 ?n");
}
}

static void test_object (void)
{
GObject obj;
GValue obj_vala = {0, };
GValue obj_valb = {0, };
obj = g_object_new (MAMAN_TYPE_BAR, NULL);

g_value_init (&obj_vala, MAMAN_TYPE_BAR);
g_value_set_object (&obj_vala, obj);

g_value_init (&obj_valb, G_TYPE_OBJECT);

/
g_value_copy’s semantics for G_TYPE_OBJECT types is to copy the reference.
This function thus calls g_object_ref.
It is interesting to note that the assignment works here because
MAMAN_TYPE_BAR is a G_TYPE_OBJECT.
*/
g_value_copy (&obj_vala, &obj_valb);

g_object_unref (G_OBJECT (obj));
g_object_unref (G_OBJECT (obj));
}