removed archaic gpointer derived_data; relict and added a GData member
[platform/upstream/glib.git] / gobject / gvaluecollector.h
1 /* GObject - GLib Type, Object, Parameter and Signal Library
2  * Copyright (C) 1998-1999, 2000-2001 Tim Janik and Red Hat, Inc.
3  *
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.
8  *
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.
13  *
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.
18  *
19  * gvaluecollector.h: GValue varargs stubs
20  */
21 #ifndef __G_VALUE_COLLECTOR_H__
22 #define __G_VALUE_COLLECTOR_H__
23
24 G_BEGIN_DECLS
25
26 /* we may want to add aggregate types here some day, if requested
27  * by users. the basic C types are covered already, everything
28  * smaller than an int is promoted to an integer and floats are
29  * always promoted to doubles for varargs call constructions.
30  */
31 enum    /*< skip >*/
32 {
33   G_VALUE_COLLECT_INT           = 'i',
34   G_VALUE_COLLECT_LONG          = 'l',
35   G_VALUE_COLLECT_DOUBLE        = 'd',
36   G_VALUE_COLLECT_POINTER       = 'p'
37 };
38
39
40 /* vararg union holding actuall values collected
41  */
42 union _GTypeCValue
43 {
44   gint     v_int;
45   glong    v_long;
46   gdouble  v_double;
47   gpointer v_pointer;
48 };
49
50
51 /* G_VALUE_COLLECT() collects a variable argument value
52  * from a va_list. we have to implement the varargs collection as a
53  * macro, because on some systems va_list variables cannot be passed
54  * by reference.
55  * value is supposed to be initialized according to the value
56  * type to be collected.
57  * var_args is the va_list variable and may be evaluated multiple times.
58  * __error is a gchar** variable that will be modified to hold a g_new()
59  * allocated error messages if something fails.
60  */
61 #define G_VALUE_COLLECT(value, var_args, flags, __error)                                \
62 G_STMT_START {                                                                          \
63   GValue *_value = (value);                                                             \
64   guint _flags = (flags);                                                               \
65   GType _value_type = G_VALUE_TYPE (_value);                                            \
66   GTypeValueTable *_vtable = g_type_value_table_peek (_value_type);                     \
67   gchar *_collect_format = _vtable->collect_format;                                     \
68   GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, };                \
69   guint _n_values = 0;                                                                  \
70                                                                                         \
71   if (_vtable->value_free)                                                              \
72     _vtable->value_free (_value);                                                       \
73   _value->g_type = _value_type;         /* value_meminit() from gvalue.c */             \
74   memset (_value->data, 0, sizeof (_value->data));                                      \
75   while (*_collect_format)                                                              \
76     {                                                                                   \
77       GTypeCValue *_cvalue = _cvalues + _n_values++;                                    \
78                                                                                         \
79       switch (*_collect_format++)                                                       \
80         {                                                                               \
81         case G_VALUE_COLLECT_INT:                                                       \
82           _cvalue->v_int = va_arg ((var_args), gint);                                   \
83           break;                                                                        \
84         case G_VALUE_COLLECT_LONG:                                                      \
85           _cvalue->v_long = va_arg ((var_args), glong);                                 \
86           break;                                                                        \
87         case G_VALUE_COLLECT_DOUBLE:                                                    \
88           _cvalue->v_double = va_arg ((var_args), gdouble);                             \
89           break;                                                                        \
90         case G_VALUE_COLLECT_POINTER:                                                   \
91           _cvalue->v_pointer = va_arg ((var_args), gpointer);                           \
92           break;                                                                        \
93         default:                                                                        \
94           g_assert_not_reached ();                                                      \
95         }                                                                               \
96     }                                                                                   \
97   *(__error) = _vtable->collect_value (_value,                                          \
98                                        _n_values,                                       \
99                                        _cvalues,                                        \
100                                        _flags);                                         \
101 } G_STMT_END
102
103
104 /* G_VALUE_LCOPY() collects a value's variable argument
105  * locations from a va_list. usage is analogous to G_VALUE_COLLECT().
106  */
107 #define G_VALUE_LCOPY(value, var_args, flags, __error)                                  \
108 G_STMT_START {                                                                          \
109   const GValue *_value = (value);                                                       \
110   guint _flags = (flags);                                                               \
111   GType _value_type = G_VALUE_TYPE (_value);                                            \
112   GTypeValueTable *_vtable = g_type_value_table_peek (_value_type);                     \
113   gchar *_lcopy_format = _vtable->lcopy_format;                                         \
114   GTypeCValue _cvalues[G_VALUE_COLLECT_FORMAT_MAX_LENGTH] = { { 0, }, };                \
115   guint _n_values = 0;                                                                  \
116                                                                                         \
117   while (*_lcopy_format)                                                                \
118     {                                                                                   \
119       GTypeCValue *_cvalue = _cvalues + _n_values++;                                    \
120                                                                                         \
121       switch (*_lcopy_format++)                                                         \
122         {                                                                               \
123         case G_VALUE_COLLECT_INT:                                                       \
124           _cvalue->v_int = va_arg ((var_args), gint);                                   \
125           break;                                                                        \
126         case G_VALUE_COLLECT_LONG:                                                      \
127           _cvalue->v_long = va_arg ((var_args), glong);                                 \
128           break;                                                                        \
129         case G_VALUE_COLLECT_DOUBLE:                                                    \
130           _cvalue->v_double = va_arg ((var_args), gdouble);                             \
131           break;                                                                        \
132         case G_VALUE_COLLECT_POINTER:                                                   \
133           _cvalue->v_pointer = va_arg ((var_args), gpointer);                           \
134           break;                                                                        \
135         default:                                                                        \
136           g_assert_not_reached ();                                                      \
137         }                                                                               \
138     }                                                                                   \
139   *(__error) = _vtable->lcopy_value (_value,                                            \
140                                      _n_values,                                         \
141                                      _cvalues,                                          \
142                                      _flags);                                           \
143 } G_STMT_END
144
145
146 #define G_VALUE_COLLECT_FORMAT_MAX_LENGTH       (8)
147
148 G_END_DECLS
149
150 #endif /* __G_VALUE_COLLECTOR_H__ */