1 /* mapiterator.c generated by valac, the Vala compiler
2  * generated from mapiterator.vala, do not modify */
3 
4 /* mapiterator.vala
5  *
6  * Copyright (C) 2011  Florian Brosch
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  * 	Florian Brosch <flo.brosch@gmail.com>
24  */
25 
26 #include "valagee.h"
27 #include <glib-object.h>
28 #include <glib.h>
29 #include <gobject/gvaluecollector.h>
30 
31 typedef struct _ValaParamSpecMapIterator ValaParamSpecMapIterator;
32 
33 struct _ValaMapIteratorPrivate {
34 	GType k_type;
35 	GBoxedCopyFunc k_dup_func;
36 	GDestroyNotify k_destroy_func;
37 	GType v_type;
38 	GBoxedCopyFunc v_dup_func;
39 	GDestroyNotify v_destroy_func;
40 };
41 
42 struct _ValaParamSpecMapIterator {
43 	GParamSpec parent_instance;
44 };
45 
46 static gint ValaMapIterator_private_offset;
47 static gpointer vala_map_iterator_parent_class = NULL;
48 
49 static gboolean vala_map_iterator_real_next (ValaMapIterator* self);
50 static gpointer vala_map_iterator_real_get_key (ValaMapIterator* self);
51 static gpointer vala_map_iterator_real_get_value (ValaMapIterator* self);
52 static void vala_map_iterator_finalize (ValaMapIterator * obj);
53 static GType vala_map_iterator_get_type_once (void);
54 
55 static inline gpointer
vala_map_iterator_get_instance_private(ValaMapIterator * self)56 vala_map_iterator_get_instance_private (ValaMapIterator* self)
57 {
58 	return G_STRUCT_MEMBER_P (self, ValaMapIterator_private_offset);
59 }
60 
61 /**
62  * Advances to the next element in the iteration.
63  *
64  * @return true if the iterator has a next element
65  */
66 static gboolean
vala_map_iterator_real_next(ValaMapIterator * self)67 vala_map_iterator_real_next (ValaMapIterator* self)
68 {
69 	gboolean _tmp0_ = FALSE;
70 	g_critical ("Type `%s' does not implement abstract method `vala_map_iterator_next'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
71 	return _tmp0_;
72 }
73 
74 gboolean
vala_map_iterator_next(ValaMapIterator * self)75 vala_map_iterator_next (ValaMapIterator* self)
76 {
77 	g_return_val_if_fail (self != NULL, FALSE);
78 	return VALA_MAP_ITERATOR_GET_CLASS (self)->next (self);
79 }
80 
81 /**
82  * Returns the current key in the iteration.
83  *
84  * @return the current key in the iteration
85  */
86 static gpointer
vala_map_iterator_real_get_key(ValaMapIterator * self)87 vala_map_iterator_real_get_key (ValaMapIterator* self)
88 {
89 	g_critical ("Type `%s' does not implement abstract method `vala_map_iterator_get_key'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
90 	return NULL;
91 }
92 
93 gpointer
vala_map_iterator_get_key(ValaMapIterator * self)94 vala_map_iterator_get_key (ValaMapIterator* self)
95 {
96 	g_return_val_if_fail (self != NULL, NULL);
97 	return VALA_MAP_ITERATOR_GET_CLASS (self)->get_key (self);
98 }
99 
100 /**
101  * Returns the current value in the iteration.
102  *
103  * @return the current value in the iteration
104  */
105 static gpointer
vala_map_iterator_real_get_value(ValaMapIterator * self)106 vala_map_iterator_real_get_value (ValaMapIterator* self)
107 {
108 	g_critical ("Type `%s' does not implement abstract method `vala_map_iterator_get_value'", g_type_name (G_TYPE_FROM_INSTANCE (self)));
109 	return NULL;
110 }
111 
112 gpointer
vala_map_iterator_get_value(ValaMapIterator * self)113 vala_map_iterator_get_value (ValaMapIterator* self)
114 {
115 	g_return_val_if_fail (self != NULL, NULL);
116 	return VALA_MAP_ITERATOR_GET_CLASS (self)->get_value (self);
117 }
118 
119 ValaMapIterator*
vala_map_iterator_construct(GType object_type,GType k_type,GBoxedCopyFunc k_dup_func,GDestroyNotify k_destroy_func,GType v_type,GBoxedCopyFunc v_dup_func,GDestroyNotify v_destroy_func)120 vala_map_iterator_construct (GType object_type,
121                              GType k_type,
122                              GBoxedCopyFunc k_dup_func,
123                              GDestroyNotify k_destroy_func,
124                              GType v_type,
125                              GBoxedCopyFunc v_dup_func,
126                              GDestroyNotify v_destroy_func)
127 {
128 	ValaMapIterator* self = NULL;
129 	self = (ValaMapIterator*) g_type_create_instance (object_type);
130 	self->priv->k_type = k_type;
131 	self->priv->k_dup_func = k_dup_func;
132 	self->priv->k_destroy_func = k_destroy_func;
133 	self->priv->v_type = v_type;
134 	self->priv->v_dup_func = v_dup_func;
135 	self->priv->v_destroy_func = v_destroy_func;
136 	return self;
137 }
138 
139 static void
vala_value_map_iterator_init(GValue * value)140 vala_value_map_iterator_init (GValue* value)
141 {
142 	value->data[0].v_pointer = NULL;
143 }
144 
145 static void
vala_value_map_iterator_free_value(GValue * value)146 vala_value_map_iterator_free_value (GValue* value)
147 {
148 	if (value->data[0].v_pointer) {
149 		vala_map_iterator_unref (value->data[0].v_pointer);
150 	}
151 }
152 
153 static void
vala_value_map_iterator_copy_value(const GValue * src_value,GValue * dest_value)154 vala_value_map_iterator_copy_value (const GValue* src_value,
155                                     GValue* dest_value)
156 {
157 	if (src_value->data[0].v_pointer) {
158 		dest_value->data[0].v_pointer = vala_map_iterator_ref (src_value->data[0].v_pointer);
159 	} else {
160 		dest_value->data[0].v_pointer = NULL;
161 	}
162 }
163 
164 static gpointer
vala_value_map_iterator_peek_pointer(const GValue * value)165 vala_value_map_iterator_peek_pointer (const GValue* value)
166 {
167 	return value->data[0].v_pointer;
168 }
169 
170 static gchar*
vala_value_map_iterator_collect_value(GValue * value,guint n_collect_values,GTypeCValue * collect_values,guint collect_flags)171 vala_value_map_iterator_collect_value (GValue* value,
172                                        guint n_collect_values,
173                                        GTypeCValue* collect_values,
174                                        guint collect_flags)
175 {
176 	if (collect_values[0].v_pointer) {
177 		ValaMapIterator * object;
178 		object = collect_values[0].v_pointer;
179 		if (object->parent_instance.g_class == NULL) {
180 			return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
181 		} else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
182 			return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
183 		}
184 		value->data[0].v_pointer = vala_map_iterator_ref (object);
185 	} else {
186 		value->data[0].v_pointer = NULL;
187 	}
188 	return NULL;
189 }
190 
191 static gchar*
vala_value_map_iterator_lcopy_value(const GValue * value,guint n_collect_values,GTypeCValue * collect_values,guint collect_flags)192 vala_value_map_iterator_lcopy_value (const GValue* value,
193                                      guint n_collect_values,
194                                      GTypeCValue* collect_values,
195                                      guint collect_flags)
196 {
197 	ValaMapIterator ** object_p;
198 	object_p = collect_values[0].v_pointer;
199 	if (!object_p) {
200 		return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
201 	}
202 	if (!value->data[0].v_pointer) {
203 		*object_p = NULL;
204 	} else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
205 		*object_p = value->data[0].v_pointer;
206 	} else {
207 		*object_p = vala_map_iterator_ref (value->data[0].v_pointer);
208 	}
209 	return NULL;
210 }
211 
212 GParamSpec*
vala_param_spec_map_iterator(const gchar * name,const gchar * nick,const gchar * blurb,GType object_type,GParamFlags flags)213 vala_param_spec_map_iterator (const gchar* name,
214                               const gchar* nick,
215                               const gchar* blurb,
216                               GType object_type,
217                               GParamFlags flags)
218 {
219 	ValaParamSpecMapIterator* spec;
220 	g_return_val_if_fail (g_type_is_a (object_type, VALA_TYPE_MAP_ITERATOR), NULL);
221 	spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
222 	G_PARAM_SPEC (spec)->value_type = object_type;
223 	return G_PARAM_SPEC (spec);
224 }
225 
226 gpointer
vala_value_get_map_iterator(const GValue * value)227 vala_value_get_map_iterator (const GValue* value)
228 {
229 	g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, VALA_TYPE_MAP_ITERATOR), NULL);
230 	return value->data[0].v_pointer;
231 }
232 
233 void
vala_value_set_map_iterator(GValue * value,gpointer v_object)234 vala_value_set_map_iterator (GValue* value,
235                              gpointer v_object)
236 {
237 	ValaMapIterator * old;
238 	g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, VALA_TYPE_MAP_ITERATOR));
239 	old = value->data[0].v_pointer;
240 	if (v_object) {
241 		g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, VALA_TYPE_MAP_ITERATOR));
242 		g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
243 		value->data[0].v_pointer = v_object;
244 		vala_map_iterator_ref (value->data[0].v_pointer);
245 	} else {
246 		value->data[0].v_pointer = NULL;
247 	}
248 	if (old) {
249 		vala_map_iterator_unref (old);
250 	}
251 }
252 
253 void
vala_value_take_map_iterator(GValue * value,gpointer v_object)254 vala_value_take_map_iterator (GValue* value,
255                               gpointer v_object)
256 {
257 	ValaMapIterator * old;
258 	g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, VALA_TYPE_MAP_ITERATOR));
259 	old = value->data[0].v_pointer;
260 	if (v_object) {
261 		g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, VALA_TYPE_MAP_ITERATOR));
262 		g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
263 		value->data[0].v_pointer = v_object;
264 	} else {
265 		value->data[0].v_pointer = NULL;
266 	}
267 	if (old) {
268 		vala_map_iterator_unref (old);
269 	}
270 }
271 
272 static void
vala_map_iterator_class_init(ValaMapIteratorClass * klass,gpointer klass_data)273 vala_map_iterator_class_init (ValaMapIteratorClass * klass,
274                               gpointer klass_data)
275 {
276 	vala_map_iterator_parent_class = g_type_class_peek_parent (klass);
277 	((ValaMapIteratorClass *) klass)->finalize = vala_map_iterator_finalize;
278 	g_type_class_adjust_private_offset (klass, &ValaMapIterator_private_offset);
279 	((ValaMapIteratorClass *) klass)->next = (gboolean (*) (ValaMapIterator*)) vala_map_iterator_real_next;
280 	((ValaMapIteratorClass *) klass)->get_key = (gpointer (*) (ValaMapIterator*)) vala_map_iterator_real_get_key;
281 	((ValaMapIteratorClass *) klass)->get_value = (gpointer (*) (ValaMapIterator*)) vala_map_iterator_real_get_value;
282 }
283 
284 static void
vala_map_iterator_instance_init(ValaMapIterator * self,gpointer klass)285 vala_map_iterator_instance_init (ValaMapIterator * self,
286                                  gpointer klass)
287 {
288 	self->priv = vala_map_iterator_get_instance_private (self);
289 	self->ref_count = 1;
290 }
291 
292 static void
vala_map_iterator_finalize(ValaMapIterator * obj)293 vala_map_iterator_finalize (ValaMapIterator * obj)
294 {
295 	ValaMapIterator * self;
296 	self = G_TYPE_CHECK_INSTANCE_CAST (obj, VALA_TYPE_MAP_ITERATOR, ValaMapIterator);
297 	g_signal_handlers_destroy (self);
298 }
299 
300 /**
301  * An iterator over a map.
302  */
303 static GType
vala_map_iterator_get_type_once(void)304 vala_map_iterator_get_type_once (void)
305 {
306 	static const GTypeValueTable g_define_type_value_table = { vala_value_map_iterator_init, vala_value_map_iterator_free_value, vala_value_map_iterator_copy_value, vala_value_map_iterator_peek_pointer, "p", vala_value_map_iterator_collect_value, "p", vala_value_map_iterator_lcopy_value };
307 	static const GTypeInfo g_define_type_info = { sizeof (ValaMapIteratorClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) vala_map_iterator_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ValaMapIterator), 0, (GInstanceInitFunc) vala_map_iterator_instance_init, &g_define_type_value_table };
308 	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) };
309 	GType vala_map_iterator_type_id;
310 	vala_map_iterator_type_id = g_type_register_fundamental (g_type_fundamental_next (), "ValaMapIterator", &g_define_type_info, &g_define_type_fundamental_info, G_TYPE_FLAG_ABSTRACT);
311 	ValaMapIterator_private_offset = g_type_add_instance_private (vala_map_iterator_type_id, sizeof (ValaMapIteratorPrivate));
312 	return vala_map_iterator_type_id;
313 }
314 
315 GType
vala_map_iterator_get_type(void)316 vala_map_iterator_get_type (void)
317 {
318 	static volatile gsize vala_map_iterator_type_id__volatile = 0;
319 	if (g_once_init_enter (&vala_map_iterator_type_id__volatile)) {
320 		GType vala_map_iterator_type_id;
321 		vala_map_iterator_type_id = vala_map_iterator_get_type_once ();
322 		g_once_init_leave (&vala_map_iterator_type_id__volatile, vala_map_iterator_type_id);
323 	}
324 	return vala_map_iterator_type_id__volatile;
325 }
326 
327 gpointer
vala_map_iterator_ref(gpointer instance)328 vala_map_iterator_ref (gpointer instance)
329 {
330 	ValaMapIterator * self;
331 	self = instance;
332 	g_atomic_int_inc (&self->ref_count);
333 	return instance;
334 }
335 
336 void
vala_map_iterator_unref(gpointer instance)337 vala_map_iterator_unref (gpointer instance)
338 {
339 	ValaMapIterator * self;
340 	self = instance;
341 	if (g_atomic_int_dec_and_test (&self->ref_count)) {
342 		VALA_MAP_ITERATOR_GET_CLASS (self)->finalize (self);
343 		g_type_free_instance ((GTypeInstance *) self);
344 	}
345 }
346 
347