1 /* GObject - GLib Type, Object, Parameter and Signal Library
2 * Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General
15 * Public License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
17 * Boston, MA 02111-1307, USA.
22 #if !defined (__GLIB_GOBJECT_H_INSIDE__) && !defined (GOBJECT_COMPILATION)
23 #error "Only <glib-object.h> can be included directly."
32 #define G_TYPE_FUNDAMENTAL(type) (g_type_fundamental (type))
33 #define G_TYPE_FUNDAMENTAL_MAX (255 << G_TYPE_FUNDAMENTAL_SHIFT)
34 #define G_TYPE_FUNDAMENTAL_SHIFT (2)
37 /* Constant fundamental types
39 typedef enum /*< skip >*/
41 /* standard types, introduced by g_type_init() */
42 G_TYPE_INVALID = 0 << G_TYPE_FUNDAMENTAL_SHIFT,
43 G_TYPE_NONE = 1 << G_TYPE_FUNDAMENTAL_SHIFT,
44 G_TYPE_INTERFACE = 2 << G_TYPE_FUNDAMENTAL_SHIFT,
47 G_TYPE_CHAR = 3 << G_TYPE_FUNDAMENTAL_SHIFT,
48 G_TYPE_UCHAR = 4 << G_TYPE_FUNDAMENTAL_SHIFT,
49 G_TYPE_BOOLEAN = 5 << G_TYPE_FUNDAMENTAL_SHIFT,
50 G_TYPE_INT = 6 << G_TYPE_FUNDAMENTAL_SHIFT,
51 G_TYPE_UINT = 7 << G_TYPE_FUNDAMENTAL_SHIFT,
52 G_TYPE_LONG = 8 << G_TYPE_FUNDAMENTAL_SHIFT,
53 G_TYPE_ULONG = 9 << G_TYPE_FUNDAMENTAL_SHIFT,
54 G_TYPE_INT64 = 10 << G_TYPE_FUNDAMENTAL_SHIFT,
55 G_TYPE_UINT64 = 11 << G_TYPE_FUNDAMENTAL_SHIFT,
56 G_TYPE_ENUM = 12 << G_TYPE_FUNDAMENTAL_SHIFT,
57 G_TYPE_FLAGS = 13 << G_TYPE_FUNDAMENTAL_SHIFT,
58 G_TYPE_FLOAT = 14 << G_TYPE_FUNDAMENTAL_SHIFT,
59 G_TYPE_DOUBLE = 15 << G_TYPE_FUNDAMENTAL_SHIFT,
60 G_TYPE_STRING = 16 << G_TYPE_FUNDAMENTAL_SHIFT,
61 G_TYPE_POINTER = 17 << G_TYPE_FUNDAMENTAL_SHIFT,
62 G_TYPE_BOXED = 18 << G_TYPE_FUNDAMENTAL_SHIFT,
63 G_TYPE_PARAM = 19 << G_TYPE_FUNDAMENTAL_SHIFT,
64 G_TYPE_OBJECT = 20 << G_TYPE_FUNDAMENTAL_SHIFT,
66 /* reserved fundamental type ids,
67 * mail gtk-devel-list@redhat.com for reservations
69 G_TYPE_RESERVED_GLIB_FIRST = 21 << G_TYPE_FUNDAMENTAL_SHIFT,
70 G_TYPE_RESERVED_GLIB_LAST = 31 << G_TYPE_FUNDAMENTAL_SHIFT,
71 G_TYPE_RESERVED_BSE_FIRST = 32 << G_TYPE_FUNDAMENTAL_SHIFT,
72 G_TYPE_RESERVED_BSE_LAST = 48 << G_TYPE_FUNDAMENTAL_SHIFT,
73 G_TYPE_RESERVED_USER_FIRST = 49 << G_TYPE_FUNDAMENTAL_SHIFT
77 /* Type Checking Macros
79 #define G_TYPE_IS_FUNDAMENTAL(type) ((type) <= G_TYPE_FUNDAMENTAL_MAX)
80 #define G_TYPE_IS_DERIVED(type) ((type) > G_TYPE_FUNDAMENTAL_MAX)
81 #define G_TYPE_IS_INTERFACE(type) (G_TYPE_FUNDAMENTAL (type) == G_TYPE_INTERFACE)
82 #define G_TYPE_IS_CLASSED(type) (g_type_test_flags ((type), G_TYPE_FLAG_CLASSED))
83 #define G_TYPE_IS_INSTANTIATABLE(type) (g_type_test_flags ((type), G_TYPE_FLAG_INSTANTIATABLE))
84 #define G_TYPE_IS_DERIVABLE(type) (g_type_test_flags ((type), G_TYPE_FLAG_DERIVABLE))
85 #define G_TYPE_IS_DEEP_DERIVABLE(type) (g_type_test_flags ((type), G_TYPE_FLAG_DEEP_DERIVABLE))
86 #define G_TYPE_IS_ABSTRACT(type) (g_type_test_flags ((type), G_TYPE_FLAG_ABSTRACT))
87 #define G_TYPE_IS_VALUE_ABSTRACT(type) (g_type_test_flags ((type), G_TYPE_FLAG_VALUE_ABSTRACT))
88 #define G_TYPE_IS_VALUE_TYPE(type) (g_type_check_is_value_type (type))
89 #define G_TYPE_HAS_VALUE_TABLE(type) (g_type_value_table_peek (type) != NULL)
95 typedef struct _GValue GValue;
96 typedef union _GTypeCValue GTypeCValue;
97 typedef struct _GTypePlugin GTypePlugin;
98 typedef struct _GTypeClass GTypeClass;
99 typedef struct _GTypeInterface GTypeInterface;
100 typedef struct _GTypeInstance GTypeInstance;
101 typedef struct _GTypeInfo GTypeInfo;
102 typedef struct _GTypeFundamentalInfo GTypeFundamentalInfo;
103 typedef struct _GInterfaceInfo GInterfaceInfo;
104 typedef struct _GTypeValueTable GTypeValueTable;
105 typedef struct _GTypeQuery GTypeQuery;
108 /* Basic Type Structures
115 struct _GTypeInstance
120 struct _GTypeInterface
123 GType g_type; /* iface type */
124 GType g_instance_type;
129 const gchar *type_name;
135 /* Casts, checks and accessors for structured types
136 * usage of these macros is reserved to type implementations only
139 #define G_TYPE_CHECK_INSTANCE(instance) (_G_TYPE_CHI ((GTypeInstance*) (instance)))
140 #define G_TYPE_CHECK_INSTANCE_CAST(instance, g_type, c_type) (_G_TYPE_CIC ((instance), (g_type), c_type))
141 #define G_TYPE_CHECK_INSTANCE_TYPE(instance, g_type) (_G_TYPE_CIT ((instance), (g_type)))
142 #define G_TYPE_INSTANCE_GET_CLASS(instance, g_type, c_type) (_G_TYPE_IGC ((instance), (g_type), c_type))
143 #define G_TYPE_INSTANCE_GET_INTERFACE(instance, g_type, c_type) (_G_TYPE_IGI ((instance), (g_type), c_type))
144 #define G_TYPE_CHECK_CLASS_CAST(g_class, g_type, c_type) (_G_TYPE_CCC ((g_class), (g_type), c_type))
145 #define G_TYPE_CHECK_CLASS_TYPE(g_class, g_type) (_G_TYPE_CCT ((g_class), (g_type)))
146 #define G_TYPE_CHECK_VALUE(value) (_G_TYPE_CHV ((value)))
147 #define G_TYPE_CHECK_VALUE_TYPE(value, g_type) (_G_TYPE_CVH ((value), (g_type)))
148 #define G_TYPE_FROM_INSTANCE(instance) (G_TYPE_FROM_CLASS (((GTypeInstance*) (instance))->g_class))
149 #define G_TYPE_FROM_CLASS(g_class) (((GTypeClass*) (g_class))->g_type)
150 #define G_TYPE_FROM_INTERFACE(g_iface) (((GTypeInterface*) (g_iface))->g_type)
153 /* debug flags for g_type_init_with_debug_flags() */
154 typedef enum /*< skip >*/
156 G_TYPE_DEBUG_NONE = 0,
157 G_TYPE_DEBUG_OBJECTS = 1 << 0,
158 G_TYPE_DEBUG_SIGNALS = 1 << 1,
159 G_TYPE_DEBUG_MASK = 0x03
163 /* --- prototypes --- */
164 void g_type_init (void);
165 void g_type_init_with_debug_flags (GTypeDebugFlags debug_flags);
166 G_CONST_RETURN gchar* g_type_name (GType type);
167 GQuark g_type_qname (GType type);
168 GType g_type_from_name (const gchar *name);
169 GType g_type_parent (GType type);
170 guint g_type_depth (GType type);
171 GType g_type_next_base (GType leaf_type,
173 gboolean g_type_is_a (GType type,
175 gpointer g_type_class_ref (GType type);
176 gpointer g_type_class_peek (GType type);
177 void g_type_class_unref (gpointer g_class);
178 gpointer g_type_class_peek_parent (gpointer g_class);
179 gpointer g_type_interface_peek (gpointer instance_class,
181 gpointer g_type_interface_peek_parent (gpointer g_iface);
183 /* g_free() the returned arrays */
184 GType* g_type_children (GType type,
186 GType* g_type_interfaces (GType type,
187 guint *n_interfaces);
189 /* per-type _static_ data */
190 void g_type_set_qdata (GType type,
193 gpointer g_type_get_qdata (GType type,
195 void g_type_query (GType type,
199 /* --- type registration --- */
200 typedef void (*GBaseInitFunc) (gpointer g_class);
201 typedef void (*GBaseFinalizeFunc) (gpointer g_class);
202 typedef void (*GClassInitFunc) (gpointer g_class,
203 gpointer class_data);
204 typedef void (*GClassFinalizeFunc) (gpointer g_class,
205 gpointer class_data);
206 typedef void (*GInstanceInitFunc) (GTypeInstance *instance,
208 typedef void (*GInterfaceInitFunc) (gpointer g_iface,
209 gpointer iface_data);
210 typedef void (*GInterfaceFinalizeFunc) (gpointer g_iface,
211 gpointer iface_data);
212 typedef gboolean (*GTypeClassCacheFunc) (gpointer cache_data,
213 GTypeClass *g_class);
214 typedef enum /*< skip >*/
216 G_TYPE_FLAG_CLASSED = (1 << 0),
217 G_TYPE_FLAG_INSTANTIATABLE = (1 << 1),
218 G_TYPE_FLAG_DERIVABLE = (1 << 2),
219 G_TYPE_FLAG_DEEP_DERIVABLE = (1 << 3)
220 } GTypeFundamentalFlags;
221 typedef enum /*< skip >*/
223 G_TYPE_FLAG_ABSTRACT = (1 << 4),
224 G_TYPE_FLAG_VALUE_ABSTRACT = (1 << 5)
228 /* interface types, classed types, instantiated types */
231 GBaseInitFunc base_init;
232 GBaseFinalizeFunc base_finalize;
234 /* classed types, instantiated types */
235 GClassInitFunc class_init;
236 GClassFinalizeFunc class_finalize;
237 gconstpointer class_data;
239 /* instantiated types */
240 guint16 instance_size;
242 GInstanceInitFunc instance_init;
245 const GTypeValueTable *value_table;
247 struct _GTypeFundamentalInfo
249 GTypeFundamentalFlags type_flags;
251 struct _GInterfaceInfo
253 GInterfaceInitFunc interface_init;
254 GInterfaceFinalizeFunc interface_finalize;
255 gpointer interface_data;
257 struct _GTypeValueTable
259 void (*value_init) (GValue *value);
260 void (*value_free) (GValue *value);
261 void (*value_copy) (const GValue *src_value,
263 /* varargs functionality (optional) */
264 gpointer (*value_peek_pointer) (const GValue *value);
265 gchar *collect_format;
266 gchar* (*collect_value) (GValue *value,
267 guint n_collect_values,
268 GTypeCValue *collect_values,
269 guint collect_flags);
271 gchar* (*lcopy_value) (const GValue *value,
272 guint n_collect_values,
273 GTypeCValue *collect_values,
274 guint collect_flags);
276 GType g_type_register_static (GType parent_type,
277 const gchar *type_name,
278 const GTypeInfo *info,
280 GType g_type_register_dynamic (GType parent_type,
281 const gchar *type_name,
284 GType g_type_register_fundamental (GType type_id,
285 const gchar *type_name,
286 const GTypeInfo *info,
287 const GTypeFundamentalInfo *finfo,
289 void g_type_add_interface_static (GType instance_type,
290 GType interface_type,
291 const GInterfaceInfo *info);
292 void g_type_add_interface_dynamic (GType instance_type,
293 GType interface_type,
294 GTypePlugin *plugin);
295 void g_type_interface_add_prerequisite (GType interface_type,
296 GType prerequisite_type);
299 /* --- protected (for fundamental type implementations) --- */
300 GTypePlugin* g_type_get_plugin (GType type);
301 GTypePlugin* g_type_interface_get_plugin (GType instance_type,
302 GType implementation_type);
303 GType g_type_fundamental_next (void);
304 GType g_type_fundamental (GType type_id);
305 GTypeInstance* g_type_create_instance (GType type);
306 void g_type_free_instance (GTypeInstance *instance);
307 void g_type_add_class_cache_func (gpointer cache_data,
308 GTypeClassCacheFunc cache_func);
309 void g_type_remove_class_cache_func (gpointer cache_data,
310 GTypeClassCacheFunc cache_func);
311 void g_type_class_unref_uncached (gpointer g_class);
312 GTypeValueTable* g_type_value_table_peek (GType type);
316 gboolean g_type_check_instance (GTypeInstance *instance);
317 GTypeInstance* g_type_check_instance_cast (GTypeInstance *instance,
319 gboolean g_type_check_instance_is_a (GTypeInstance *instance,
321 GTypeClass* g_type_check_class_cast (GTypeClass *g_class,
323 gboolean g_type_check_class_is_a (GTypeClass *g_class,
325 gboolean g_type_check_is_value_type (GType type);
326 gboolean g_type_check_value (GValue *value);
327 gboolean g_type_check_value_holds (GValue *value,
329 gboolean g_type_test_flags (GType type,
333 /* --- debugging functions --- */
334 G_CONST_RETURN gchar* g_type_name_from_instance (GTypeInstance *instance);
335 G_CONST_RETURN gchar* g_type_name_from_class (GTypeClass *g_class);
338 /* --- implementation bits --- */
339 #ifndef G_DISABLE_CAST_CHECKS
340 # define _G_TYPE_CIC(ip, gt, ct) \
341 ((ct*) g_type_check_instance_cast ((GTypeInstance*) ip, gt))
342 # define _G_TYPE_CCC(cp, gt, ct) \
343 ((ct*) g_type_check_class_cast ((GTypeClass*) cp, gt))
344 #else /* G_DISABLE_CAST_CHECKS */
345 # define _G_TYPE_CIC(ip, gt, ct) ((ct*) ip)
346 # define _G_TYPE_CCC(cp, gt, ct) ((ct*) cp)
347 #endif /* G_DISABLE_CAST_CHECKS */
348 #define _G_TYPE_CHI(ip) (g_type_check_instance ((GTypeInstance*) ip))
349 #define _G_TYPE_CVH(vl, gt) (g_type_check_value_holds ((GValue*) vl, gt))
350 #define _G_TYPE_CHV(vl) (g_type_check_value ((GValue*) vl))
351 #define _G_TYPE_IGC(ip, gt, ct) ((ct*) (((GTypeInstance*) ip)->g_class))
352 #define _G_TYPE_IGI(ip, gt, ct) ((ct*) g_type_interface_peek (((GTypeInstance*) ip)->g_class, gt))
354 # define _G_TYPE_CIT(ip, gt) ({ \
355 GTypeInstance *__inst = (GTypeInstance*) ip; GType __t = gt; gboolean __r; \
356 if (__inst && __inst->g_class && __inst->g_class->g_type == __t) \
359 __r = g_type_check_instance_is_a (__inst, __t); \
362 # define _G_TYPE_CCT(cp, gt) ({ \
363 GTypeClass *__class = (GTypeClass*) cp; GType __t = gt; gboolean __r; \
364 if (__class && __class->g_type == __t) \
367 __r = g_type_check_class_is_a (__class, __t); \
370 #else /* !__GNUC__ */
371 # define _G_TYPE_CIT(ip, gt) (g_type_check_instance_is_a ((GTypeInstance*) ip, gt))
372 # define _G_TYPE_CCT(cp, gt) (g_type_check_class_is_a ((GTypeClass*) cp, gt))
373 #endif /* !__GNUC__ */
374 #define G_TYPE_FLAG_RESERVED_ID_BIT (1 << 30)
375 extern GTypeDebugFlags _g_type_debug_flags;
379 #endif /* __G_TYPE_H__ */