/* methods_params_array.c generated by valac, the Vala compiler
 * generated from methods_params_array.vala, do not modify */

#include <glib-object.h>
#include <stdlib.h>
#include <string.h>
#include <glib.h>
#include <float.h>
#include <math.h>
#include <gobject/gvaluecollector.h>

#if !defined(VALA_STRICT_C)
#if !defined(__clang__) && defined(__GNUC__) && (__GNUC__ >= 14)
#pragma GCC diagnostic warning "-Wincompatible-pointer-types"
#elif defined(__clang__) && (__clang_major__ >= 16)
#pragma clang diagnostic ignored "-Wincompatible-function-pointer-types"
#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
#endif
#endif
#if !defined(VALA_EXTERN)
#if defined(_MSC_VER)
#define VALA_EXTERN __declspec(dllexport) extern
#elif __GNUC__ >= 4
#define VALA_EXTERN __attribute__((visibility("default"))) extern
#else
#define VALA_EXTERN extern
#endif
#endif

#define TYPE_FOO (foo_get_type ())
#define FOO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_FOO, Foo))
#define FOO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_FOO, FooClass))
#define IS_FOO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_FOO))
#define IS_FOO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_FOO))
#define FOO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_FOO, FooClass))

typedef struct _Foo Foo;
typedef struct _FooClass FooClass;
typedef struct _FooPrivate FooPrivate;
#define _g_free0(var) (var = (g_free (var), NULL))
typedef struct _ParamSpecFoo ParamSpecFoo;
#define _foo_unref0(var) ((var == NULL) ? NULL : (var = (foo_unref (var), NULL)))
#define __vala_GValue_free0(var) ((var == NULL) ? NULL : (var = (_vala_GValue_free (var), NULL)))
#define _g_variant_unref0(var) ((var == NULL) ? NULL : (var = (g_variant_unref (var), NULL)))
#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);
#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; }
#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; }
#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);

struct _Foo {
	GTypeInstance parent_instance;
	volatile int ref_count;
	FooPrivate * priv;
};

struct _FooClass {
	GTypeClass parent_class;
	void (*finalize) (Foo *self);
};

struct _ParamSpecFoo {
	GParamSpec parent_instance;
};

static gpointer foo_parent_class = NULL;

VALA_EXTERN gpointer foo_ref (gpointer instance);
VALA_EXTERN void foo_unref (gpointer instance);
VALA_EXTERN GParamSpec* param_spec_foo (const gchar* name,
                            const gchar* nick,
                            const gchar* blurb,
                            GType object_type,
                            GParamFlags flags);
VALA_EXTERN void value_set_foo (GValue* value,
                    gpointer v_object);
VALA_EXTERN void value_take_foo (GValue* value,
                     gpointer v_object);
VALA_EXTERN gpointer value_get_foo (const GValue* value);
VALA_EXTERN GType foo_get_type (void) G_GNUC_CONST ;
G_DEFINE_AUTOPTR_CLEANUP_FUNC (Foo, foo_unref)
VALA_EXTERN Foo* foo_new (const gchar* _first_strv,
              ...);
VALA_EXTERN Foo* foo_construct (GType object_type,
                    const gchar* _first_strv,
                    ...);
VALA_EXTERN Foo* foo_constructv (GType object_type,
                     const gchar* _first_strv,
                     va_list _va_list_strv);
static void _vala_array_add1 (const gchar** * array,
                       gint* length,
                       gint* size,
                       const gchar* value);
VALA_EXTERN Foo* foo_new_bar (gint _first_intv,
                  ...);
VALA_EXTERN Foo* foo_construct_bar (GType object_type,
                        gint _first_intv,
                        ...);
VALA_EXTERN Foo* foo_constructv_bar (GType object_type,
                         gint _first_intv,
                         va_list _va_list_intv);
static void _vala_array_add2 (gint* * array,
                       gint* length,
                       gint* size,
                       gint value);
VALA_EXTERN Foo* foo_new_manam (GValue* _first_valuev,
                    ...);
VALA_EXTERN Foo* foo_construct_manam (GType object_type,
                          GValue* _first_valuev,
                          ...);
VALA_EXTERN Foo* foo_constructv_manam (GType object_type,
                           GValue* _first_valuev,
                           va_list _va_list_valuev);
static void _vala_array_add3 (GValue** * array,
                       gint* length,
                       gint* size,
                       const GValue* value);
VALA_EXTERN Foo* foo_new_manam_owned (GValue* _first_valuev,
                          ...);
VALA_EXTERN Foo* foo_construct_manam_owned (GType object_type,
                                GValue* _first_valuev,
                                ...);
VALA_EXTERN Foo* foo_constructv_manam_owned (GType object_type,
                                 GValue* _first_valuev,
                                 va_list _va_list_valuev);
static void _vala_array_add4 (GValue** * array,
                       gint* length,
                       gint* size,
                       GValue* value);
static void _vala_GValue_free (GValue* self);
VALA_EXTERN Foo* foo_new_minim (GVariant* _first_variantv,
                    ...);
