diff options
Diffstat (limited to 'cogl/cogl-object-private.h')
-rw-r--r-- | cogl/cogl-object-private.h | 77 |
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) |