Update libgee to 0.9.92 (3462b25)
[profile/ivi/libgee.git] / gee / lazy.c
1 /* lazy.c generated by valac 0.18.0, the Vala compiler
2  * generated from lazy.vala, do not modify */
3
4 /* lazy.vala
5  *
6  * Copyright (C) 2011  Maciej Piechotka
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  *      Maciej Piechotka <uzytkownik2@gmail.com>
24  */
25
26 #include <glib.h>
27 #include <glib-object.h>
28 #include <gobject/gvaluecollector.h>
29
30
31 #define GEE_TYPE_LAZY (gee_lazy_get_type ())
32 #define GEE_LAZY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_LAZY, GeeLazy))
33 #define GEE_LAZY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEE_TYPE_LAZY, GeeLazyClass))
34 #define GEE_IS_LAZY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEE_TYPE_LAZY))
35 #define GEE_IS_LAZY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GEE_TYPE_LAZY))
36 #define GEE_LAZY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GEE_TYPE_LAZY, GeeLazyClass))
37
38 typedef struct _GeeLazy GeeLazy;
39 typedef struct _GeeLazyClass GeeLazyClass;
40 typedef struct _GeeLazyPrivate GeeLazyPrivate;
41 #define _g_destroy_func0(var) (((var == NULL) || (g_destroy_func == NULL)) ? NULL : (var = (g_destroy_func (var), NULL)))
42 typedef struct _GeeParamSpecLazy GeeParamSpecLazy;
43
44 typedef gpointer (*GeeLazyFunc) (void* user_data);
45 struct _GeeLazy {
46         GTypeInstance parent_instance;
47         volatile int ref_count;
48         GeeLazyPrivate * priv;
49 };
50
51 struct _GeeLazyClass {
52         GTypeClass parent_class;
53         void (*finalize) (GeeLazy *self);
54 };
55
56 struct _GeeLazyPrivate {
57         GType g_type;
58         GBoxedCopyFunc g_dup_func;
59         GDestroyNotify g_destroy_func;
60         GeeLazyFunc _func;
61         gpointer _func_target;
62         GDestroyNotify _func_target_destroy_notify;
63         gpointer _value;
64 };
65
66 struct _GeeParamSpecLazy {
67         GParamSpec parent_instance;
68 };
69
70
71 static gpointer gee_lazy_parent_class = NULL;
72
73 gpointer gee_lazy_ref (gpointer instance);
74 void gee_lazy_unref (gpointer instance);
75 GParamSpec* gee_param_spec_lazy (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags);
76 void gee_value_set_lazy (GValue* value, gpointer v_object);
77 void gee_value_take_lazy (GValue* value, gpointer v_object);
78 gpointer gee_value_get_lazy (const GValue* value);
79 GType gee_lazy_get_type (void) G_GNUC_CONST;
80 #define GEE_LAZY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GEE_TYPE_LAZY, GeeLazyPrivate))
81 enum  {
82         GEE_LAZY_DUMMY_PROPERTY
83 };
84 GeeLazy* gee_lazy_new (GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, GeeLazyFunc func, void* func_target, GDestroyNotify func_target_destroy_notify);
85 GeeLazy* gee_lazy_construct (GType object_type, GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, GeeLazyFunc func, void* func_target, GDestroyNotify func_target_destroy_notify);
86 GeeLazy* gee_lazy_new_from_value (GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, gconstpointer item);
87 GeeLazy* gee_lazy_construct_from_value (GType object_type, GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, gconstpointer item);
88 void gee_lazy_eval (GeeLazy* self);
89 gpointer gee_lazy_get (GeeLazy* self);
90 gconstpointer gee_lazy_get_value (GeeLazy* self);
91 static void gee_lazy_finalize (GeeLazy* obj);
92
93
94 GeeLazy* gee_lazy_construct (GType object_type, GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, GeeLazyFunc func, void* func_target, GDestroyNotify func_target_destroy_notify) {
95         GeeLazy* self = NULL;
96         GeeLazyFunc _tmp0_;
97         void* _tmp0__target;
98         GDestroyNotify _tmp0__target_destroy_notify;
99         self = (GeeLazy*) g_type_create_instance (object_type);
100         self->priv->g_type = g_type;
101         self->priv->g_dup_func = g_dup_func;
102         self->priv->g_destroy_func = g_destroy_func;
103         _tmp0_ = func;
104         _tmp0__target = func_target;
105         _tmp0__target_destroy_notify = func_target_destroy_notify;
106         func_target_destroy_notify = NULL;
107         (self->priv->_func_target_destroy_notify == NULL) ? NULL : (self->priv->_func_target_destroy_notify (self->priv->_func_target), NULL);
108         self->priv->_func = NULL;
109         self->priv->_func_target = NULL;
110         self->priv->_func_target_destroy_notify = NULL;
111         self->priv->_func = _tmp0_;
112         self->priv->_func_target = _tmp0__target;
113         self->priv->_func_target_destroy_notify = _tmp0__target_destroy_notify;
114         (func_target_destroy_notify == NULL) ? NULL : (func_target_destroy_notify (func_target), NULL);
115         func = NULL;
116         func_target = NULL;
117         func_target_destroy_notify = NULL;
118         return self;
119 }
120
121
122 GeeLazy* gee_lazy_new (GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, GeeLazyFunc func, void* func_target, GDestroyNotify func_target_destroy_notify) {
123         return gee_lazy_construct (GEE_TYPE_LAZY, g_type, g_dup_func, g_destroy_func, func, func_target, func_target_destroy_notify);
124 }
125
126
127 GeeLazy* gee_lazy_construct_from_value (GType object_type, GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, gconstpointer item) {
128         GeeLazy* self = NULL;
129         gconstpointer _tmp0_;
130         gpointer _tmp1_;
131         self = (GeeLazy*) g_type_create_instance (object_type);
132         self->priv->g_type = g_type;
133         self->priv->g_dup_func = g_dup_func;
134         self->priv->g_destroy_func = g_destroy_func;
135         _tmp0_ = item;
136         _tmp1_ = ((_tmp0_ != NULL) && (g_dup_func != NULL)) ? g_dup_func ((gpointer) _tmp0_) : ((gpointer) _tmp0_);
137         _g_destroy_func0 (self->priv->_value);
138         self->priv->_value = _tmp1_;
139         return self;
140 }
141
142
143 GeeLazy* gee_lazy_new_from_value (GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, gconstpointer item) {
144         return gee_lazy_construct_from_value (GEE_TYPE_LAZY, g_type, g_dup_func, g_destroy_func, item);
145 }
146
147
148 void gee_lazy_eval (GeeLazy* self) {
149         GeeLazyFunc _tmp0_;
150         void* _tmp0__target;
151         g_return_if_fail (self != NULL);
152         _tmp0_ = self->priv->_func;
153         _tmp0__target = self->priv->_func_target;
154         if (_tmp0_ != NULL) {
155                 GeeLazyFunc _tmp1_;
156                 void* _tmp1__target;
157                 gpointer _tmp2_ = NULL;
158                 _tmp1_ = self->priv->_func;
159                 _tmp1__target = self->priv->_func_target;
160                 _tmp2_ = _tmp1_ (_tmp1__target);
161                 ((self->priv->_value == NULL) || (self->priv->g_destroy_func == NULL)) ? NULL : (self->priv->_value = (self->priv->g_destroy_func (self->priv->_value), NULL));
162                 self->priv->_value = _tmp2_;
163                 (self->priv->_func_target_destroy_notify == NULL) ? NULL : (self->priv->_func_target_destroy_notify (self->priv->_func_target), NULL);
164                 self->priv->_func = NULL;
165                 self->priv->_func_target = NULL;
166                 self->priv->_func_target_destroy_notify = NULL;
167                 self->priv->_func = NULL;
168                 self->priv->_func_target = NULL;
169                 self->priv->_func_target_destroy_notify = NULL;
170         }
171 }
172
173
174 gpointer gee_lazy_get (GeeLazy* self) {
175         gpointer result = NULL;
176         gconstpointer _tmp0_;
177         gpointer _tmp1_;
178         g_return_val_if_fail (self != NULL, NULL);
179         gee_lazy_eval (self);
180         _tmp0_ = self->priv->_value;
181         _tmp1_ = ((_tmp0_ != NULL) && (self->priv->g_dup_func != NULL)) ? self->priv->g_dup_func ((gpointer) _tmp0_) : ((gpointer) _tmp0_);
182         result = _tmp1_;
183         return result;
184 }
185
186
187 gconstpointer gee_lazy_get_value (GeeLazy* self) {
188         gconstpointer result;
189         gconstpointer _tmp0_;
190         g_return_val_if_fail (self != NULL, NULL);
191         gee_lazy_eval (self);
192         _tmp0_ = self->priv->_value;
193         result = _tmp0_;
194         return result;
195 }
196
197
198 static void gee_value_lazy_init (GValue* value) {
199         value->data[0].v_pointer = NULL;
200 }
201
202
203 static void gee_value_lazy_free_value (GValue* value) {
204         if (value->data[0].v_pointer) {
205                 gee_lazy_unref (value->data[0].v_pointer);
206         }
207 }
208
209
210 static void gee_value_lazy_copy_value (const GValue* src_value, GValue* dest_value) {
211         if (src_value->data[0].v_pointer) {
212                 dest_value->data[0].v_pointer = gee_lazy_ref (src_value->data[0].v_pointer);
213         } else {
214                 dest_value->data[0].v_pointer = NULL;
215         }
216 }
217
218
219 static gpointer gee_value_lazy_peek_pointer (const GValue* value) {
220         return value->data[0].v_pointer;
221 }
222
223
224 static gchar* gee_value_lazy_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
225         if (collect_values[0].v_pointer) {
226                 GeeLazy* object;
227                 object = collect_values[0].v_pointer;
228                 if (object->parent_instance.g_class == NULL) {
229                         return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
230                 } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
231                         return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
232                 }
233                 value->data[0].v_pointer = gee_lazy_ref (object);
234         } else {
235                 value->data[0].v_pointer = NULL;
236         }
237         return NULL;
238 }
239
240
241 static gchar* gee_value_lazy_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
242         GeeLazy** object_p;
243         object_p = collect_values[0].v_pointer;
244         if (!object_p) {
245                 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value));
246         }
247         if (!value->data[0].v_pointer) {
248                 *object_p = NULL;
249         } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
250                 *object_p = value->data[0].v_pointer;
251         } else {
252                 *object_p = gee_lazy_ref (value->data[0].v_pointer);
253         }
254         return NULL;
255 }
256
257
258 GParamSpec* gee_param_spec_lazy (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
259         GeeParamSpecLazy* spec;
260         g_return_val_if_fail (g_type_is_a (object_type, GEE_TYPE_LAZY), NULL);
261         spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
262         G_PARAM_SPEC (spec)->value_type = object_type;
263         return G_PARAM_SPEC (spec);
264 }
265
266
267 gpointer gee_value_get_lazy (const GValue* value) {
268         g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, GEE_TYPE_LAZY), NULL);
269         return value->data[0].v_pointer;
270 }
271
272
273 void gee_value_set_lazy (GValue* value, gpointer v_object) {
274         GeeLazy* old;
275         g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, GEE_TYPE_LAZY));
276         old = value->data[0].v_pointer;
277         if (v_object) {
278                 g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, GEE_TYPE_LAZY));
279                 g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
280                 value->data[0].v_pointer = v_object;
281                 gee_lazy_ref (value->data[0].v_pointer);
282         } else {
283                 value->data[0].v_pointer = NULL;
284         }
285         if (old) {
286                 gee_lazy_unref (old);
287         }
288 }
289
290
291 void gee_value_take_lazy (GValue* value, gpointer v_object) {
292         GeeLazy* old;
293         g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, GEE_TYPE_LAZY));
294         old = value->data[0].v_pointer;
295         if (v_object) {
296                 g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, GEE_TYPE_LAZY));
297                 g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
298                 value->data[0].v_pointer = v_object;
299         } else {
300                 value->data[0].v_pointer = NULL;
301         }
302         if (old) {
303                 gee_lazy_unref (old);
304         }
305 }
306
307
308 static void gee_lazy_class_init (GeeLazyClass * klass) {
309         gee_lazy_parent_class = g_type_class_peek_parent (klass);
310         GEE_LAZY_CLASS (klass)->finalize = gee_lazy_finalize;
311         g_type_class_add_private (klass, sizeof (GeeLazyPrivate));
312 }
313
314
315 static void gee_lazy_instance_init (GeeLazy * self) {
316         self->priv = GEE_LAZY_GET_PRIVATE (self);
317         self->ref_count = 1;
318 }
319
320
321 static void gee_lazy_finalize (GeeLazy* obj) {
322         GeeLazy * self;
323         self = G_TYPE_CHECK_INSTANCE_CAST (obj, GEE_TYPE_LAZY, GeeLazy);
324         (self->priv->_func_target_destroy_notify == NULL) ? NULL : (self->priv->_func_target_destroy_notify (self->priv->_func_target), NULL);
325         self->priv->_func = NULL;
326         self->priv->_func_target = NULL;
327         self->priv->_func_target_destroy_notify = NULL;
328         ((self->priv->_value == NULL) || (self->priv->g_destroy_func == NULL)) ? NULL : (self->priv->_value = (self->priv->g_destroy_func (self->priv->_value), NULL));
329 }
330
331
332 /**
333  * Represents a lazy value. I.e. value that is computed on demand.
334  */
335 GType gee_lazy_get_type (void) {
336         static volatile gsize gee_lazy_type_id__volatile = 0;
337         if (g_once_init_enter (&gee_lazy_type_id__volatile)) {
338                 static const GTypeValueTable g_define_type_value_table = { gee_value_lazy_init, gee_value_lazy_free_value, gee_value_lazy_copy_value, gee_value_lazy_peek_pointer, "p", gee_value_lazy_collect_value, "p", gee_value_lazy_lcopy_value };
339                 static const GTypeInfo g_define_type_info = { sizeof (GeeLazyClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) gee_lazy_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (GeeLazy), 0, (GInstanceInitFunc) gee_lazy_instance_init, &g_define_type_value_table };
340                 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) };
341                 GType gee_lazy_type_id;
342                 gee_lazy_type_id = g_type_register_fundamental (g_type_fundamental_next (), "GeeLazy", &g_define_type_info, &g_define_type_fundamental_info, 0);
343                 g_once_init_leave (&gee_lazy_type_id__volatile, gee_lazy_type_id);
344         }
345         return gee_lazy_type_id__volatile;
346 }
347
348
349 gpointer gee_lazy_ref (gpointer instance) {
350         GeeLazy* self;
351         self = instance;
352         g_atomic_int_inc (&self->ref_count);
353         return instance;
354 }
355
356
357 void gee_lazy_unref (gpointer instance) {
358         GeeLazy* self;
359         self = instance;
360         if (g_atomic_int_dec_and_test (&self->ref_count)) {
361                 GEE_LAZY_GET_CLASS (self)->finalize (self);
362                 g_type_free_instance ((GTypeInstance *) self);
363         }
364 }
365
366
367