X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gobject%2Fgtype.h;h=802877fc6a16cafa306d65babd05bb4c977dbd8f;hb=e7fd3de86d6004d8dba5f8448eb063c6731546e9;hp=abd033acc731efa681bd6232f841d73fb9b1081c;hpb=d85b722734a6fcfe94032f6113de9e5c190fd7c3;p=platform%2Fupstream%2Fglib.git diff --git a/gobject/gtype.h b/gobject/gtype.h index abd033a..802877f 100644 --- a/gobject/gtype.h +++ b/gobject/gtype.h @@ -12,17 +12,15 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place, Suite 330, - * Boston, MA 02111-1307, USA. + * Public License along with this library; if not, see . */ +#ifndef __G_TYPE_H__ +#define __G_TYPE_H__ + #if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION) #error "Only can be included directly." #endif -#ifndef __G_TYPE_H__ -#define __G_TYPE_H__ - #include G_BEGIN_DECLS @@ -47,7 +45,6 @@ G_BEGIN_DECLS #define G_TYPE_FUNDAMENTAL_MAX (255 << G_TYPE_FUNDAMENTAL_SHIFT) /* Constant fundamental types, - * introduced by g_type_init(). */ /** * G_TYPE_INVALID: @@ -647,12 +644,14 @@ struct _GTypeQuery * @G_TYPE_DEBUG_OBJECTS: Print messages about object bookkeeping. * @G_TYPE_DEBUG_SIGNALS: Print messages about signal emissions. * @G_TYPE_DEBUG_MASK: Mask covering all debug flags. - * - * The GTypeDebugFlags enumeration values can be passed to - * g_type_init_with_debug_flags() to trigger debugging messages during runtime. - * Note that the messages can also be triggered by setting the - * GOBJECT_DEBUG environment variable to a ':'-separated list of - * "objects" and "signals". + * + * These flags used to be passed to g_type_init_with_debug_flags() which + * is now deprecated. + * + * If you need to enable debugging features, use the GOBJECT_DEBUG + * environment variable. + * + * Deprecated: 2.36: g_type_init() is now done automatically */ typedef enum /*< skip >*/ { @@ -664,42 +663,66 @@ typedef enum /*< skip >*/ /* --- prototypes --- */ +GLIB_DEPRECATED_IN_2_36 void g_type_init (void); +GLIB_DEPRECATED_IN_2_36 void g_type_init_with_debug_flags (GTypeDebugFlags debug_flags); +GLIB_AVAILABLE_IN_ALL const gchar * g_type_name (GType type); +GLIB_AVAILABLE_IN_ALL GQuark g_type_qname (GType type); +GLIB_AVAILABLE_IN_ALL GType g_type_from_name (const gchar *name); +GLIB_AVAILABLE_IN_ALL GType g_type_parent (GType type); +GLIB_AVAILABLE_IN_ALL guint g_type_depth (GType type); +GLIB_AVAILABLE_IN_ALL GType g_type_next_base (GType leaf_type, GType root_type); +GLIB_AVAILABLE_IN_ALL gboolean g_type_is_a (GType type, GType is_a_type); +GLIB_AVAILABLE_IN_ALL gpointer g_type_class_ref (GType type); +GLIB_AVAILABLE_IN_ALL gpointer g_type_class_peek (GType type); +GLIB_AVAILABLE_IN_ALL gpointer g_type_class_peek_static (GType type); +GLIB_AVAILABLE_IN_ALL void g_type_class_unref (gpointer g_class); +GLIB_AVAILABLE_IN_ALL gpointer g_type_class_peek_parent (gpointer g_class); +GLIB_AVAILABLE_IN_ALL gpointer g_type_interface_peek (gpointer instance_class, GType iface_type); +GLIB_AVAILABLE_IN_ALL gpointer g_type_interface_peek_parent (gpointer g_iface); +GLIB_AVAILABLE_IN_ALL gpointer g_type_default_interface_ref (GType g_type); +GLIB_AVAILABLE_IN_ALL gpointer g_type_default_interface_peek (GType g_type); +GLIB_AVAILABLE_IN_ALL void g_type_default_interface_unref (gpointer g_iface); /* g_free() the returned arrays */ +GLIB_AVAILABLE_IN_ALL GType* g_type_children (GType type, guint *n_children); +GLIB_AVAILABLE_IN_ALL GType* g_type_interfaces (GType type, guint *n_interfaces); /* per-type _static_ data */ +GLIB_AVAILABLE_IN_ALL void g_type_set_qdata (GType type, GQuark quark, gpointer data); +GLIB_AVAILABLE_IN_ALL gpointer g_type_get_qdata (GType type, GQuark quark); +GLIB_AVAILABLE_IN_ALL void g_type_query (GType type, GTypeQuery *query); @@ -1206,21 +1229,23 @@ struct _GTypeValueTable GValue *dest_value); /* varargs functionality (optional) */ gpointer (*value_peek_pointer) (const GValue *value); - gchar *collect_format; + const gchar *collect_format; gchar* (*collect_value) (GValue *value, guint n_collect_values, GTypeCValue *collect_values, guint collect_flags); - gchar *lcopy_format; + const gchar *lcopy_format; gchar* (*lcopy_value) (const GValue *value, guint n_collect_values, GTypeCValue *collect_values, guint collect_flags); }; +GLIB_AVAILABLE_IN_ALL GType g_type_register_static (GType parent_type, const gchar *type_name, const GTypeInfo *info, GTypeFlags flags); +GLIB_AVAILABLE_IN_ALL GType g_type_register_static_simple (GType parent_type, const gchar *type_name, guint class_size, @@ -1229,34 +1254,57 @@ GType g_type_register_static_simple (GType parent_type GInstanceInitFunc instance_init, GTypeFlags flags); +GLIB_AVAILABLE_IN_ALL GType g_type_register_dynamic (GType parent_type, const gchar *type_name, GTypePlugin *plugin, GTypeFlags flags); +GLIB_AVAILABLE_IN_ALL GType g_type_register_fundamental (GType type_id, const gchar *type_name, const GTypeInfo *info, const GTypeFundamentalInfo *finfo, GTypeFlags flags); +GLIB_AVAILABLE_IN_ALL void g_type_add_interface_static (GType instance_type, GType interface_type, const GInterfaceInfo *info); +GLIB_AVAILABLE_IN_ALL void g_type_add_interface_dynamic (GType instance_type, GType interface_type, GTypePlugin *plugin); +GLIB_AVAILABLE_IN_ALL void g_type_interface_add_prerequisite (GType interface_type, GType prerequisite_type); +GLIB_AVAILABLE_IN_ALL GType*g_type_interface_prerequisites (GType interface_type, guint *n_prerequisites); +GLIB_AVAILABLE_IN_ALL void g_type_class_add_private (gpointer g_class, gsize private_size); +GLIB_AVAILABLE_IN_2_38 +gint g_type_add_instance_private (GType class_type, + gsize private_size); +GLIB_AVAILABLE_IN_ALL gpointer g_type_instance_get_private (GTypeInstance *instance, GType private_type); +GLIB_AVAILABLE_IN_2_38 +void g_type_class_adjust_private_offset (gpointer g_class, + gint *private_size_or_offset); +GLIB_AVAILABLE_IN_ALL void g_type_add_class_private (GType class_type, gsize private_size); +GLIB_AVAILABLE_IN_ALL gpointer g_type_class_get_private (GTypeClass *klass, GType private_type); +GLIB_AVAILABLE_IN_2_38 +gint g_type_class_get_instance_private_offset (gpointer g_class); + +GLIB_AVAILABLE_IN_2_34 +void g_type_ensure (GType type); +GLIB_AVAILABLE_IN_2_36 +guint g_type_get_type_registration_serial (void); /* --- GType boilerplate --- */ @@ -1291,6 +1339,25 @@ gpointer g_type_class_get_private (GTypeClass *klass, */ #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_TYPE_WITH_PRIVATE: + * @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), a static variable named @t_n_parent_class pointing to the parent class, and adds private + * instance data to the type. Furthermore, it defines a *_get_type() function. See G_DEFINE_TYPE_EXTENDED() + * for an example. + * + * Note that private structs added with this macros must have a struct + * name of the form @TNPrivate. + * + * Since: 2.38 + */ +#define G_DEFINE_TYPE_WITH_PRIVATE(TN, t_n, T_P) G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, G_ADD_PRIVATE (TN)) +/** * 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 @@ -1321,6 +1388,19 @@ gpointer g_type_class_get_private (GTypeClass *klass, */ #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_ABSTRACT_TYPE_WITH_PRIVATE: + * @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. + * + * Similar to G_DEFINE_TYPE_WITH_PRIVATE(), but defines an abstract type. + * See G_DEFINE_TYPE_EXTENDED() for an example. + * + * Since: 2.38 + */ +#define G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE(TN, t_n, T_P) G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, G_TYPE_FLAG_ABSTRACT, G_ADD_PRIVATE (TN)) +/** * 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 @@ -1364,7 +1444,7 @@ gpointer g_type_class_get_private (GTypeClass *klass, * (GClassInitFunc) gtk_gadget_class_intern_init, * sizeof (GtkGadget), * (GInstanceInitFunc) gtk_gadget_init, - * (GTypeFlags) flags); + * 0); * { * const GInterfaceInfo g_implement_interface_info = { * (GInterfaceInitFunc) gtk_gadget_gizmo_init @@ -1443,15 +1523,159 @@ gpointer g_type_class_get_private (GTypeClass *klass, g_type_add_interface_static (g_define_type_id, TYPE_IFACE, &g_implement_interface_info); \ } +/** + * G_ADD_PRIVATE: + * @TypeName: the name of the type in CamelCase + * + * A convenience macro to ease adding private data to instances of a new type + * in the @_C_ section of G_DEFINE_TYPE_WITH_CODE() or + * G_DEFINE_ABSTRACT_TYPE_WITH_CODE(). + * + * For instance: + * + * |[ + * typedef struct _MyObject MyObject; + * typedef struct _MyObjectClass MyObjectClass; + * + * typedef struct { + * gint foo; + * gint bar; + * } MyObjectPrivate; + * + * G_DEFINE_TYPE_WITH_CODE (MyObject, my_object, G_TYPE_OBJECT, + * G_ADD_PRIVATE (MyObject)) + * ]| + * + * Will add MyObjectPrivate as the private data to any instance of the MyObject + * type. + * + * G_DEFINE_TYPE_* macros will automatically create a private function + * based on the arguments to this macro, which can be used to safely + * retrieve the private data from an instance of the type; for instance: + * + * |[ + * gint + * my_object_get_foo (MyObject *obj) + * { + * MyObjectPrivate *priv = my_object_get_instance_private (obj); + * + * return priv->foo; + * } + * + * void + * my_object_set_bar (MyObject *obj, + * gint bar) + * { + * MyObjectPrivate *priv = my_object_get_instance_private (obj); + * + * if (priv->bar != bar) + * priv->bar = bar; + * } + * ]| + * + * Note that this macro can only be used together with the G_DEFINE_TYPE_* + * macros, since it depends on variable names from those macros. + * + * Also note that private structs added with these macros must have a struct + * name of the form TypeNamePrivate. + * + * Since: 2.38 + */ +#define G_ADD_PRIVATE(TypeName) { \ + TypeName##_private_offset = \ + g_type_add_instance_private (g_define_type_id, sizeof (TypeName##Private)); \ +} + +/** + * G_PRIVATE_OFFSET: + * @TypeName: the name of the type in CamelCase + * @field: the name of the field in the private data structure + * + * Evaluates to the offset of the @field inside the instance private data + * structure for @TypeName. + * + * Note that this macro can only be used together with the G_DEFINE_TYPE_* + * and G_ADD_PRIVATE() macros, since it depends on variable names from + * those macros. + * + * Since: 2.38 + */ +#define G_PRIVATE_OFFSET(TypeName, field) \ + (TypeName##_private_offset + (G_STRUCT_OFFSET (TypeName##Private, field))) + +/** + * G_PRIVATE_FIELD_P: + * @TypeName: the name of the type in CamelCase + * @inst: the instance of @TypeName you wish to access + * @field_name: the name of the field in the private data structure + * + * Evaluates to a pointer to the @field_name inside the @inst private data + * structure for @TypeName. + * + * Note that this macro can only be used together with the G_DEFINE_TYPE_* + * and G_ADD_PRIVATE() macros, since it depends on variable names from + * those macros. + * + * Since: 2.38 + */ +#define G_PRIVATE_FIELD_P(TypeName, inst, field_name) \ + G_STRUCT_MEMBER_P (inst, G_PRIVATE_OFFSET (TypeName, field_name)) + +/** + * G_PRIVATE_FIELD: + * @TypeName: the name of the type in CamelCase + * @inst: the instance of @TypeName you wish to access + * @field_type: the type of the field in the private data structure + * @field_name: the name of the field in the private data structure + * + * Evaluates to the @field_name inside the @inst private data + * structure for @TypeName. + * + * Note that this macro can only be used together with the G_DEFINE_TYPE_* + * and G_ADD_PRIVATE() macros, since it depends on variable names from + * those macros. + * + * Since: 2.38 + */ +#define G_PRIVATE_FIELD(TypeName, inst, field_type, field_name) \ + G_STRUCT_MEMBER (field_type, inst, G_PRIVATE_OFFSET (TypeName, field_name)) + +/* we need to have this macro under conditional expansion, as it references + * a function that has been added in 2.38. see bug: + * https://bugzilla.gnome.org/show_bug.cgi?id=703191 + */ +#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 +#define _G_DEFINE_TYPE_EXTENDED_CLASS_INIT(TypeName, type_name) \ +static void type_name##_class_intern_init (gpointer klass) \ +{ \ + type_name##_parent_class = g_type_class_peek_parent (klass); \ + if (TypeName##_private_offset != 0) \ + g_type_class_adjust_private_offset (klass, &TypeName##_private_offset); \ + type_name##_class_init ((TypeName##Class*) klass); \ +} + +#else +#define _G_DEFINE_TYPE_EXTENDED_CLASS_INIT(TypeName, type_name) \ +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); \ +} +#endif /* GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38 */ + #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) \ +static gint TypeName##_private_offset; \ +\ +_G_DEFINE_TYPE_EXTENDED_CLASS_INIT(TypeName, type_name) \ +\ +static inline gpointer \ +type_name##_get_instance_private (TypeName *self) \ { \ - type_name##_parent_class = g_type_class_peek_parent (klass); \ - type_name##_class_init ((TypeName##Class*) klass); \ + return (G_STRUCT_MEMBER_P (self, TypeName##_private_offset)); \ } \ \ GType \ @@ -1538,7 +1762,10 @@ type_name##_get_type (void) \ */ #define G_DEFINE_BOXED_TYPE_WITH_CODE(TypeName, type_name, copy_func, free_func, _C_) _G_DEFINE_BOXED_TYPE_BEGIN (TypeName, type_name, copy_func, free_func) {_C_;} _G_DEFINE_TYPE_EXTENDED_END() -#if !defined (__cplusplus) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)) +/* Only use this in non-C++ on GCC >= 2.7, except for Darwin/ppc64. + * See https://bugzilla.gnome.org/show_bug.cgi?id=647145 + */ +#if !defined (__cplusplus) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)) && !(defined (__APPLE__) && defined (__ppc64__)) #define _G_DEFINE_BOXED_TYPE_BEGIN(TypeName, type_name, copy_func, free_func) \ GType \ type_name##_get_type (void) \ @@ -1617,48 +1844,71 @@ type_name##_get_type (void) \ { /* custom code follows */ /* --- protected (for fundamental type implementations) --- */ +GLIB_AVAILABLE_IN_ALL GTypePlugin* g_type_get_plugin (GType type); +GLIB_AVAILABLE_IN_ALL GTypePlugin* g_type_interface_get_plugin (GType instance_type, GType interface_type); +GLIB_AVAILABLE_IN_ALL GType g_type_fundamental_next (void); +GLIB_AVAILABLE_IN_ALL GType g_type_fundamental (GType type_id); +GLIB_AVAILABLE_IN_ALL GTypeInstance* g_type_create_instance (GType type); +GLIB_AVAILABLE_IN_ALL void g_type_free_instance (GTypeInstance *instance); +GLIB_AVAILABLE_IN_ALL void g_type_add_class_cache_func (gpointer cache_data, GTypeClassCacheFunc cache_func); +GLIB_AVAILABLE_IN_ALL void g_type_remove_class_cache_func (gpointer cache_data, GTypeClassCacheFunc cache_func); +GLIB_AVAILABLE_IN_ALL void g_type_class_unref_uncached (gpointer g_class); +GLIB_AVAILABLE_IN_ALL void g_type_add_interface_check (gpointer check_data, GTypeInterfaceCheckFunc check_func); +GLIB_AVAILABLE_IN_ALL void g_type_remove_interface_check (gpointer check_data, GTypeInterfaceCheckFunc check_func); +GLIB_AVAILABLE_IN_ALL GTypeValueTable* g_type_value_table_peek (GType type); /*< private >*/ +GLIB_AVAILABLE_IN_ALL gboolean g_type_check_instance (GTypeInstance *instance) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL GTypeInstance* g_type_check_instance_cast (GTypeInstance *instance, GType iface_type); +GLIB_AVAILABLE_IN_ALL gboolean g_type_check_instance_is_a (GTypeInstance *instance, GType iface_type) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL GTypeClass* g_type_check_class_cast (GTypeClass *g_class, GType is_a_type); +GLIB_AVAILABLE_IN_ALL gboolean g_type_check_class_is_a (GTypeClass *g_class, GType is_a_type) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL gboolean g_type_check_is_value_type (GType type) G_GNUC_CONST; +GLIB_AVAILABLE_IN_ALL gboolean g_type_check_value (GValue *value) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL gboolean g_type_check_value_holds (GValue *value, GType type) G_GNUC_PURE; +GLIB_AVAILABLE_IN_ALL gboolean g_type_test_flags (GType type, guint flags) G_GNUC_CONST; /* --- debugging functions --- */ +GLIB_AVAILABLE_IN_ALL const gchar * g_type_name_from_instance (GTypeInstance *instance); +GLIB_AVAILABLE_IN_ALL const gchar * g_type_name_from_class (GTypeClass *g_class);