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