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