VALA_EXTERN Foo* foo_construct_minim (GType object_type,
                          GVariant* _first_variantv,
                          ...);
VALA_EXTERN Foo* foo_constructv_minim (GType object_type,
                           GVariant* _first_variantv,
                           va_list _va_list_variantv);
static void _vala_array_add5 (GVariant** * array,
                       gint* length,
                       gint* size,
                       GVariant* value);
static gchar* _variant_get1 (GVariant* value);
static gint _variant_get2 (GVariant* value);
static gdouble _variant_get3 (GVariant* value);
static void foo_finalize (Foo * obj);
static GType foo_get_type_once (void);
VALA_EXTERN void foo (const gchar* _first_strv,
          ...);
static void _vala_array_add6 (const gchar** * array,
                       gint* length,
                       gint* size,
                       const gchar* value);
VALA_EXTERN void bar (gint _first_intv,
          ...);
static void _vala_array_add7 (gint* * array,
                       gint* length,
                       gint* size,
                       gint value);
VALA_EXTERN void manam (GValue* _first_valuev,
            ...);
static void _vala_array_add8 (GValue** * array,
                       gint* length,
                       gint* size,
                       const GValue* value);
VALA_EXTERN void manam_owned (GValue* _first_valuev,
                  ...);
static void _vala_array_add9 (GValue** * array,
                       gint* length,
                       gint* size,
                       GValue* value);
VALA_EXTERN void minim (GVariant* _first_variantv,
            ...);
static void _vala_array_add10 (GVariant** * array,
                        gint* length,
                        gint* size,
                        GVariant* value);
static gchar* _variant_get4 (GVariant* value);
static gint _variant_get5 (GVariant* value);
static gdouble _variant_get6 (GVariant* value);
static void _vala_main (void);
static GVariant* _variant_new1 (const gchar* value);
static GVariant* _variant_new2 (gint value);
static GVariant* _variant_new3 (gdouble value);
static GVariant* _variant_new4 (const gchar* value);
static GVariant* _variant_new5 (gint value);
static GVariant* _variant_new6 (gdouble value);
static void _vala_array_destroy (gpointer array,
                          gssize array_length,
                          GDestroyNotify destroy_func);
static void _vala_array_free (gpointer array,
                       gssize array_length,
                       GDestroyNotify destroy_func);

static void
_vala_array_add1 (const gchar** * array,
                  gint* length,
                  gint* size,
                  const gchar* value)
{
	if ((*length) == (*size)) {
		*size = (*size) ? (2 * (*size)) : 4;
		*array = g_renew (const gchar*, *array, (*size) + 1);
	}
	(*array)[(*length)++] = value;
	(*array)[*length] = NULL;
}

Foo*
foo_constructv (GType object_type,
                const gchar* _first_strv,
                va_list _va_list_strv)
{
	const gchar* _strv_element;
	Foo* self = NULL;
	const gchar** strv = NULL;
	gint strv_length1 = 0;
	gint _strv_size_ = 0;
	const gchar* _tmp0_;
	const gchar* _tmp1_;
	const gchar* _tmp2_;
	strv = g_new0 (const gchar*, strv_length1 + 1);
	_strv_element = _first_strv;
	while (_strv_element != NULL) {
		_vala_array_add1 (&strv, &strv_length1, &_strv_size_, _strv_element);
		_strv_element = va_arg (_va_list_strv, const gchar*);
	}
	va_end (_va_list_strv);
	self = (Foo*) g_type_create_instance (object_type);
	_vala_assert (strv_length1 == 3, "strv.length == 3");
	_tmp0_ = strv[0];
	_vala_assert (g_strcmp0 (_tmp0_, "foo") == 0, "strv[0] == \"foo\"");
	_tmp1_ = strv[1];
	_vala_assert (g_strcmp0 (_tmp1_, "bar") == 0, "strv[1] == \"bar\"");
	_tmp2_ = strv[2];
	_vala_assert (g_strcmp0 (_tmp2_, "manam") == 0, "strv[2] == \"manam\"");
	strv = (g_free (strv), NULL);
	return self;
}

Foo*
foo_new (const gchar* _first_strv,
         ...)
{
	va_list _vala_va_list_obj;
	va_start (_vala_va_list_obj, _first_strv);
	return foo_constructv (TYPE_FOO, _first_strv, _vala_va_list_obj);
}

Foo*
foo_construct (GType object_type,
               const gchar* _first_strv,
               ...)
{
	va_list _vala_va_list_obj;
	va_start (_vala_va_list_obj, _first_strv);
	return foo_constructv (object_type, _first_strv, _vala_va_list_obj);
}

static void
_vala_array_add2 (gint* * array,
                  gint* length,
                  gint* size,
                  gint value)
{
	if ((*length) == (*size)) {
		*size = (*size) ? (2 * (*size)) : 4;
		*array = g_renew (gint, *array, *size);
	}
	(*array)[(*length)++] = value;
}

