Add support for instance-private data. g_type_class_add_private(),

Thu Feb 27 17:33:19 2003  Owen Taylor  <otaylor@redhat.com>

        * gtype.[ch] testgobject.c: Add support for instance-private data.
        g_type_class_add_private(), g_type_instance_get_private(),
        G_TYPE_INSTANCE_GET_PRIVATE(). (#101959, patch partly by
        Mark McLoughlin, extensive feedback from Tim Janik.)
This commit is contained in:
Owen Taylor
2003-03-10 16:41:28 +00:00
committed by Owen Taylor
parent e6d15f6eaf
commit c2a431c894
4 changed files with 204 additions and 16 deletions

View File

@@ -126,8 +126,10 @@ iface_print_string (TestIface *tiobj,
#define TEST_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), TEST_TYPE_OBJECT))
#define TEST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TEST_TYPE_OBJECT))
#define TEST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TEST_TYPE_OBJECT, TestObjectClass))
typedef struct _TestObject TestObject;
typedef struct _TestObjectClass TestObjectClass;
#define TEST_OBJECT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TEST_TYPE_OBJECT, TestObjectPrivate))
typedef struct _TestObject TestObject;
typedef struct _TestObjectClass TestObjectClass;
typedef struct _TestObjectPrivate TestObjectPrivate;
struct _TestObject
{
GObject parent_instance;
@@ -140,6 +142,11 @@ struct _TestObjectClass
TestIface *iface_object,
gpointer tdata);
};
struct _TestObjectPrivate
{
int dummy1;
gdouble dummy2;
};
static void test_object_class_init (TestObjectClass *class);
static void test_object_init (TestObject *tobject);
static gboolean test_signal_accumulator (GSignalInvocationHint *ihint,
@@ -190,10 +197,18 @@ test_object_class_init (TestObjectClass *class)
test_signal_accumulator, NULL,
g_cclosure_marshal_STRING__OBJECT_POINTER,
G_TYPE_STRING, 2, TEST_TYPE_IFACE, G_TYPE_POINTER);
g_type_class_add_private (class, sizeof (TestObjectPrivate));
}
static void
test_object_init (TestObject *tobject)
{
TestObjectPrivate *priv;
priv = TEST_OBJECT_GET_PRIVATE (tobject);
g_assert (priv);
g_assert ((gchar *)priv >= (gchar *)tobject + sizeof (TestObject));
}
static gboolean
test_signal_accumulator (GSignalInvocationHint *ihint,
@@ -274,8 +289,16 @@ derived_object_test_iface_init (gpointer giface,
#define DERIVED_IS_OBJECT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), DERIVED_TYPE_OBJECT))
#define DERIVED_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), DERIVED_TYPE_OBJECT))
#define DERIVED_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DERIVED_TYPE_OBJECT, DerivedObjectClass))
typedef struct _TestObject DerivedObject;
typedef struct _TestObjectClass DerivedObjectClass;
#define DERIVED_OBJECT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), DERIVED_TYPE_OBJECT, DerivedObjectPrivate))
typedef struct _TestObject DerivedObject;
typedef struct _TestObjectClass DerivedObjectClass;
typedef struct _DerivedObjectPrivate DerivedObjectPrivate;
struct _DerivedObjectPrivate
{
char dummy;
};
static void derived_object_class_init (DerivedObjectClass *class);
static void derived_object_init (DerivedObject *dobject);
GType
derived_object_get_type (void)
{
@@ -288,12 +311,12 @@ derived_object_get_type (void)
sizeof (DerivedObjectClass),
NULL, /* base_init */
NULL, /* base_finalize */
NULL, /* class_init */
(GClassInitFunc) derived_object_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (DerivedObject),
5, /* n_preallocs */
NULL, /* instance_init */
(GInstanceInitFunc) derived_object_init,
};
GInterfaceInfo iface_info = { derived_object_test_iface_init, NULL, GUINT_TO_POINTER (87) };
@@ -303,7 +326,28 @@ derived_object_get_type (void)
return derived_object_type;
}
static void
derived_object_class_init (DerivedObjectClass *class)
{
g_type_class_add_private (class, sizeof (DerivedObjectPrivate));
}
static void
derived_object_init (DerivedObject *dobject)
{
TestObjectPrivate *test_priv;
DerivedObjectPrivate *derived_priv;
derived_priv = DERIVED_OBJECT_GET_PRIVATE (dobject);
g_assert (derived_priv);
g_assert ((gchar *)derived_priv >= (gchar *)TEST_OBJECT_GET_PRIVATE (dobject) + sizeof (TestObjectPrivate));
test_priv = TEST_OBJECT_GET_PRIVATE (dobject);
g_assert (test_priv);
g_assert ((gchar *)test_priv >= (gchar *)dobject + sizeof (TestObject));
}
/* --- main --- */
int