1 /* iterable.c generated by valac, the Vala compiler
2 * generated from iterable.vala, do not modify */
3
4 /* iterable.vala
5 *
6 * Copyright (C) 2007-2008 Jürg Billeter
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 *
22 * Author:
23 * Jürg Billeter <j@bitron.ch>
24 */
25
26 #include "valagee.h"
27 #include <glib-object.h>
28 #include <glib.h>
29 #include <gobject/gvaluecollector.h>
30
31 typedef struct _ValaParamSpecIterable ValaParamSpecIterable;
32
33 struct _ValaIterablePrivate {
34 GType g_type;
35 GBoxedCopyFunc g_dup_func;
36 GDestroyNotify g_destroy_func;
37 };
38
39 struct _ValaParamSpecIterable {
40 GParamSpec parent_instance;
41 };
42
43 static gint ValaIterable_private_offset;
44 static gpointer vala_iterable_parent_class = NULL;
45
46 static GType vala_iterable_real_get_element_type (ValaIterable* self);
47 static ValaIterator* vala_iterable_real_iterator (ValaIterable* self);
48 static void vala_iterable_finalize (ValaIterable * obj);
49 static GType vala_iterable_get_type_once (void);
50
51 static inline gpointer
vala_iterable_get_instance_private(ValaIterable * self)52 vala_iterable_get_instance_private (ValaIterable* self)
53 {
54 return G_STRUCT_MEMBER_P (self, ValaIterable_private_offset);
55 }
56
57 static GType
vala_iterable_real_get_element_type(ValaIterable * self)58 vala_iterable_real_get_element_type (ValaIterable* self)
59 {
60 GType _tmp0_ = 0UL;
61 g_critical ("Type `%s' does not implement abstract method `vala_iterable_get_element_type'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
62 return _tmp0_;
63 }
64
65 GType
vala_iterable_get_element_type(ValaIterable * self)66 vala_iterable_get_element_type (ValaIterable* self)
67 {
68 g_return_val_if_fail (self != NULL, 0UL);
69 return VALA_ITERABLE_GET_CLASS (self)->get_element_type (self);
70 }
71
72 /**
73 * Returns a Iterator that can be used for simple iteration over a
74 * collection.
75 *
76 * @return a Iterator that can be used for simple iteration over a
77 * collection
78 */
79 static ValaIterator*
vala_iterable_real_iterator(ValaIterable * self)80 vala_iterable_real_iterator (ValaIterable* self)
81 {
82 g_critical ("Type `%s' does not implement abstract method `vala_iterable_iterator'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
83 return NULL;
84 }
85
86 ValaIterator*
vala_iterable_iterator(ValaIterable * self)87 vala_iterable_iterator (ValaIterable* self)
88 {
89 g_return_val_if_fail (self != NULL, NULL);
90 return VALA_ITERABLE_GET_CLASS (self)->iterator (self);
91 }
92
93 ValaIterable*
vala_iterable_construct(GType object_type,GType g_type,GBoxedCopyFunc g_dup_func,GDestroyNotify g_destroy_func)94 vala_iterable_construct (GType object_type,
95 GType g_type,
96 GBoxedCopyFunc g_dup_func,
97 GDestroyNotify g_destroy_func)
98 {
99 ValaIterable* self = NULL;
100 self = (ValaIterable*) g_type_create_instance (object_type);
101 self->priv->g_type = g_type;
102 self->priv->g_dup_func = g_dup_func;
103 self->priv->g_destroy_func = g_destroy_func;
104 return self;
105 }
106
107 static void
vala_value_iterable_init(GValue * value)108 vala_value_iterable_init (GValue* value)
109 {
110 value->data[0].v_pointer = NULL;
111 }
112
113 static void
vala_value_iterable_free_value(GValue * value)114 vala_value_iterable_free_value (GValue* value)
115 {
116 if (value->data[0].v_pointer) {
117 vala_iterable_unref (value->data[0].v_pointer);
118 }
119 }
120
121 static void
vala_value_iterable_copy_value(const GValue * src_value,GValue * dest_value)122 vala_value_iterable_copy_value (const GValue* src_value,
123 GValue* dest_value)
124 {
125 if (src_value->data[0].v_pointer) {
126 dest_value->data[0].v_pointer = vala_iterable_ref (src_value->data[0].v_pointer);
127 } else {
128 dest_value->data[0].v_pointer = NULL;
129 }
130 }
131
132 static gpointer
vala_value_iterable_peek_pointer(const GValue * value)133 vala_value_iterable_peek_pointer (const GValue* value)
134 {
135 return value->data[0].v_pointer;
136 }
137
138 static gchar*
vala_value_iterable_collect_value(GValue * value,guint n_collect_values,GTypeCValue * collect_values,guint collect_flags)139 vala_value_iterable_collect_value (GValue* value,
140 guint n_collect_values,
141 GTypeCValue* collect_values,
142 guint collect_flags)
143 {
144 if (collect_values[0].v_pointer) {
145 ValaIterable * object;
146 object = collect_values[0].v_pointer;
147 if (object->parent_instance.g_class == NULL) {
148 return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
149 } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
150 return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
151 }
152 value->data[0].v_pointer = vala_iterable_ref (object);
153 } else {
154 value->data[0].v_pointer = NULL;
155 }
156 return NULL;
157 }
158
159 static gchar*
vala_value_iterable_lcopy_value(const GValue * value,guint n_collect_values,GTypeCValue * collect_values,guint collect_flags)160 vala_value_iterable_lcopy_value (const GValue* value,
161 guint n_collect_values,
162 GTypeCValue* collect_values,
163 guint collect_flags)
164 {
165 ValaIterable ** object_p;
166 object_p = collect_values[0].v_pointer;
167 if (!object_p) {
168 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
169 }
170 if (!value->data[0].v_pointer) {
171 *object_p = NULL;
172 } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
173 *object_p = value->data[0].v_pointer;
174 } else {
175 *object_p = vala_iterable_ref (value->data[0].v_pointer);
176 }
177 return NULL;
178 }
179
180 GParamSpec*
vala_param_spec_iterable(const gchar * name,const gchar * nick,const gchar * blurb,GType object_type,GParamFlags flags)181 vala_param_spec_iterable (const gchar* name,
182 const gchar* nick,
183 const gchar* blurb,
184 GType object_type,
185 GParamFlags flags)
186 {
187 ValaParamSpecIterable* spec;
188 g_return_val_if_fail (g_type_is_a (object_type, VALA_TYPE_ITERABLE), NULL);
189 spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
190 G_PARAM_SPEC (spec)->value_type = object_type;
191 return G_PARAM_SPEC (spec);
192 }
193
194 gpointer
vala_value_get_iterable(const GValue * value)195 vala_value_get_iterable (const GValue* value)
196 {
197 g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, VALA_TYPE_ITERABLE), NULL);
198 return value->data[0].v_pointer;
199 }
200
201 void
vala_value_set_iterable(GValue * value,gpointer v_object)202 vala_value_set_iterable (GValue* value,
203 gpointer v_object)
204 {
205 ValaIterable * old;
206 g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, VALA_TYPE_ITERABLE));
207 old = value->data[0].v_pointer;
208 if (v_object) {
209 g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, VALA_TYPE_ITERABLE));
210 g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
211 value->data[0].v_pointer = v_object;
212 vala_iterable_ref (value->data[0].v_pointer);
213 } else {
214 value->data[0].v_pointer = NULL;
215 }
216 if (old) {
217 vala_iterable_unref (old);
218 }
219 }
220
221 void
vala_value_take_iterable(GValue * value,gpointer v_object)222 vala_value_take_iterable (GValue* value,
223 gpointer v_object)
224 {
225 ValaIterable * old;
226 g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, VALA_TYPE_ITERABLE));
227 old = value->data[0].v_pointer;
228 if (v_object) {
229 g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, VALA_TYPE_ITERABLE));
230 g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
231 value->data[0].v_pointer = v_object;
232 } else {
233 value->data[0].v_pointer = NULL;
234 }
235 if (old) {
236 vala_iterable_unref (old);
237 }
238 }
239
240 static void
vala_iterable_class_init(ValaIterableClass * klass,gpointer klass_data)241 vala_iterable_class_init (ValaIterableClass * klass,
242 gpointer klass_data)
243 {
244 vala_iterable_parent_class = g_type_class_peek_parent (klass);
245 ((ValaIterableClass *) klass)->finalize = vala_iterable_finalize;
246 g_type_class_adjust_private_offset (klass, &ValaIterable_private_offset);
247 ((ValaIterableClass *) klass)->get_element_type = (GType (*) (ValaIterable*)) vala_iterable_real_get_element_type;
248 ((ValaIterableClass *) klass)->iterator = (ValaIterator* (*) (ValaIterable*)) vala_iterable_real_iterator;
249 }
250
251 static void
vala_iterable_instance_init(ValaIterable * self,gpointer klass)252 vala_iterable_instance_init (ValaIterable * self,
253 gpointer klass)
254 {
255 self->priv = vala_iterable_get_instance_private (self);
256 self->ref_count = 1;
257 }
258
259 static void
vala_iterable_finalize(ValaIterable * obj)260 vala_iterable_finalize (ValaIterable * obj)
261 {
262 ValaIterable * self;
263 self = G_TYPE_CHECK_INSTANCE_CAST (obj, VALA_TYPE_ITERABLE, ValaIterable);
264 g_signal_handlers_destroy (self);
265 }
266
267 /**
268 * Implemented by classes that support a simple iteration over instances of the
269 * collection.
270 */
271 static GType
vala_iterable_get_type_once(void)272 vala_iterable_get_type_once (void)
273 {
274 static const GTypeValueTable g_define_type_value_table = { vala_value_iterable_init, vala_value_iterable_free_value, vala_value_iterable_copy_value, vala_value_iterable_peek_pointer, "p", vala_value_iterable_collect_value, "p", vala_value_iterable_lcopy_value };
275 static const GTypeInfo g_define_type_info = { sizeof (ValaIterableClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) vala_iterable_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ValaIterable), 0, (GInstanceInitFunc) vala_iterable_instance_init, &g_define_type_value_table };
276 static const GTypeFundamentalInfo g_define_type_fundamental_info = { (G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
277 GType vala_iterable_type_id;
278 vala_iterable_type_id = g_type_register_fundamental (g_type_fundamental_next (), "ValaIterable", &g_define_type_info, &g_define_type_fundamental_info, G_TYPE_FLAG_ABSTRACT);
279 ValaIterable_private_offset = g_type_add_instance_private (vala_iterable_type_id, sizeof (ValaIterablePrivate));
280 return vala_iterable_type_id;
281 }
282
283 GType
vala_iterable_get_type(void)284 vala_iterable_get_type (void)
285 {
286 static volatile gsize vala_iterable_type_id__volatile = 0;
287 if (g_once_init_enter (&vala_iterable_type_id__volatile)) {
288 GType vala_iterable_type_id;
289 vala_iterable_type_id = vala_iterable_get_type_once ();
290 g_once_init_leave (&vala_iterable_type_id__volatile, vala_iterable_type_id);
291 }
292 return vala_iterable_type_id__volatile;
293 }
294
295 gpointer
vala_iterable_ref(gpointer instance)296 vala_iterable_ref (gpointer instance)
297 {
298 ValaIterable * self;
299 self = instance;
300 g_atomic_int_inc (&self->ref_count);
301 return instance;
302 }
303
304 void
vala_iterable_unref(gpointer instance)305 vala_iterable_unref (gpointer instance)
306 {
307 ValaIterable * self;
308 self = instance;
309 if (g_atomic_int_dec_and_test (&self->ref_count)) {
310 VALA_ITERABLE_GET_CLASS (self)->finalize (self);
311 g_type_free_instance ((GTypeInstance *) self);
312 }
313 }
314
315