Foo*
foo_constructv_bar (GType object_type,
                    gint _first_intv,
                    va_list _va_list_intv)
{
	gint _intv_element;
	Foo* self = NULL;
	gint* intv = NULL;
	gint intv_length1 = 0;
	gint _intv_size_ = 0;
	gint _tmp0_;
	gint _tmp1_;
	gint _tmp2_;
	intv = g_new0 (gint, intv_length1);
	_intv_element = _first_intv;
	while (_intv_element != NULL) {
		_vala_array_add2 (&intv, &intv_length1, &_intv_size_, _intv_element);
		_intv_element = va_arg (_va_list_intv, gint);
	}
	va_end (_va_list_intv);
	self = (Foo*) g_type_create_instance (object_type);
	_vala_assert (intv_length1 == 3, "intv.length == 3");
	_tmp0_ = intv[0];
	_vala_assert (_tmp0_ == 23, "intv[0] == 23");
	_tmp1_ = intv[1];
	_vala_assert (_tmp1_ == 42, "intv[1] == 42");
	_tmp2_ = intv[2];
	_vala_assert (_tmp2_ == 4711, "intv[2] == 4711");
	intv = (g_free (intv), NULL);
	return self;
}

Foo*
foo_new_bar (gint _first_intv,
             ...)
{
	va_list _vala_va_list_obj;
	va_start (_vala_va_list_obj, _first_intv);
	return foo_constructv_bar (TYPE_FOO, _first_intv, _vala_va_list_obj);
}

Foo*
foo_construct_bar (GType object_type,
                   gint _first_intv,
                   ...)
{
	va_list _vala_va_list_obj;
	va_start (_vala_va_list_obj, _first_intv);
	return foo_constructv_bar (object_type, _first_intv, _vala_va_list_obj);
}

static void
_vala_array_add3 (GValue** * array,
                  gint* length,
                  gint* size,
                  const GValue* value)
{
	if ((*length) == (*size)) {
		*size = (*size) ? (2 * (*size)) : 4;
		*array = g_renew (GValue*, *array, *size);
	}
	(*array)[(*length)++] = value;
}

Foo*
foo_constructv_manam (GType object_type,
                      GValue* _first_valuev,
                      va_list _va_list_valuev)
{
	GValue* _valuev_element;
	Foo* self = NULL;
	GValue** valuev = NULL;
	gint valuev_length1 = 0;
	gint _valuev_size_ = 0;
	GValue* _tmp0_;
	GValue* _tmp1_;
	GValue* _tmp2_;
	valuev = g_new0 (GValue*, valuev_length1);
	_valuev_element = _first_valuev;
	while (_valuev_element != NULL) {
		_vala_array_add3 (&valuev, &valuev_length1, &_valuev_size_, _valuev_element);
		_valuev_element = va_arg (_va_list_valuev, GValue*);
	}
	va_end (_va_list_valuev);
	self = (Foo*) g_type_create_instance (object_type);
	_vala_assert (valuev_length1 == 3, "valuev.length == 3");
	_tmp0_ = valuev[0];
	_vala_assert (g_strcmp0 (g_value_get_string (_tmp0_), "foo") == 0, "valuev[0] == \"foo\"");
	_tmp1_ = valuev[1];
	_vala_assert (g_value_get_int (_tmp1_) == 4711, "valuev[1] == 4711");
	_tmp2_ = valuev[2];
	_vala_assert (g_value_get_double (_tmp2_) == 3.1415, "valuev[2] == 3.1415");
	valuev = (g_free (valuev), NULL);
	return self;
}

Foo*
foo_new_manam (GValue* _first_valuev,
               ...)
{
	va_list _vala_va_list_obj;
	va_start (_vala_va_list_obj, _first_valuev);
	return foo_constructv_manam (TYPE_FOO, _first_valuev, _vala_va_list_obj);
}

Foo*
foo_construct_manam (GType object_type,
                     GValue* _first_valuev,
                     ...)
{
	va_list _vala_va_list_obj;
	va_start (_vala_va_list_obj, _first_valuev);
	return foo_constructv_manam (object_type, _first_valuev, _vala_va_list_obj);
}

static void
_vala_array_add4 (GValue** * array,
                  gint* length,
                  gint* size,
                  GValue* value)
{
	if ((*length) == (*size)) {
		*size = (*size) ? (2 * (*size)) : 4;
		*array = g_renew (GValue*, *array, *size);
	}
	(*array)[(*length)++] = value;
}

static void
_vala_GValue_free (GValue* self)
{
	g_boxed_free (G_TYPE_VALUE, self);
}

Foo*
foo_constructv_manam_owned (GType object_type,
                            GValue* _first_valuev,
                            va_list _va_list_valuev)
{
	GValue* _valuev_element;
	Foo* self = NULL;
	GValue** valuev = NULL;
	gint valuev_length1 = 0;
	gint _valuev_size_ = 0;
	GValue* _tmp0_;
	GValue* _tmp1_;
	GValue* _tmp2_;
	valuev = g_new0 (GValue*, valuev_length1);
	_valuev_element = _first_valuev;
	while (_valuev_element != NULL) {
		_vala_array_add4 (&valuev, &valuev_length1, &_valuev_size_, _valuev_element);
		_valuev_element = va_arg (_va_list_valuev, GValue*);
	}
	va_end (_va_list_valuev);
	self = (Foo*) g_type_create_instance (object_type);
	_vala_assert (valuev_length1 == 3, "valuev.length == 3");
	_tmp0_ = valuev[0];
	_vala_assert (g_strcmp0 (g_value_get_string (_tmp0_), "foo") == 0, "valuev[0] == \"foo\"");
	_tmp1_ = valuev[1];
	_vala_assert (g_value_get_int (_tmp1_) == 4711, "valuev[1] == 4711");
	_tmp2_ = valuev[2];
	_vala_assert (g_value_get_double (_tmp2_) == 3.1415, "valuev[2] == 3.1415");
	valuev = (_vala_array_free (valuev, valuev_length1, (GDestroyNotify) _vala_GValue_free), NULL);
	return self;
}

Foo*
foo_new_manam_owned (GValue* _first_valuev,
                     ...)
{
	va_list _vala_va_list_obj;
	va_start (_vala_va_list_obj, _first_valuev);
	return foo_constructv_manam_owned (TYPE_FOO, _first_valuev, _vala_va_list_obj);
}

Foo*
foo_construct_manam_owned (GType object_type,
                           GValue* _first_valuev,
                           ...)
{
	va_list _vala_va_list_obj;
	va_start (_vala_va_list_obj, _first_valuev);
	return foo_constructv_manam_owned (object_type, _first_valuev, _vala_va_list_obj);
}

static void
_vala_array_add5 (GVariant** * array,
                  gint* length,
                  gint* size,
                  GVariant* value)
{
	if ((*length) == (*size)) {
		*size = (*size) ? (2 * (*size)) : 4;
		*array = g_renew (GVariant*, *array, (*size) + 1);
	}
	(*array)[(*length)++] = value;
	(*array)[*length] = NULL;
}

static gchar*
_variant_get1 (GVariant* value)
{
	return g_variant_dup_string (value, NULL);
}

static gint
_variant_get2 (GVariant* value)
{
	return g_variant_get_int32 (value);
}

static gdouble
_variant_get3 (GVariant* value)
{
	return g_variant_get_double (value);
}

Foo*
foo_constructv_minim (GType object_type,
                      GVariant* _first_variantv,
                      va_list _va_list_variantv)
{
	GVariant* _variantv_element;
	Foo* self = NULL;
	GVariant** variantv = NULL;
	gint variantv_length1 = 0;
	gint _variantv_size_ = 0;
	GVariant* _tmp0_;
	gchar* _tmp1_;
	gchar* _tmp2_;
	GVariant* _tmp3_;
	gint _tmp4_;
	GVariant* _tmp5_;
	gdouble _tmp6_;
	variantv = g_new0 (GVariant*, variantv_length1 + 1);
	_variantv_element = _first_variantv;
	while (_variantv_element != NULL) {
		_vala_array_add5 (&variantv, &variantv_length1, &_variantv_size_, _variantv_element);
		_variantv_element = va_arg (_va_list_variantv, GVariant*);
	}
	va_end (_va_list_variantv);
	self = (Foo*) g_type_create_instance (object_type);
	_vala_assert (variantv_length1 == 3, "variantv.length == 3");
	_tmp0_ = variantv[0];
	_tmp1_ = _variant_get1 (_tmp0_);
	_tmp2_ = _tmp1_;
	_vala_assert (g_strcmp0 (_tmp2_, "foo") == 0, "(string) variantv[0] == \"foo\"");
	_g_free0 (_tmp2_);
	_tmp3_ = variantv[1];
	_tmp4_ = _variant_get2 (_tmp3_);
	_vala_assert (_tmp4_ == 4711, "(int) variantv[1] == 4711");
	_tmp5_ = variantv[2];
	_tmp6_ = _variant_get3 (_tmp5_);
	_vala_assert (_tmp6_ == 3.1415, "(double) variantv[2] == 3.1415");
	variantv = (g_free (variantv), NULL);
	return self;
}

Foo*
foo_new_minim (GVariant* _first_variantv,
               ...)
{
	va_list _vala_va_list_obj;
	va_start (_vala_va_list_obj, _first_variantv);
	return foo_constructv_minim (TYPE_FOO, _first_variantv, _vala_va_list_obj);
}

Foo*
foo_construct_minim (GType object_type,
                     GVariant* _first_variantv,
                     ...)
{
	va_list _vala_va_list_obj;
	va_start (_vala_va_list_obj, _first_variantv);
	return foo_constructv_minim (object_type, _first_variantv, _vala_va_list_obj);
}

static void
value_foo_init (GValue* value)
{
	value->data[0].v_pointer = NULL;
}

