📄 gtype.h
字号:
* return g_strdup_printf ("string location passed as NULL"); * if (collect_flags & G_VALUE_NOCOPY_CONTENTS) * *string_p = value->data[0].v_pointer; * else * *string_p = g_strdup (value->data[0].v_pointer); * ]| * And an illustrative version of lcopy_value() for * reference-counted types: * |[ * GObject **object_p = collect_values[0].v_pointer; * if (!object_p) * return g_strdup_printf ("object location passed as NULL"); * if (!value->data[0].v_pointer) * *object_p = NULL; * else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) // always honour * *object_p = value->data[0].v_pointer; * else * *object_p = g_object_ref (value->data[0].v_pointer); * return NULL; * ]| * * The #GTypeValueTable provides the functions required by the #GValue implementation, * to serve as a container for values of a type. */struct _GTypeValueTable{ void (*value_init) (GValue *value); void (*value_free) (GValue *value); void (*value_copy) (const GValue *src_value, GValue *dest_value); /* varargs functionality (optional) */ gpointer (*value_peek_pointer) (const GValue *value); gchar *collect_format; gchar* (*collect_value) (GValue *value, guint n_collect_values, GTypeCValue *collect_values, guint collect_flags); gchar *lcopy_format; gchar* (*lcopy_value) (const GValue *value, guint n_collect_values, GTypeCValue *collect_values, guint collect_flags);};GType g_type_register_static (GType parent_type, const gchar *type_name, const GTypeInfo *info, GTypeFlags flags);GType g_type_register_static_simple (GType parent_type, const gchar *type_name, guint class_size, GClassInitFunc class_init, guint instance_size, GInstanceInitFunc instance_init, GTypeFlags flags); GType g_type_register_dynamic (GType parent_type, const gchar *type_name, GTypePlugin *plugin, GTypeFlags flags);GType g_type_register_fundamental (GType type_id, const gchar *type_name, const GTypeInfo *info, const GTypeFundamentalInfo *finfo, GTypeFlags flags);void g_type_add_interface_static (GType instance_type, GType interface_type, const GInterfaceInfo *info);void g_type_add_interface_dynamic (GType instance_type, GType interface_type, GTypePlugin *plugin);void g_type_interface_add_prerequisite (GType interface_type, GType prerequisite_type);GType*g_type_interface_prerequisites (GType interface_type, guint *n_prerequisites);void g_type_class_add_private (gpointer g_class, gsize private_size);gpointer g_type_instance_get_private (GTypeInstance *instance, GType private_type);/* --- GType boilerplate --- *//** * G_DEFINE_TYPE: * @TN: The name of the new type, in Camel case. * @t_n: The name of the new type, in lowercase, with words * separated by '_'. * @T_P: The #GType of the parent type. * * A convenience macro for type implementations, which declares a * class initialization function, an instance initialization function (see #GTypeInfo for information about * these) and a static variable named @t_n<!-- -->_parent_class pointing to the parent class. Furthermore, it defines * a *_get_type() function. See G_DEFINE_TYPE_EXTENDED() for an example. * * Since: 2.4 */#define G_DEFINE_TYPE(TN, t_n, T_P) G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, {})/** * G_DEFINE_TYPE_WITH_CODE: * @TN: The name of the new type, in Camel case. * @t_n: The name of the new type in lowercase, with words separated by '_'. * @T_P: The #GType of the parent type. * @_C_: Custom code that gets inserted in the *_get_type() function. * * A convenience macro for type implementations. * Similar to G_DEFINE_TYPE(), but allows to insert custom code into the * *_get_type() function, e.g. interface implementations via G_IMPLEMENT_INTERFACE(). * See G_DEFINE_TYPE_EXTENDED() for an example. * * Since: 2.4 */#define G_DEFINE_TYPE_WITH_CODE(TN, t_n, T_P, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, 0) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()/** * G_DEFINE_ABSTRACT_TYPE: * @TN: The name of the new type, in Camel case. * @t_n: The name of the new type, in lowercase, with words * separated by '_'. * @T_P: The #GType of the parent type. * * A convenience macro for type implementations. * Similar to G_DEFINE_TYPE(), but defines an abstract type. * See G_DEFINE_TYPE_EXTENDED() for an example. * * Since: 2.4 */#define G_DEFINE_ABSTRACT_TYPE(TN, t_n, T_P) G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT, {})/** * G_DEFINE_ABSTRACT_TYPE_WITH_CODE: * @TN: The name of the new type, in Camel case. * @t_n: The name of the new type, in lowercase, with words * separated by '_'. * @T_P: The #GType of the parent type. * @_C_: Custom code that gets inserted in the @type_name_get_type() function. * * A convenience macro for type implementations. * Similar to G_DEFINE_TYPE_WITH_CODE(), but defines an abstract type and allows to * insert custom code into the *_get_type() function, e.g. interface implementations * via G_IMPLEMENT_INTERFACE(). See G_DEFINE_TYPE_EXTENDED() for an example. * * Since: 2.4 */#define G_DEFINE_ABSTRACT_TYPE_WITH_CODE(TN, t_n, T_P, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()/** * G_DEFINE_TYPE_EXTENDED: * @TN: The name of the new type, in Camel case. * @t_n: The name of the new type, in lowercase, with words * separated by '_'. * @T_P: The #GType of the parent type. * @_f_: #GTypeFlags to pass to g_type_register_static() * @_C_: Custom code that gets inserted in the *_get_type() function. * * The most general convenience macro for type implementations, on which * G_DEFINE_TYPE(), etc are based. * * |[ * G_DEFINE_TYPE_EXTENDED (GtkGadget, * gtk_gadget, * GTK_TYPE_WIDGET, * 0, * G_IMPLEMENT_INTERFACE (TYPE_GIZMO, * gtk_gadget_gizmo_init)); * ]| * expands to * |[ * static void gtk_gadget_init (GtkGadget *self); * static void gtk_gadget_class_init (GtkGadgetClass *klass); * static gpointer gtk_gadget_parent_class = NULL; * static void gtk_gadget_class_intern_init (gpointer klass) * { * gtk_gadget_parent_class = g_type_class_peek_parent (klass); * gtk_gadget_class_init ((GtkGadgetClass*) klass); * } * * GType * gtk_gadget_get_type (void) * { * static GType g_define_type_id = 0; * if (G_UNLIKELY (g_define_type_id == 0)) * { * static const GTypeInfo g_define_type_info = { * sizeof (GtkGadgetClass), * (GBaseInitFunc) NULL, * (GBaseFinalizeFunc) NULL, * (GClassInitFunc) gtk_gadget_class_intern_init, * (GClassFinalizeFunc) NULL, * NULL, // class_data * sizeof (GtkGadget), * 0, // n_preallocs * (GInstanceInitFunc) gtk_gadget_init, * }; * g_define_type_id = g_type_register_static (GTK_TYPE_WIDGET, "GtkGadget", &g_define_type_info, 0); * { * static const GInterfaceInfo g_implement_interface_info = { * (GInterfaceInitFunc) gtk_gadget_gizmo_init * }; * g_type_add_interface_static (g_define_type_id, TYPE_GIZMO, &g_implement_interface_info); * } * } * return g_define_type_id; * } * ]| * The only pieces which have to be manually provided are the definitions of the * instance and class structure and the definitions of the instance and class * init functions. * * Since: 2.4 */#define G_DEFINE_TYPE_EXTENDED(TN, t_n, T_P, _f_, _C_) _G_DEFINE_TYPE_EXTENDED_BEGIN (TN, t_n, T_P, _f_) {_C_;} _G_DEFINE_TYPE_EXTENDED_END()/** * G_IMPLEMENT_INTERFACE: * @TYPE_IFACE: The #GType of the interface to add * @iface_init: The interface init function * * A convenience macro to ease interface addition in the @_C_ section * of G_DEFINE_TYPE_WITH_CODE() or G_DEFINE_ABSTRACT_TYPE_WITH_CODE(). * See G_DEFINE_TYPE_EXTENDED() for an example. * * Note that this macro can only be used together with the G_DEFINE_TYPE_* * macros, since it depends on variable names from those macros. * * Since: 2.4 */#define G_IMPLEMENT_INTERFACE(TYPE_IFACE, iface_init) { \ const GInterfaceInfo g_implement_interface_info = { \ (GInterfaceInitFunc) iface_init, NULL, NULL \ }; \ g_type_add_interface_static (g_define_type_id, TYPE_IFACE, &g_implement_interface_info); \}#define _G_DEFINE_TYPE_EXTENDED_BEGIN(TypeName, type_name, TYPE_PARENT, flags) \\static void type_name##_init (TypeName *self); \static void type_name##_class_init (TypeName##Class *klass); \static gpointer type_name##_parent_class = NULL; \static void type_name##_class_intern_init (gpointer klass) \{ \ type_name##_parent_class = g_type_class_peek_parent (klass); \ type_name##_class_init ((TypeName##Class*) klass); \} \\GType \type_name##_get_type (void) \{ \ static volatile gsize g_define_type_id__volatile = 0; \ if (g_once_init_enter (&g_define_type_id__volatile)) \ { \ GType g_define_type_id = \ g_type_register_static_simple (TYPE_PARENT, \ g_intern_static_string (#TypeName), \ sizeof (TypeName##Class), \ (GClassInitFunc) type_name##_class_intern_init, \ sizeof (TypeName), \ (GInstanceInitFunc) type_name##_init, \ (GTypeFlags) flags); \ { /* custom code follows */#define _G_DEFINE_TYPE_EXTENDED_END() \ /* following custom code */ \ } \ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); \ } \ return g_define_type_id__volatile; \} /* closes type_name##_get_type() *//* --- protected (for fundamental type implementations) --- */GTypePlugin* g_type_get_plugin (GType type);GTypePlugin* g_type_interface_get_plugin (GType instance_type, GType interface_type);GType g_type_fundamental_next (void);GType g_type_fundamental (GType type_id);GTypeInstance* g_type_create_instance (GType type);void g_type_free_instance (GTypeInstance *instance);void g_type_add_class_cache_func (gpointer cache_data, GTypeClassCacheFunc cache_func);void g_type_remove_class_cache_func (gpointer cache_data, GTypeClassCacheFunc cache_func);void g_type_class_unref_uncached (gpointer g_class);void g_type_add_interface_check (gpointer check_data, GTypeInterfaceCheckFunc check_func);void g_type_remove_interface_check (gpointer check_data, GTypeInterfaceCheckFunc check_func);GTypeValueTable* g_type_value_table_peek (GType type);/*< private >*/gboolean g_type_check_instance (GTypeInstance *instance) G_GNUC_PURE;GTypeInstance* g_type_check_instance_cast (GTypeInstance *instance, GType iface_type);gboolean g_type_check_instance_is_a (GTypeInstance *instance, GType iface_type) G_GNUC_PURE;GTypeClass* g_type_check_class_cast (GTypeClass *g_class, GType is_a_type);gboolean g_type_check_class_is_a (GTypeClass *g_class, GType is_a_type) G_GNUC_PURE;gboolean g_type_check_is_value_type (GType type) G_GNUC_CONST;gboolean g_type_check_value (GValue *value) G_GNUC_PURE;gboolean g_type_check_value_holds (GValue *value, GType type) G_GNUC_PURE;gboolean g_type_test_flags (GType type, guint flags) G_GNUC_CONST;/* --- debugging functions --- */G_CONST_RETURN gchar* g_type_name_from_instance (GTypeInstance *instance);G_CONST_RETURN gchar* g_type_name_from_class (GTypeClass *g_class);/* --- internal functions --- */G_GNUC_INTERNAL void g_value_c_init (void); /* sync with gvalue.c */G_GNUC_INTERNAL void g_value_types_init (void); /* sync with gvaluetypes.c */G_GNUC_INTERNAL void g_enum_types_init (void); /* sync with genums.c */G_GNUC_INTERNAL void g_param_type_init (void); /* sync with gparam.c */G_GNUC_INTERNAL void g_boxed_type_init (void); /* sync with gboxed.c */G_GNUC_INTERNAL void g_object_type_init (void); /* sync with gobject.c */G_GNUC_INTERNAL void g_param_spec_types_init (void); /* sync with gparamspecs.c */G_GNUC_INTERNAL void g_value_transforms_init (void); /* sync with gvaluetransform.c */G_GNUC_INTERNAL void g_signal_init (void); /* sync with gsignal.c *//* --- implementation bits --- */#ifndef G_DISABLE_CAST_CHECKS# define _G_TYPE_CIC(ip, gt, ct) \ ((ct*) g_type_check_instance_cast ((GTypeInstance*) ip, gt))# define _G_TYPE_CCC(cp, gt, ct) \ ((ct*) g_type_check_class_cast ((GTypeClass*) cp, gt))#else /* G_DISABLE_CAST_CHECKS */# define _G_TYPE_CIC(ip, gt, ct) ((ct*) ip)# define _G_TYPE_CCC(cp, gt, ct) ((ct*) cp)#endif /* G_DISABLE_CAST_CHECKS */#define _G_TYPE_CHI(ip) (g_type_check_instance ((GTypeInstance*) ip))#define _G_TYPE_CHV(vl) (g_type_check_value ((GValue*) vl))#define _G_TYPE_IGC(ip, gt, ct) ((ct*) (((GTypeInstance*) ip)->g_class))#define _G_TYPE_IGI(ip, gt, ct) ((ct*) g_type_interface_peek (((GTypeInstance*) ip)->g_class, gt))#ifdef __GNUC__# define _G_TYPE_CIT(ip, gt) (G_GNUC_EXTENSION ({ \ GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \ if (__inst && __inst->g_class && __inst->g_class->g_type == __t) \ __r = TRUE; \ else \ __r = g_type_check_instance_is_a (__inst, __t); \ __r; \}))# define _G_TYPE_CCT(cp, gt) (G_GNUC_EXTENSION ({ \ GTypeClass *__class = (GTypeClass*) cp; GType __t = gt; gboolean __r; \ if (__class && __class->g_type == __t) \ __r = TRUE; \ else \ __r = g_type_check_class_is_a (__class, __t); \ __r; \}))# define _G_TYPE_CVH(vl, gt) (G_GNUC_EXTENSION ({ \ GValue *__val = (GValue*) vl; GType __t = gt; gboolean __r; \ if (__val && __val->g_type == __t) \ __r = TRUE; \ else \ __r = g_type_check_value_holds (__val, __t); \ __r; \}))#else /* !__GNUC__ */# define _G_TYPE_CIT(ip, gt) (g_type_check_instance_is_a ((GTypeInstance*) ip, gt))# define _G_TYPE_CCT(cp, gt) (g_type_check_class_is_a ((GTypeClass*) cp, gt))# define _G_TYPE_CVH(vl, gt) (g_type_check_value_holds ((GValue*) vl, gt))#endif /* !__GNUC__ *//** * G_TYPE_FLAG_RESERVED_ID_BIT: * * A bit in the type number that's supposed to be left untouched. */#define G_TYPE_FLAG_RESERVED_ID_BIT ((GType) (1 << 0))extern GTypeDebugFlags _g_type_debug_flags;G_END_DECLS#endif /* __G_TYPE_H__ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -