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

#include <stdlib.h>
#include <string.h>
#include <glib.h>
#include <glib-object.h>
#include <float.h>
#include <math.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

typedef void (*FooFunc) (const gchar* _first_strv, ...);
typedef void (*BarFunc) (gint _first_intv, ...);
typedef void (*ManamFunc) (GValue* _first_valuev, ...);
typedef void (*ManamOwnedFunc) (GValue* _first_valuev, ...);
typedef void (*MinimFunc) (GVariant* _first_variantv, ...);
#define _g_free0(var) (var = (g_free (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);

VALA_EXTERN void foo (gchar* _first_strv,
          ...);
static void _vala_array_add1 (const gchar** * array,
                       gint* length,
                       gint* size,
                       const gchar* value);
VALA_EXTERN void bar (gint _first_intv,
          ...);
static void _vala_array_add2 (gint* * array,
                       gint* length,
                       gint* size,
                       gint value);
VALA_EXTERN void manam (GValue* _first_valuev,
            ...);
static void _vala_array_add3 (GValue** * array,
                       gint* length,
                       gint* size,
                       const GValue* value);
VALA_EXTERN void manam_owned (GValue* _first_valuev,
                  ...);
static void _vala_array_add4 (GValue** * array,
                       gint* length,
                       gint* size,
                       GValue* value);
static void _vala_GValue_free (GValue* self);
VALA_EXTERN void minim (GVariant* _first_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 _vala_main (void);
static GVariant* _variant_new1 (const gchar* value);
static GVariant* _variant_new2 (gint value);
static GVariant* _variant_new3 (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;
}

void
foo (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_add1 (&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_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;
}

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_add2 (&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_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;
}

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_add3 (&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_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);
}

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_add4 (&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_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);
}

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_add5 (&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_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);
}

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 void
_vala_main (void)
{
	{
		FooFunc func = NULL;
		func = (FooFunc) foo;
		func ("foo", "bar", "manam", NULL);
	}
	{
		BarFunc func = NULL;
		func = (BarFunc) bar;
		func (23, 42, 4711, NULL);
	}
	{
		ManamFunc func = NULL;
		GValue* _tmp0_ = NULL;
		GValue* _tmp1_ = NULL;
		GValue* _tmp2_ = NULL;
		func = (ManamFunc) manam;
		_tmp0_ = g_new0 (GValue, 1);
		g_value_init (_tmp0_, G_TYPE_STRING);
		g_value_set_string (_tmp0_, "foo");
		_tmp1_ = g_new0 (GValue, 1);
		g_value_init (_tmp1_, G_TYPE_INT);
		g_value_set_int (_tmp1_, 4711);
		_tmp2_ = g_new0 (GValue, 1);
		g_value_init (_tmp2_, G_TYPE_DOUBLE);
		g_value_set_double (_tmp2_, 3.1415);
		func (_tmp0_, _tmp1_, _tmp2_, NULL);
		__vala_GValue_free0 (_tmp2_);
		__vala_GValue_free0 (_tmp1_);
		__vala_GValue_free0 (_tmp0_);
	}
	{
		ManamOwnedFunc func = NULL;
		GValue* _tmp3_ = NULL;
		GValue* _tmp4_ = NULL;
		GValue* _tmp5_ = NULL;
		func = (ManamOwnedFunc) manam_owned;
		_tmp3_ = g_new0 (GValue, 1);
		g_value_init (_tmp3_, G_TYPE_STRING);
		g_value_set_string (_tmp3_, "foo");
		_tmp4_ = g_new0 (GValue, 1);
		g_value_init (_tmp4_, G_TYPE_INT);
		g_value_set_int (_tmp4_, 4711);
		_tmp5_ = g_new0 (GValue, 1);
		g_value_init (_tmp5_, G_TYPE_DOUBLE);
		g_value_set_double (_tmp5_, 3.1415);
		func (_tmp3_, _tmp4_, _tmp5_, NULL);
	}
	{
		MinimFunc func = NULL;
		GVariant* _tmp6_;
		GVariant* _tmp7_;
		GVariant* _tmp8_;
		func = (MinimFunc) minim;
		_tmp6_ = _variant_new1 ("foo");
		_tmp7_ = _variant_new2 (4711);
		_tmp8_ = _variant_new3 (3.1415);
		func (_tmp6_, _tmp7_, _tmp8_, NULL);
		_g_variant_unref0 (_tmp8_);
		_g_variant_unref0 (_tmp7_);
		_g_variant_unref0 (_tmp6_);
	}
}

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);
}