static void
value_foo_free_value (GValue* value)
{
	if (value->data[0].v_pointer) {
		foo_unref (value->data[0].v_pointer);
	}
}

static void
value_foo_copy_value (const GValue* src_value,
                      GValue* dest_value)
{
	if (src_value->data[0].v_pointer) {
		dest_value->data[0].v_pointer = foo_ref (src_value->data[0].v_pointer);
	} else {
		dest_value->data[0].v_pointer = NULL;
	}
}

static gpointer
value_foo_peek_pointer (const GValue* value)
{
	return value->data[0].v_pointer;
}

static gchar*
value_foo_collect_value (GValue* value,
                         guint n_collect_values,
                         GTypeCValue* collect_values,
                         guint collect_flags)
{
	if (collect_values[0].v_pointer) {
		Foo * 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 = foo_ref (object);
	} else {
		value->data[0].v_pointer = NULL;
	}
	return NULL;
}

static gchar*
value_foo_lcopy_value (const GValue* value,
                       guint n_collect_values,
                       GTypeCValue* collect_values,
                       guint collect_flags)
{
	Foo ** 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 = foo_ref (value->data[0].v_pointer);
	}
	return NULL;
}

GParamSpec*
param_spec_foo (const gchar* name,
                const gchar* nick,
                const gchar* blurb,
                GType object_type,
                GParamFlags flags)
{
	ParamSpecFoo* spec;
	g_return_val_if_fail (g_type_is_a (object_type, TYPE_FOO), 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
value_get_foo (const GValue* value)
{
	g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_FOO), NULL);
	return value->data[0].v_pointer;
}

void
value_set_foo (GValue* value,
               gpointer v_object)
{
	Foo * old;
	g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_FOO));
	old = value->data[0].v_pointer;
	if (v_object) {
		g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_FOO));
		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;
		foo_ref (value->data[0].v_pointer);
	} else {
		value->data[0].v_pointer = NULL;
	}
	if (old) {
		foo_unref (old);
	}
}

void
value_take_foo (GValue* value,
                gpointer v_object)
{
	Foo * old;
	g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, TYPE_FOO));
	old = value->data[0].v_pointer;
	if (v_object) {
		g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, TYPE_FOO));
		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) {
		foo_unref (old);
	}
}

static void
foo_class_init (FooClass * klass,
                gpointer klass_data)
{
	foo_parent_class = g_type_class_peek_parent (klass);
	((FooClass *) klass)->finalize = foo_finalize;
}

static void
foo_instance_init (Foo * self,
                   gpointer klass)
{
	self->ref_count = 1;
}

static void
foo_finalize (Foo * obj)
{
	Foo * self;
	self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_FOO, Foo);
	g_signal_handlers_destroy (self);
}

static GType
foo_get_type_once (void)
{
	static const GTypeValueTable g_define_type_value_table = { value_foo_init, value_foo_free_value, value_foo_copy_value, value_foo_peek_pointer, "p", value_foo_collect_value, "p", value_foo_lcopy_value };
	static const GTypeInfo g_define_type_info = { sizeof (FooClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) foo_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Foo), 0, (GInstanceInitFunc) foo_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 foo_type_id;
	foo_type_id = g_type_register_fundamental (g_type_fundamental_next (), "Foo", &g_define_type_info, &g_define_type_fundamental_info, 0);
	return foo_type_id;
}

GType
foo_get_type (void)
{
	static volatile gsize foo_type_id__once = 0;
	if (g_once_init_enter (&foo_type_id__once)) {
		GType foo_type_id;
		foo_type_id = foo_get_type_once ();
		g_once_init_leave (&foo_type_id__once, foo_type_id);
	}
	return foo_type_id__once;
}

gpointer
foo_ref (gpointer instance)
{
	Foo * self;
	self = instance;
	g_atomic_int_inc (&self->ref_count);
	return instance;
}

void
foo_unref (gpointer instance)
{
	Foo * self;
	self = instance;
	if (g_atomic_int_dec_and_test (&self->ref_count)) {
		FOO_GET_CLASS (self)->finalize (self);
		g_type_free_instance ((GTypeInstance *) self);
	}
}

static void
_vala_array_add6 (const gchar** * array,
                  gint* length,
                  gint* size,
                  const gchar* value)
{
	if ((*length) == (*size)) {
		*size = (*size) ? (2 * (*size)) : 4;
		*array = g_renew (const gchar*, *array, (*size) + 1);
	}
	(*array)[(*length)++] = value;
	(*array)[*length] = NULL;
}

