summaryrefslogtreecommitdiff
path: root/cogl/cogl-object-private.h
diff options
context:
space:
mode:
Diffstat (limited to 'cogl/cogl-object-private.h')
-rw-r--r--cogl/cogl-object-private.h77
1 files changed, 57 insertions, 20 deletions
diff --git a/cogl/cogl-object-private.h b/cogl/cogl-object-private.h
index f2f88223..355e6ff5 100644
--- a/cogl/cogl-object-private.h
+++ b/cogl/cogl-object-private.h
@@ -53,6 +53,9 @@ typedef void (*CoglUserDataDestroyInternalCallback) (void *user_data,
typedef struct _CoglObjectClass
{
+#ifdef COGL_HAS_GTYPE_SUPPORT
+ GTypeClass base_class;
+#endif
const char *name;
void *virt_free;
void *virt_unref;
@@ -76,7 +79,7 @@ typedef struct
*/
struct _CoglObject
{
- CoglObjectClass *klass;
+ CoglObjectClass *klass; /* equivalent to GTypeInstance */
CoglUserDataEntry user_data_entry[
COGL_OBJECT_N_PRE_ALLOCATED_USER_DATA_ENTRIES];
@@ -120,6 +123,14 @@ struct _CoglObject
#endif /* COGL_OBJECT_DEBUG */
+#ifdef COGL_HAS_GTYPE_SUPPORT
+#define _COGL_GTYPE_INIT_CLASS(type_name) do { \
+ _cogl_##type_name##_class.base_class.g_type = cogl_##type_name##_get_gtype (); \
+} while (0)
+#else
+#define _COGL_GTYPE_INIT_CLASS(type_name)
+#endif
+
#define COGL_OBJECT_COMMON_DEFINE_WITH_CODE(TypeName, type_name, code) \
\
CoglObjectClass _cogl_##type_name##_class; \
@@ -144,6 +155,28 @@ _cogl_object_##type_name##_indirect_free (CoglObject *obj) \
_cogl_object_##type_name##_dec (); \
} \
\
+static void \
+_cogl_object_##type_name##_class_init (void) \
+{ \
+ _cogl_object_##type_name##_count = 0; \
+ \
+ if (_cogl_debug_instances == NULL) \
+ _cogl_debug_instances = \
+ g_hash_table_new (g_str_hash, g_str_equal); \
+ \
+ _cogl_##type_name##_class.virt_free = \
+ _cogl_object_##type_name##_indirect_free; \
+ _cogl_##type_name##_class.virt_unref = \
+ _cogl_object_default_unref; \
+ _cogl_##type_name##_class.name = "Cogl"#TypeName; \
+ \
+ g_hash_table_insert (_cogl_debug_instances, \
+ (void *) _cogl_##type_name##_class.name, \
+ &_cogl_object_##type_name##_count); \
+ \
+ { code; } \
+} \
+ \
static Cogl##TypeName * \
_cogl_##type_name##_object_new (Cogl##TypeName *new_obj) \
{ \
@@ -156,23 +189,7 @@ _cogl_##type_name##_object_new (Cogl##TypeName *new_obj) \
obj->klass = &_cogl_##type_name##_class; \
if (!obj->klass->virt_free) \
{ \
- _cogl_object_##type_name##_count = 0; \
- \
- if (_cogl_debug_instances == NULL) \
- _cogl_debug_instances = \
- g_hash_table_new (g_str_hash, g_str_equal); \
- \
- obj->klass->virt_free = \
- _cogl_object_##type_name##_indirect_free; \
- obj->klass->virt_unref = \
- _cogl_object_default_unref; \
- obj->klass->name = "Cogl"#TypeName, \
- \
- g_hash_table_insert (_cogl_debug_instances, \
- (void *) obj->klass->name, \
- &_cogl_object_##type_name##_count); \
- \
- { code; } \
+ _cogl_object_##type_name##_class_init (); \
} \
\
_cogl_object_##type_name##_inc (); \
@@ -180,9 +197,29 @@ _cogl_##type_name##_object_new (Cogl##TypeName *new_obj) \
return new_obj; \
}
+#define COGL_OBJECT_DEFINE_WITH_CODE_GTYPE(TypeName, type_name, code) \
+ \
+COGL_OBJECT_COMMON_DEFINE_WITH_CODE(TypeName, \
+ type_name, \
+ do { code; } while (0); \
+ _COGL_GTYPE_INIT_CLASS (type_name)) \
+ \
+CoglBool \
+cogl_is_##type_name (void *object) \
+{ \
+ CoglObject *obj = object; \
+ \
+ if (object == NULL) \
+ return FALSE; \
+ \
+ return obj->klass == &_cogl_##type_name##_class; \
+}
+
#define COGL_OBJECT_DEFINE_WITH_CODE(TypeName, type_name, code) \
\
-COGL_OBJECT_COMMON_DEFINE_WITH_CODE(TypeName, type_name, code) \
+COGL_OBJECT_COMMON_DEFINE_WITH_CODE(TypeName, \
+ type_name, \
+ do { code; } while (0);) \
\
CoglBool \
cogl_is_##type_name (void *object) \
@@ -211,7 +248,7 @@ _cogl_is_##type_name (void *object) \
}
#define COGL_OBJECT_DEFINE(TypeName, type_name) \
- COGL_OBJECT_DEFINE_WITH_CODE (TypeName, type_name, (void) 0)
+ COGL_OBJECT_DEFINE_WITH_CODE_GTYPE (TypeName, type_name, (void) 0)
#define COGL_OBJECT_INTERNAL_DEFINE(TypeName, type_name) \
COGL_OBJECT_INTERNAL_DEFINE_WITH_CODE (TypeName, type_name, (void) 0)