1 /* iterator.c generated by valac, the Vala compiler
2 * generated from iterator.vala, do not modify */
3
4 /* iterator.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 _ValaParamSpecIterator ValaParamSpecIterator;
32
33 struct _ValaIteratorPrivate {
34 GType g_type;
35 GBoxedCopyFunc g_dup_func;
36 GDestroyNotify g_destroy_func;
37 };
38
39 struct _ValaParamSpecIterator {
40 GParamSpec parent_instance;
41 };
42
43 static gint ValaIterator_private_offset;
44 static gpointer vala_iterator_parent_class = NULL;
45
46 static gboolean vala_iterator_real_next (ValaIterator* self);
47 static gboolean vala_iterator_real_has_next (ValaIterator* self);
48 static gpointer vala_iterator_real_get (ValaIterator* self);
49 static void vala_iterator_real_remove (ValaIterator* self);
50 static void vala_iterator_finalize (ValaIterator * obj);
51 static GType vala_iterator_get_type_once (void);
52
53 static inline gpointer
vala_iterator_get_instance_private(ValaIterator * self)54 vala_iterator_get_instance_private (ValaIterator* self)
55 {
56 return G_STRUCT_MEMBER_P (self, ValaIterator_private_offset);
57 }
58
59 /**
60 * Advances to the next element in the iteration.
61 *
62 * @return true if the iterator has a next element
63 */
64 static gboolean
vala_iterator_real_next(ValaIterator * self)65 vala_iterator_real_next (ValaIterator* self)
66 {
67 gboolean _tmp0_ = FALSE;
68 g_critical ("Type `%s' does not implement abstract method `vala_iterator_next'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
69 return _tmp0_;
70 }
71
72 gboolean
vala_iterator_next(ValaIterator * self)73 vala_iterator_next (ValaIterator* self)
74 {
75 g_return_val_if_fail (self != NULL, FALSE);
76 return VALA_ITERATOR_GET_CLASS (self)->next (self);
77 }
78
79 /**
80 * Checks whether there is a next element in the iteration.
81 *
82 * @return ``true`` if the iterator has a next element
83 */
84 static gboolean
vala_iterator_real_has_next(ValaIterator * self)85 vala_iterator_real_has_next (ValaIterator* self)
86 {
87 gboolean _tmp0_ = FALSE;
88 g_critical ("Type `%s' does not implement abstract method `vala_iterator_has_next'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
89 return _tmp0_;
90 }
91
92 gboolean
vala_iterator_has_next(ValaIterator * self)93 vala_iterator_has_next (ValaIterator* self)
94 {
95 g_return_val_if_fail (self != NULL, FALSE);
96 return VALA_ITERATOR_GET_CLASS (self)->has_next (self);
97 }
98
99 /**
100 * Returns the current element in the iteration.
101 *
102 * @return the current element in the iteration
103 */
104 static gpointer
vala_iterator_real_get(ValaIterator * self)105 vala_iterator_real_get (ValaIterator* self)
106 {
107 g_critical ("Type `%s' does not implement abstract method `vala_iterator_get'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
108 return NULL;
109 }
110
111 gpointer
vala_iterator_get(ValaIterator * self)112 vala_iterator_get (ValaIterator* self)
113 {
114 g_return_val_if_fail (self != NULL, NULL);
115 return VALA_ITERATOR_GET_CLASS (self)->get (self);
116 }
117
118 /**
119 * Removes the current element in the iteration. The cursor is set in an
120 * in-between state. Both {@link get} and {@link remove} will fail until
121 * the next move of the cursor (calling {@link next}).
122 */
123 static void
vala_iterator_real_remove(ValaIterator * self)124 vala_iterator_real_remove (ValaIterator* self)
125 {
126 g_critical ("Type `%s' does not implement abstract method `vala_iterator_remove'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
127 return;
128 }
129
130 void
vala_iterator_remove(ValaIterator * self)131 vala_iterator_remove (ValaIterator* self)
132 {
133 g_return_if_fail (self != NULL);
134 VALA_ITERATOR_GET_CLASS (self)->remove (self);
135 }
136
137 gboolean
vala_iterator_get_valid(ValaIterator * self)138 vala_iterator_get_valid (ValaIterator* self)
139 {
140 g_return_val_if_fail (self != NULL, FALSE);
141 return VALA_ITERATOR_GET_CLASS (self)->get_valid (self);
142 }
143
144 ValaIterator*
vala_iterator_construct(GType object_type,GType g_type,GBoxedCopyFunc g_dup_func,GDestroyNotify g_destroy_func)145 vala_iterator_construct (GType object_type,
146 GType g_type,
147 GBoxedCopyFunc g_dup_func,
148 GDestroyNotify g_destroy_func)
149 {
150 ValaIterator* self = NULL;
151 self = (ValaIterator*) g_type_create_instance (object_type);
152 self->priv->g_type = g_type;
153 self->priv->g_dup_func = g_dup_func;
154 self->priv->g_destroy_func = g_destroy_func;
155 return self;
156 }
157
158 static void
vala_value_iterator_init(GValue * value)159 vala_value_iterator_init (GValue* value)
160 {
161 value->data[0].v_pointer = NULL;
162 }
163
164 static void
vala_value_iterator_free_value(GValue * value)165 vala_value_iterator_free_value (GValue* value)
166 {
167 if (value->data[0].v_pointer) {
168 vala_iterator_unref (value->data[0].v_pointer);
169 }
170 }
171
172 static void
vala_value_iterator_copy_value(const GValue * src_value,GValue * dest_value)173 vala_value_iterator_copy_value (const GValue* src_value,
174 GValue* dest_value)
175 {
176 if (src_value->data[0].v_pointer) {
177 dest_value->data[0].v_pointer = vala_iterator_ref (src_value->data[0].v_pointer);
178 } else {
179 dest_value->data[0].v_pointer = NULL;
180 }
181 }
182
183 static gpointer
vala_value_iterator_peek_pointer(const GValue * value)184 vala_value_iterator_peek_pointer (const GValue* value)
185 {
186 return value->data[0].v_pointer;
187 }
188
189 static gchar*
vala_value_iterator_collect_value(GValue * value,guint n_collect_values,GTypeCValue * collect_values,guint collect_flags)190 vala_value_iterator_collect_value (GValue* value,
191 guint n_collect_values,
192 GTypeCValue* collect_values,
193 guint collect_flags)
194 {
195 if (collect_values[0].v_pointer) {
196 ValaIterator * object;
197 object = collect_values[0].v_pointer;
198 if (object->parent_instance.g_class == NULL) {
199 return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
200 } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
201 return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
202 }
203 value->data[0].v_pointer = vala_iterator_ref (object);
204 } else {
205 value->data[0].v_pointer = NULL;
206 }
207 return NULL;
208 }
209
210 static gchar*
vala_value_iterator_lcopy_value(const GValue * value,guint n_collect_values,GTypeCValue * collect_values,guint collect_flags)211 vala_value_iterator_lcopy_value (const GValue* value,
212 guint n_collect_values,
213 GTypeCValue* collect_values,
214 guint collect_flags)
215 {
216 ValaIterator ** object_p;
217 object_p = collect_values[0].v_pointer;
218 if (!object_p) {
219 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
220 }
221 if (!value->data[0].v_pointer) {
222 *object_p = NULL;
223 } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
224 *object_p = value->data[0].v_pointer;
225 } else {
226 *object_p = vala_iterator_ref (value->data[0].v_pointer);
227 }
228 return NULL;
229 }
230
231 GParamSpec*
vala_param_spec_iterator(const gchar * name,const gchar * nick,const gchar * blurb,GType object_type,GParamFlags flags)232 vala_param_spec_iterator (const gchar* name,
233 const gchar* nick,
234 const gchar* blurb,
235 GType object_type,
236 GParamFlags flags)
237 {
238 ValaParamSpecIterator* spec;
239 g_return_val_if_fail (g_type_is_a (object_type, VALA_TYPE_ITERATOR), NULL);
240 spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
241 G_PARAM_SPEC (spec)->value_type = object_type;
242 return G_PARAM_SPEC (spec);
243 }
244
245 gpointer
vala_value_get_iterator(const GValue * value)246 vala_value_get_iterator (const GValue* value)
247 {
248 g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, VALA_TYPE_ITERATOR), NULL);
249 return value->data[0].v_pointer;
250 }
251
252 void
vala_value_set_iterator(GValue * value,gpointer v_object)253 vala_value_set_iterator (GValue* value,
254 gpointer v_object)
255 {
256 ValaIterator * old;
257 g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, VALA_TYPE_ITERATOR));
258 old = value->data[0].v_pointer;
259 if (v_object) {
260 g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, VALA_TYPE_ITERATOR));
261 g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
262 value->data[0].v_pointer = v_object;
263 vala_iterator_ref (value->data[0].v_pointer);
264 } else {
265 value->data[0].v_pointer = NULL;
266 }
267 if (old) {
268 vala_iterator_unref (old);
269 }
270 }
271
272 void
vala_value_take_iterator(GValue * value,gpointer v_object)273 vala_value_take_iterator (GValue* value,
274 gpointer v_object)
275 {
276 ValaIterator * old;
277 g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, VALA_TYPE_ITERATOR));
278 old = value->data[0].v_pointer;
279 if (v_object) {
280 g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, VALA_TYPE_ITERATOR));
281 g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
282 value->data[0].v_pointer = v_object;
283 } else {
284 value->data[0].v_pointer = NULL;
285 }
286 if (old) {
287 vala_iterator_unref (old);
288 }
289 }
290
291 static void
vala_iterator_class_init(ValaIteratorClass * klass,gpointer klass_data)292 vala_iterator_class_init (ValaIteratorClass * klass,
293 gpointer klass_data)
294 {
295 vala_iterator_parent_class = g_type_class_peek_parent (klass);
296 ((ValaIteratorClass *) klass)->finalize = vala_iterator_finalize;
297 g_type_class_adjust_private_offset (klass, &ValaIterator_private_offset);
298 ((ValaIteratorClass *) klass)->next = (gboolean (*) (ValaIterator*)) vala_iterator_real_next;
299 ((ValaIteratorClass *) klass)->has_next = (gboolean (*) (ValaIterator*)) vala_iterator_real_has_next;
300 ((ValaIteratorClass *) klass)->get = (gpointer (*) (ValaIterator*)) vala_iterator_real_get;
301 ((ValaIteratorClass *) klass)->remove = (void (*) (ValaIterator*)) vala_iterator_real_remove;
302 }
303
304 static void
vala_iterator_instance_init(ValaIterator * self,gpointer klass)305 vala_iterator_instance_init (ValaIterator * self,
306 gpointer klass)
307 {
308 self->priv = vala_iterator_get_instance_private (self);
309 self->ref_count = 1;
310 }
311
312 static void
vala_iterator_finalize(ValaIterator * obj)313 vala_iterator_finalize (ValaIterator * obj)
314 {
315 ValaIterator * self;
316 self = G_TYPE_CHECK_INSTANCE_CAST (obj, VALA_TYPE_ITERATOR, ValaIterator);
317 g_signal_handlers_destroy (self);
318 }
319
320 /**
321 * Implemented by classes that support a simple iteration over instances of the
322 * collection.
323 */
324 static GType
vala_iterator_get_type_once(void)325 vala_iterator_get_type_once (void)
326 {
327 static const GTypeValueTable g_define_type_value_table = { vala_value_iterator_init, vala_value_iterator_free_value, vala_value_iterator_copy_value, vala_value_iterator_peek_pointer, "p", vala_value_iterator_collect_value, "p", vala_value_iterator_lcopy_value };
328 static const GTypeInfo g_define_type_info = { sizeof (ValaIteratorClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) vala_iterator_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ValaIterator), 0, (GInstanceInitFunc) vala_iterator_instance_init, &g_define_type_value_table };
329 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) };
330 GType vala_iterator_type_id;
331 vala_iterator_type_id = g_type_register_fundamental (g_type_fundamental_next (), "ValaIterator", &g_define_type_info, &g_define_type_fundamental_info, G_TYPE_FLAG_ABSTRACT);
332 ValaIterator_private_offset = g_type_add_instance_private (vala_iterator_type_id, sizeof (ValaIteratorPrivate));
333 return vala_iterator_type_id;
334 }
335
336 GType
vala_iterator_get_type(void)337 vala_iterator_get_type (void)
338 {
339 static volatile gsize vala_iterator_type_id__volatile = 0;
340 if (g_once_init_enter (&vala_iterator_type_id__volatile)) {
341 GType vala_iterator_type_id;
342 vala_iterator_type_id = vala_iterator_get_type_once ();
343 g_once_init_leave (&vala_iterator_type_id__volatile, vala_iterator_type_id);
344 }
345 return vala_iterator_type_id__volatile;
346 }
347
348 gpointer
vala_iterator_ref(gpointer instance)349 vala_iterator_ref (gpointer instance)
350 {
351 ValaIterator * self;
352 self = instance;
353 g_atomic_int_inc (&self->ref_count);
354 return instance;
355 }
356
357 void
vala_iterator_unref(gpointer instance)358 vala_iterator_unref (gpointer instance)
359 {
360 ValaIterator * self;
361 self = instance;
362 if (g_atomic_int_dec_and_test (&self->ref_count)) {
363 VALA_ITERATOR_GET_CLASS (self)->finalize (self);
364 g_type_free_instance ((GTypeInstance *) self);
365 }
366 }
367
368