void
foo (const gchar* _first_strv,
     ...)
{
	const gchar* _strv_element;
	va_list _va_list_strv;
	const gchar** strv = NULL;
	gint strv_length1 = 0;
	gint _strv_size_ = 0;
	const gchar* _tmp0_;
	const gchar* _tmp1_;
	const gchar* _tmp2_;
	strv = g_new0 (const gchar*, strv_length1 + 1);
	va_start (_va_list_strv, _first_strv);
	_strv_element = _first_strv;
	while (_strv_element != NULL) {
		_vala_array_add6 (&strv, &strv_length1, &_strv_size_, _strv_element);
		_strv_element = va_arg (_va_list_strv, const gchar*);
	}
	va_end (_va_list_strv);
	_vala_assert (strv_length1 == 3, "strv.length == 3");
	_tmp0_ = strv[0];
	_vala_assert (g_strcmp0 (_tmp0_, "foo") == 0, "strv[0] == \"foo\"");
	_tmp1_ = strv[1];
	_vala_assert (g_strcmp0 (_tmp1_, "bar") == 0, "strv[1] == \"bar\"");
	_tmp2_ = strv[2];
	_vala_assert (g_strcmp0 (_tmp2_, "manam") == 0, "strv[2] == \"manam\"");
	strv = (g_free (strv), NULL);
}

static void
_vala_array_add7 (gint* * array,
                  gint* length,
                  gint* size,
                  gint value)
{
	if ((*length) == (*size)) {
		*size = (*size) ? (2 * (*size)) : 4;
		*array = g_renew (gint, *array, *size);
	}
	(*array)[(*length)++] = value;
}

void
bar (gint _first_intv,
     ...)
{
	gint _intv_element;
	va_list _va_list_intv;
	gint* intv = NULL;
	gint intv_length1 = 0;
	gint _intv_size_ = 0;
	gint _tmp0_;
	gint _tmp1_;
	gint _tmp2_;
	intv = g_new0 (gint, intv_length1);
	va_start (_va_list_intv, _first_intv);
	_intv_element = _first_intv;
	while (_intv_element != NULL) {
		_vala_array_add7 (&intv, &intv_length1, &_intv_size_, _intv_element);
		_intv_element = va_arg (_va_list_intv, gint);
	}
	va_end (_va_list_intv);
	_vala_assert (intv_length1 == 3, "intv.length == 3");
	_tmp0_ = intv[0];
	_vala_assert (_tmp0_ == 23, "intv[0] == 23");
	_tmp1_ = intv[1];
	_vala_assert (_tmp1_ == 42, "intv[1] == 42");
	_tmp2_ = intv[2];
	_vala_assert (_tmp2_ == 4711, "intv[2] == 4711");
	intv = (g_free (intv), NULL);
}

static void
_vala_array_add8 (GValue** * array,
                  gint* length,
                  gint* size,
                  const GValue* value)
{
	if ((*length) == (*size)) {
		*size = (*size) ? (2 * (*size)) : 4;
		*array = g_renew (GValue*, *array, *size);
	}
	(*array)[(*length)++] = value;
}

void
manam (GValue* _first_valuev,
       ...)
{
	GValue* _valuev_element;
	va_list _va_list_valuev;
	GValue** valuev = NULL;
	gint valuev_length1 = 0;
	gint _valuev_size_ = 0;
	GValue* _tmp0_;
	GValue* _tmp1_;
	GValue* _tmp2_;
	valuev = g_new0 (GValue*, valuev_length1);
	va_start (_va_list_valuev, _first_valuev);
	_valuev_element = _first_valuev;
	while (_valuev_element != NULL) {
		_vala_array_add8 (&valuev, &valuev_length1, &_valuev_size_, _valuev_element);
		_valuev_element = va_arg (_va_list_valuev, GValue*);
	}
	va_end (_va_list_valuev);
	_vala_assert (valuev_length1 == 3, "valuev.length == 3");
	_tmp0_ = valuev[0];
	_vala_assert (g_strcmp0 (g_value_get_string (_tmp0_), "foo") == 0, "valuev[0] == \"foo\"");
	_tmp1_ = valuev[1];
	_vala_assert (g_value_get_int (_tmp1_) == 4711, "valuev[1] == 4711");
	_tmp2_ = valuev[2];
	_vala_assert (g_value_get_double (_tmp2_) == 3.1415, "valuev[2] == 3.1415");
	valuev = (g_free (valuev), NULL);
}

static void
_vala_array_add9 (GValue** * array,
                  gint* length,
                  gint* size,
                  GValue* value)
{
	if ((*length) == (*size)) {
		*size = (*size) ? (2 * (*size)) : 4;
		*array = g_renew (GValue*, *array, *size);
	}
	(*array)[(*length)++] = value;
}

