diff options
Diffstat (limited to 'gee/lazy.c')
-rw-r--r-- | gee/lazy.c | 367 |
1 files changed, 367 insertions, 0 deletions
diff --git a/gee/lazy.c b/gee/lazy.c new file mode 100644 index 0000000..216018a --- /dev/null +++ b/gee/lazy.c @@ -0,0 +1,367 @@ +/* lazy.c generated by valac 0.18.0, the Vala compiler + * generated from lazy.vala, do not modify */ + +/* lazy.vala + * + * Copyright (C) 2011 Maciej Piechotka + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: + * Maciej Piechotka <uzytkownik2@gmail.com> + */ + +#include <glib.h> +#include <glib-object.h> +#include <gobject/gvaluecollector.h> + + +#define GEE_TYPE_LAZY (gee_lazy_get_type ()) +#define GEE_LAZY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_LAZY, GeeLazy)) +#define GEE_LAZY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEE_TYPE_LAZY, GeeLazyClass)) +#define GEE_IS_LAZY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEE_TYPE_LAZY)) +#define GEE_IS_LAZY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GEE_TYPE_LAZY)) +#define GEE_LAZY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GEE_TYPE_LAZY, GeeLazyClass)) + +typedef struct _GeeLazy GeeLazy; +typedef struct _GeeLazyClass GeeLazyClass; +typedef struct _GeeLazyPrivate GeeLazyPrivate; +#define _g_destroy_func0(var) (((var == NULL) || (g_destroy_func == NULL)) ? NULL : (var = (g_destroy_func (var), NULL))) +typedef struct _GeeParamSpecLazy GeeParamSpecLazy; + +typedef gpointer (*GeeLazyFunc) (void* user_data); +struct _GeeLazy { + GTypeInstance parent_instance; + volatile int ref_count; + GeeLazyPrivate * priv; +}; + +struct _GeeLazyClass { + GTypeClass parent_class; + void (*finalize) (GeeLazy *self); +}; + +struct _GeeLazyPrivate { + GType g_type; + GBoxedCopyFunc g_dup_func; + GDestroyNotify g_destroy_func; + GeeLazyFunc _func; + gpointer _func_target; + GDestroyNotify _func_target_destroy_notify; + gpointer _value; +}; + +struct _GeeParamSpecLazy { + GParamSpec parent_instance; +}; + + +static gpointer gee_lazy_parent_class = NULL; + +gpointer gee_lazy_ref (gpointer instance); +void gee_lazy_unref (gpointer instance); +GParamSpec* gee_param_spec_lazy (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags); +void gee_value_set_lazy (GValue* value, gpointer v_object); +void gee_value_take_lazy (GValue* value, gpointer v_object); +gpointer gee_value_get_lazy (const GValue* value); +GType gee_lazy_get_type (void) G_GNUC_CONST; +#define GEE_LAZY_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GEE_TYPE_LAZY, GeeLazyPrivate)) +enum { + GEE_LAZY_DUMMY_PROPERTY +}; +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); +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); +GeeLazy* gee_lazy_new_from_value (GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, gconstpointer item); +GeeLazy* gee_lazy_construct_from_value (GType object_type, GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, gconstpointer item); +void gee_lazy_eval (GeeLazy* self); +gpointer gee_lazy_get (GeeLazy* self); +gconstpointer gee_lazy_get_value (GeeLazy* self); +static void gee_lazy_finalize (GeeLazy* obj); + + +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) { + GeeLazy* self = NULL; + GeeLazyFunc _tmp0_; + void* _tmp0__target; + GDestroyNotify _tmp0__target_destroy_notify; + self = (GeeLazy*) g_type_create_instance (object_type); + self->priv->g_type = g_type; + self->priv->g_dup_func = g_dup_func; + self->priv->g_destroy_func = g_destroy_func; + _tmp0_ = func; + _tmp0__target = func_target; + _tmp0__target_destroy_notify = func_target_destroy_notify; + func_target_destroy_notify = NULL; + (self->priv->_func_target_destroy_notify == NULL) ? NULL : (self->priv->_func_target_destroy_notify (self->priv->_func_target), NULL); + self->priv->_func = NULL; + self->priv->_func_target = NULL; + self->priv->_func_target_destroy_notify = NULL; + self->priv->_func = _tmp0_; + self->priv->_func_target = _tmp0__target; + self->priv->_func_target_destroy_notify = _tmp0__target_destroy_notify; + (func_target_destroy_notify == NULL) ? NULL : (func_target_destroy_notify (func_target), NULL); + func = NULL; + func_target = NULL; + func_target_destroy_notify = NULL; + return self; +} + + +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) { + return gee_lazy_construct (GEE_TYPE_LAZY, g_type, g_dup_func, g_destroy_func, func, func_target, func_target_destroy_notify); +} + + +GeeLazy* gee_lazy_construct_from_value (GType object_type, GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, gconstpointer item) { + GeeLazy* self = NULL; + gconstpointer _tmp0_; + gpointer _tmp1_; + self = (GeeLazy*) g_type_create_instance (object_type); + self->priv->g_type = g_type; + self->priv->g_dup_func = g_dup_func; + self->priv->g_destroy_func = g_destroy_func; + _tmp0_ = item; + _tmp1_ = ((_tmp0_ != NULL) && (g_dup_func != NULL)) ? g_dup_func ((gpointer) _tmp0_) : ((gpointer) _tmp0_); + _g_destroy_func0 (self->priv->_value); + self->priv->_value = _tmp1_; + return self; +} + + +GeeLazy* gee_lazy_new_from_value (GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, gconstpointer item) { + return gee_lazy_construct_from_value (GEE_TYPE_LAZY, g_type, g_dup_func, g_destroy_func, item); +} + + +void gee_lazy_eval (GeeLazy* self) { + GeeLazyFunc _tmp0_; + void* _tmp0__target; + g_return_if_fail (self != NULL); + _tmp0_ = self->priv->_func; + _tmp0__target = self->priv->_func_target; + if (_tmp0_ != NULL) { + GeeLazyFunc _tmp1_; + void* _tmp1__target; + gpointer _tmp2_ = NULL; + _tmp1_ = self->priv->_func; + _tmp1__target = self->priv->_func_target; + _tmp2_ = _tmp1_ (_tmp1__target); + ((self->priv->_value == NULL) || (self->priv->g_destroy_func == NULL)) ? NULL : (self->priv->_value = (self->priv->g_destroy_func (self->priv->_value), NULL)); + self->priv->_value = _tmp2_; + (self->priv->_func_target_destroy_notify == NULL) ? NULL : (self->priv->_func_target_destroy_notify (self->priv->_func_target), NULL); + self->priv->_func = NULL; + self->priv->_func_target = NULL; + self->priv->_func_target_destroy_notify = NULL; + self->priv->_func = NULL; + self->priv->_func_target = NULL; + self->priv->_func_target_destroy_notify = NULL; + } +} + + +gpointer gee_lazy_get (GeeLazy* self) { + gpointer result = NULL; + gconstpointer _tmp0_; + gpointer _tmp1_; + g_return_val_if_fail (self != NULL, NULL); + gee_lazy_eval (self); + _tmp0_ = self->priv->_value; + _tmp1_ = ((_tmp0_ != NULL) && (self->priv->g_dup_func != NULL)) ? self->priv->g_dup_func ((gpointer) _tmp0_) : ((gpointer) _tmp0_); + result = _tmp1_; + return result; +} + + +gconstpointer gee_lazy_get_value (GeeLazy* self) { + gconstpointer result; + gconstpointer _tmp0_; + g_return_val_if_fail (self != NULL, NULL); + gee_lazy_eval (self); + _tmp0_ = self->priv->_value; + result = _tmp0_; + return result; +} + + +static void gee_value_lazy_init (GValue* value) { + value->data[0].v_pointer = NULL; +} + + +static void gee_value_lazy_free_value (GValue* value) { + if (value->data[0].v_pointer) { + gee_lazy_unref (value->data[0].v_pointer); + } +} + + +static void gee_value_lazy_copy_value (const GValue* src_value, GValue* dest_value) { + if (src_value->data[0].v_pointer) { + dest_value->data[0].v_pointer = gee_lazy_ref (src_value->data[0].v_pointer); + } else { + dest_value->data[0].v_pointer = NULL; + } +} + + +static gpointer gee_value_lazy_peek_pointer (const GValue* value) { + return value->data[0].v_pointer; +} + + +static gchar* gee_value_lazy_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { + if (collect_values[0].v_pointer) { + GeeLazy* object; + object = collect_values[0].v_pointer; + if (object->parent_instance.g_class == NULL) { + return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); + } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) { + return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL); + } + value->data[0].v_pointer = gee_lazy_ref (object); + } else { + value->data[0].v_pointer = NULL; + } + return NULL; +} + + +static gchar* gee_value_lazy_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) { + GeeLazy** object_p; + object_p = collect_values[0].v_pointer; + if (!object_p) { + return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME (value)); + } + if (!value->data[0].v_pointer) { + *object_p = NULL; + } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) { + *object_p = value->data[0].v_pointer; + } else { + *object_p = gee_lazy_ref (value->data[0].v_pointer); + } + return NULL; +} + + +GParamSpec* gee_param_spec_lazy (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) { + GeeParamSpecLazy* spec; + g_return_val_if_fail (g_type_is_a (object_type, GEE_TYPE_LAZY), NULL); + spec = g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags); + G_PARAM_SPEC (spec)->value_type = object_type; + return G_PARAM_SPEC (spec); +} + + +gpointer gee_value_get_lazy (const GValue* value) { + g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, GEE_TYPE_LAZY), NULL); + return value->data[0].v_pointer; +} + + +void gee_value_set_lazy (GValue* value, gpointer v_object) { + GeeLazy* old; + g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, GEE_TYPE_LAZY)); + old = value->data[0].v_pointer; + if (v_object) { + g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, GEE_TYPE_LAZY)); + g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); + value->data[0].v_pointer = v_object; + gee_lazy_ref (value->data[0].v_pointer); + } else { + value->data[0].v_pointer = NULL; + } + if (old) { + gee_lazy_unref (old); + } +} + + +void gee_value_take_lazy (GValue* value, gpointer v_object) { + GeeLazy* old; + g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, GEE_TYPE_LAZY)); + old = value->data[0].v_pointer; + if (v_object) { + g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, GEE_TYPE_LAZY)); + g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value))); + value->data[0].v_pointer = v_object; + } else { + value->data[0].v_pointer = NULL; + } + if (old) { + gee_lazy_unref (old); + } +} + + +static void gee_lazy_class_init (GeeLazyClass * klass) { + gee_lazy_parent_class = g_type_class_peek_parent (klass); + GEE_LAZY_CLASS (klass)->finalize = gee_lazy_finalize; + g_type_class_add_private (klass, sizeof (GeeLazyPrivate)); +} + + +static void gee_lazy_instance_init (GeeLazy * self) { + self->priv = GEE_LAZY_GET_PRIVATE (self); + self->ref_count = 1; +} + + +static void gee_lazy_finalize (GeeLazy* obj) { + GeeLazy * self; + self = G_TYPE_CHECK_INSTANCE_CAST (obj, GEE_TYPE_LAZY, GeeLazy); + (self->priv->_func_target_destroy_notify == NULL) ? NULL : (self->priv->_func_target_destroy_notify (self->priv->_func_target), NULL); + self->priv->_func = NULL; + self->priv->_func_target = NULL; + self->priv->_func_target_destroy_notify = NULL; + ((self->priv->_value == NULL) || (self->priv->g_destroy_func == NULL)) ? NULL : (self->priv->_value = (self->priv->g_destroy_func (self->priv->_value), NULL)); +} + + +/** + * Represents a lazy value. I.e. value that is computed on demand. + */ +GType gee_lazy_get_type (void) { + static volatile gsize gee_lazy_type_id__volatile = 0; + if (g_once_init_enter (&gee_lazy_type_id__volatile)) { + 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 }; + 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 }; + 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) }; + GType gee_lazy_type_id; + gee_lazy_type_id = g_type_register_fundamental (g_type_fundamental_next (), "GeeLazy", &g_define_type_info, &g_define_type_fundamental_info, 0); + g_once_init_leave (&gee_lazy_type_id__volatile, gee_lazy_type_id); + } + return gee_lazy_type_id__volatile; +} + + +gpointer gee_lazy_ref (gpointer instance) { + GeeLazy* self; + self = instance; + g_atomic_int_inc (&self->ref_count); + return instance; +} + + +void gee_lazy_unref (gpointer instance) { + GeeLazy* self; + self = instance; + if (g_atomic_int_dec_and_test (&self->ref_count)) { + GEE_LAZY_GET_CLASS (self)->finalize (self); + g_type_free_instance ((GTypeInstance *) self); + } +} + + + |