void
manam_owned (GValue* _first_valuev,
             ...)
{
	GValue* _valuev_element;
	va_list _va_list_valuev;
	GValue** valuev = NULL;
	gint valuev_length1 = 0;
	gint _valuev_size_ = 0;
	GValue* _tmp0_;
	GValue* _tmp1_;
	GValue* _tmp2_;
	valuev = g_new0 (GValue*, valuev_length1);
	va_start (_va_list_valuev, _first_valuev);
	_valuev_element = _first_valuev;
	while (_valuev_element != NULL) {
		_vala_array_add9 (&valuev, &valuev_length1, &_valuev_size_, _valuev_element);
		_valuev_element = va_arg (_va_list_valuev, GValue*);
	}
	va_end (_va_list_valuev);
	_vala_assert (valuev_length1 == 3, "valuev.length == 3");
	_tmp0_ = valuev[0];
	_vala_assert (g_strcmp0 (g_value_get_string (_tmp0_), "foo") == 0, "valuev[0] == \"foo\"");
	_tmp1_ = valuev[1];
	_vala_assert (g_value_get_int (_tmp1_) == 4711, "valuev[1] == 4711");
	_tmp2_ = valuev[2];
	_vala_assert (g_value_get_double (_tmp2_) == 3.1415, "valuev[2] == 3.1415");
	valuev = (_vala_array_free (valuev, valuev_length1, (GDestroyNotify) _vala_GValue_free), NULL);
}

static void
_vala_array_add10 (GVariant** * array,
                   gint* length,
                   gint* size,
                   GVariant* value)
{
	if ((*length) == (*size)) {
		*size = (*size) ? (2 * (*size)) : 4;
		*array = g_renew (GVariant*, *array, (*size) + 1);
	}
	(*array)[(*length)++] = value;
	(*array)[*length] = NULL;
}

static gchar*
_variant_get4 (GVariant* value)
{
	return g_variant_dup_string (value, NULL);
}

static gint
_variant_get5 (GVariant* value)
{
	return g_variant_get_int32 (value);
}

static gdouble
_variant_get6 (GVariant* value)
{
	return g_variant_get_double (value);
}

void
minim (GVariant* _first_variantv,
       ...)
{
	GVariant* _variantv_element;
	va_list _va_list_variantv;
	GVariant** variantv = NULL;
	gint variantv_length1 = 0;
	gint _variantv_size_ = 0;
	GVariant* _tmp0_;
	gchar* _tmp1_;
	gchar* _tmp2_;
	GVariant* _tmp3_;
	gint _tmp4_;
	GVariant* _tmp5_;
	gdouble _tmp6_;
	variantv = g_new0 (GVariant*, variantv_length1 + 1);
	va_start (_va_list_variantv, _first_variantv);
	_variantv_element = _first_variantv;
	while (_variantv_element != NULL) {
		_vala_array_add10 (&variantv, &variantv_length1, &_variantv_size_, _variantv_element);
		_variantv_element = va_arg (_va_list_variantv, GVariant*);
	}
	va_end (_va_list_variantv);
	_vala_assert (variantv_length1 == 3, "variantv.length == 3");
	_tmp0_ = variantv[0];
	_tmp1_ = _variant_get4 (_tmp0_);
	_tmp2_ = _tmp1_;
	_vala_assert (g_strcmp0 (_tmp2_, "foo") == 0, "(string) variantv[0] == \"foo\"");
	_g_free0 (_tmp2_);
	_tmp3_ = variantv[1];
	_tmp4_ = _variant_get5 (_tmp3_);
	_vala_assert (_tmp4_ == 4711, "(int) variantv[1] == 4711");
	_tmp5_ = variantv[2];
	_tmp6_ = _variant_get6 (_tmp5_);
	_vala_assert (_tmp6_ == 3.1415, "(double) variantv[2] == 3.1415");
	variantv = (g_free (variantv), NULL);
}

static GVariant*
_variant_new1 (const gchar* value)
{
	return g_variant_ref_sink (g_variant_new_string (value));
}

static GVariant*
_variant_new2 (gint value)
{
	return g_variant_ref_sink (g_variant_new_int32 (value));
}

static GVariant*
_variant_new3 (gdouble value)
{
	return g_variant_ref_sink (g_variant_new_double (value));
}

static GVariant*
_variant_new4 (const gchar* value)
{
	return g_variant_ref_sink (g_variant_new_string (value));
}

static GVariant*
_variant_new5 (gint value)
{
	return g_variant_ref_sink (g_variant_new_int32 (value));
}

static GVariant*
_variant_new6 (gdouble value)
{
	return g_variant_ref_sink (g_variant_new_double (value));
}

static void
_vala_main (void)
{
	Foo* f = NULL;
	Foo* _tmp0_;
	Foo* _tmp1_;
	GValue* _tmp2_ = NULL;
	GValue* _tmp3_ = NULL;
	GValue* _tmp4_ = NULL;
	Foo* _tmp5_;
	GValue* _tmp6_ = NULL;
	GValue* _tmp7_ = NULL;
	GValue* _tmp8_ = NULL;
	Foo* _tmp9_;
	GVariant* _tmp10_;
	GVariant* _tmp11_;
	GVariant* _tmp12_;
	Foo* _tmp13_;
	GValue* _tmp14_ = NULL;
	GValue* _tmp15_ = NULL;
	GValue* _tmp16_ = NULL;
	GValue* _tmp17_ = NULL;
	GValue* _tmp18_ = NULL;
	GValue* _tmp19_ = NULL;
	GVariant* _tmp20_;
	GVariant* _tmp21_;
	GVariant* _tmp22_;
	_tmp0_ = foo_new ("foo", "bar", "manam", NULL);
	_foo_unref0 (f);
	f = _tmp0_;
	_tmp1_ = foo_new_bar (23, 42, 4711, NULL);
	_foo_unref0 (f);
	f = _tmp1_;
	_tmp2_ = g_new0 (GValue, 1);
	g_value_init (_tmp2_, G_TYPE_STRING);
	g_value_set_string (_tmp2_, "foo");
	_tmp3_ = g_new0 (GValue, 1);
	g_value_init (_tmp3_, G_TYPE_INT);
	g_value_set_int (_tmp3_, 4711);
	_tmp4_ = g_new0 (GValue, 1);
	g_value_init (_tmp4_, G_TYPE_DOUBLE);
	g_value_set_double (_tmp4_, 3.1415);
	_tmp5_ = foo_new_manam (_tmp2_, _tmp3_, _tmp4_, NULL);
	_foo_unref0 (f);
	f = _tmp5_;
	__vala_GValue_free0 (_tmp4_);
	__vala_GValue_free0 (_tmp3_);
	__vala_GValue_free0 (_tmp2_);
	_tmp6_ = g_new0 (GValue, 1);
	g_value_init (_tmp6_, G_TYPE_STRING);
	g_value_set_string (_tmp6_, "foo");
	_tmp7_ = g_new0 (GValue, 1);
	g_value_init (_tmp7_, G_TYPE_INT);
	g_value_set_int (_tmp7_, 4711);
	_tmp8_ = g_new0 (GValue, 1);
	g_value_init (_tmp8_, G_TYPE_DOUBLE);
	g_value_set_double (_tmp8_, 3.1415);
	_tmp9_ = foo_new_manam_owned (_tmp6_, _tmp7_, _tmp8_, NULL);
	_foo_unref0 (f);
	f = _tmp9_;
	_tmp10_ = _variant_new1 ("foo");
	_tmp11_ = _variant_new2 (4711);
	_tmp12_ = _variant_new3 (3.1415);
	_tmp13_ = foo_new_minim (_tmp10_, _tmp11_, _tmp12_, NULL);
	_foo_unref0 (f);
	f = _tmp13_;
	_g_variant_unref0 (_tmp12_);
	_g_variant_unref0 (_tmp11_);
	_g_variant_unref0 (_tmp10_);
	foo ("foo", "bar", "manam", NULL);
	bar (23, 42, 4711, NULL);
	_tmp14_ = g_new0 (GValue, 1);
	g_value_init (_tmp14_, G_TYPE_STRING);
	g_value_set_string (_tmp14_, "foo");
	_tmp15_ = g_new0 (GValue, 1);
	g_value_init (_tmp15_, G_TYPE_INT);
	g_value_set_int (_tmp15_, 4711);
	_tmp16_ = g_new0 (GValue, 1);
	g_value_init (_tmp16_, G_TYPE_DOUBLE);
	g_value_set_double (_tmp16_, 3.1415);
	manam (_tmp14_, _tmp15_, _tmp16_, NULL);
	__vala_GValue_free0 (_tmp16_);
	__vala_GValue_free0 (_tmp15_);
	__vala_GValue_free0 (_tmp14_);
	_tmp17_ = g_new0 (GValue, 1);
	g_value_init (_tmp17_, G_TYPE_STRING);
	g_value_set_string (_tmp17_, "foo");
	_tmp18_ = g_new0 (GValue, 1);
	g_value_init (_tmp18_, G_TYPE_INT);
	g_value_set_int (_tmp18_, 4711);
	_tmp19_ = g_new0 (GValue, 1);
	g_value_init (_tmp19_, G_TYPE_DOUBLE);
	g_value_set_double (_tmp19_, 3.1415);
	manam_owned (_tmp17_, _tmp18_, _tmp19_, NULL);
	_tmp20_ = _variant_new4 ("foo");
	_tmp21_ = _variant_new5 (4711);
	_tmp22_ = _variant_new6 (3.1415);
	minim (_tmp20_, _tmp21_, _tmp22_, NULL);
	_g_variant_unref0 (_tmp22_);
	_g_variant_unref0 (_tmp21_);
	_g_variant_unref0 (_tmp20_);
	_foo_unref0 (f);
}

int
main (int argc,
      char ** argv)
{
	_vala_main ();
	return 0;
}

static void
_vala_array_destroy (gpointer array,
                     gssize array_length,
                     GDestroyNotify destroy_func)
{
	if ((array != NULL) && (destroy_func != NULL)) {
		gssize i;
		for (i = 0; i < array_length; i = i + 1) {
			if (((gpointer*) array)[i] != NULL) {
				destroy_func (((gpointer*) array)[i]);
			}
		}
	}
}

static void
_vala_array_free (gpointer array,
                  gssize array_length,
                  GDestroyNotify destroy_func)
{
	_vala_array_destroy (array, array_length, destroy_func);
	g_free (array);
}

