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

#include <glib-object.h>
#include <glib.h>
#include <stdio.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 MAMAN_TYPE_IBAZ (maman_ibaz_get_type ())
#define MAMAN_IBAZ(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_IBAZ, MamanIbaz))
#define MAMAN_IS_IBAZ(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_IBAZ))
#define MAMAN_IBAZ_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), MAMAN_TYPE_IBAZ, MamanIbazIface))

typedef struct _MamanIbaz MamanIbaz;
typedef struct _MamanIbazIface MamanIbazIface;

#define MAMAN_TYPE_BAZ (maman_baz_get_type ())
#define MAMAN_BAZ(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_BAZ, MamanBaz))
#define MAMAN_BAZ_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_TYPE_BAZ, MamanBazClass))
#define MAMAN_IS_BAZ(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_BAZ))
#define MAMAN_IS_BAZ_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_TYPE_BAZ))
#define MAMAN_BAZ_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_TYPE_BAZ, MamanBazClass))

typedef struct _MamanBaz MamanBaz;
typedef struct _MamanBazClass MamanBazClass;
typedef struct _MamanBazPrivate MamanBazPrivate;
enum  {
	MAMAN_BAZ_0_PROPERTY,
	MAMAN_BAZ_NUM_PROPERTIES
};
static GParamSpec* maman_baz_properties[MAMAN_BAZ_NUM_PROPERTIES];

#define MAMAN_TYPE_SUB_BAZ (maman_sub_baz_get_type ())
#define MAMAN_SUB_BAZ(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MAMAN_TYPE_SUB_BAZ, MamanSubBaz))
#define MAMAN_SUB_BAZ_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MAMAN_TYPE_SUB_BAZ, MamanSubBazClass))
#define MAMAN_IS_SUB_BAZ(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MAMAN_TYPE_SUB_BAZ))
#define MAMAN_IS_SUB_BAZ_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MAMAN_TYPE_SUB_BAZ))
#define MAMAN_SUB_BAZ_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MAMAN_TYPE_SUB_BAZ, MamanSubBazClass))

typedef struct _MamanSubBaz MamanSubBaz;
typedef struct _MamanSubBazClass MamanSubBazClass;
typedef struct _MamanSubBazPrivate MamanSubBazPrivate;
enum  {
	MAMAN_SUB_BAZ_0_PROPERTY,
	MAMAN_SUB_BAZ_NUM_PROPERTIES
};
static GParamSpec* maman_sub_baz_properties[MAMAN_SUB_BAZ_NUM_PROPERTIES];
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))

struct _MamanIbazIface {
	GTypeInterface parent_iface;
	void (*do_action) (MamanIbaz* self);
	void (*do_virtual_action) (MamanIbaz* self);
};

struct _MamanBaz {
	GObject parent_instance;
	MamanBazPrivate * priv;
};

struct _MamanBazClass {
	GObjectClass parent_class;
	void (*do_virtual_action) (MamanBaz* self);
};

struct _MamanSubBaz {
	MamanBaz parent_instance;
	MamanSubBazPrivate * priv;
};

struct _MamanSubBazClass {
	MamanBazClass parent_class;
};

static gpointer maman_baz_parent_class = NULL;
static MamanIbazIface * maman_baz_maman_ibaz_parent_iface = NULL;
static gpointer maman_sub_baz_parent_class = NULL;

VALA_EXTERN GType maman_ibaz_get_type (void) G_GNUC_CONST ;
G_DEFINE_AUTOPTR_CLEANUP_FUNC (MamanIbaz, g_object_unref)
VALA_EXTERN void maman_ibaz_do_action (MamanIbaz* self);
VALA_EXTERN void maman_ibaz_do_virtual_action (MamanIbaz* self);
VALA_EXTERN void maman_ibaz_protected_mixin_1 (MamanIbaz* self);
VALA_EXTERN void maman_ibaz_protected_mixin_2 (MamanIbaz* self);
VALA_EXTERN void maman_ibaz_public_mixin (MamanIbaz* self);
static GType maman_ibaz_get_type_once (void);
VALA_EXTERN GType maman_baz_get_type (void) G_GNUC_CONST ;
G_DEFINE_AUTOPTR_CLEANUP_FUNC (MamanBaz, g_object_unref)
VALA_EXTERN void maman_baz_do_virtual_action (MamanBaz* self);
static void maman_baz_real_do_action (MamanIbaz* base);
static void maman_baz_real_do_virtual_action (MamanBaz* self);
VALA_EXTERN void maman_baz_do_mixin (MamanBaz* self);
VALA_EXTERN MamanBaz* maman_baz_new (void);
VALA_EXTERN MamanBaz* maman_baz_construct (GType object_type);
static GType maman_baz_get_type_once (void);
VALA_EXTERN GType maman_sub_baz_get_type (void) G_GNUC_CONST ;
G_DEFINE_AUTOPTR_CLEANUP_FUNC (MamanSubBaz, g_object_unref)
static void maman_sub_baz_real_do_virtual_action (MamanBaz* base);
VALA_EXTERN gint maman_sub_baz_main_func (void);
VALA_EXTERN MamanSubBaz* maman_sub_baz_new (void);
VALA_EXTERN MamanSubBaz* maman_sub_baz_construct (GType object_type);
static GType maman_sub_baz_get_type_once (void);
static void _vala_main (void);

void
maman_ibaz_do_action (MamanIbaz* self)
{
	MamanIbazIface* _iface_;
	g_return_if_fail (MAMAN_IS_IBAZ (self));
	_iface_ = MAMAN_IBAZ_GET_INTERFACE (self);
	if (_iface_->do_action) {
		_iface_->do_action (self);
	}
}

void
maman_ibaz_do_virtual_action (MamanIbaz* self)
{
	MamanIbazIface* _iface_;
	g_return_if_fail (MAMAN_IS_IBAZ (self));
	_iface_ = MAMAN_IBAZ_GET_INTERFACE (self);
	if (_iface_->do_virtual_action) {
		_iface_->do_virtual_action (self);
	}
}

void
maman_ibaz_protected_mixin_1 (MamanIbaz* self)
{
	FILE* _tmp0_;
	_tmp0_ = stdout;
	fputs ("protected_mixin_1\n", _tmp0_);
	maman_ibaz_protected_mixin_2 (self);
}

void
maman_ibaz_protected_mixin_2 (MamanIbaz* self)
{
	FILE* _tmp0_;
	_tmp0_ = stdout;
	fputs ("protected_mixin_2\n", _tmp0_);
}

void
maman_ibaz_public_mixin (MamanIbaz* self)
{
	maman_ibaz_protected_mixin_1 (self);
	maman_ibaz_protected_mixin_2 (self);
}

static void
maman_ibaz_default_init (MamanIbazIface * iface,
                         gpointer iface_data)
{
}

static GType
maman_ibaz_get_type_once (void)
{
	static const GTypeInfo g_define_type_info = { sizeof (MamanIbazIface), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) maman_ibaz_default_init, (GClassFinalizeFunc) NULL, NULL, 0, 0, (GInstanceInitFunc) NULL, NULL };
	GType maman_ibaz_type_id;
	maman_ibaz_type_id = g_type_register_static (G_TYPE_INTERFACE, "MamanIbaz", &g_define_type_info, 0);
	g_type_interface_add_prerequisite (maman_ibaz_type_id, G_TYPE_OBJECT);
	return maman_ibaz_type_id;
}

GType
maman_ibaz_get_type (void)
{
	static volatile gsize maman_ibaz_type_id__once = 0;
	if (g_once_init_enter (&maman_ibaz_type_id__once)) {
		GType maman_ibaz_type_id;
		maman_ibaz_type_id = maman_ibaz_get_type_once ();
		g_once_init_leave (&maman_ibaz_type_id__once, maman_ibaz_type_id);
	}
	return maman_ibaz_type_id__once;
}

static void
maman_baz_real_do_action (MamanIbaz* base)
{
	MamanBaz * self;
	FILE* _tmp0_;
	self = G_TYPE_CHECK_INSTANCE_CAST (base, MAMAN_TYPE_BAZ, MamanBaz);
	_tmp0_ = stdout;
	fprintf (_tmp0_, " 2");
}

static void
maman_baz_real_do_virtual_action (MamanBaz* self)
{
	FILE* _tmp0_;
	_tmp0_ = stdout;
	fprintf (_tmp0_, " 4");
}

void
maman_baz_do_virtual_action (MamanBaz* self)
{
	MamanBazClass* _klass_;
	g_return_if_fail (MAMAN_IS_BAZ (self));
	_klass_ = MAMAN_BAZ_GET_CLASS (self);
	if (_klass_->do_virtual_action) {
		_klass_->do_virtual_action (self);
	}
}

void
maman_baz_do_mixin (MamanBaz* self)
{
	g_return_if_fail (MAMAN_IS_BAZ (self));
	maman_ibaz_public_mixin (G_TYPE_CHECK_INSTANCE_CAST (self, MAMAN_TYPE_IBAZ, MamanIbaz));
}

MamanBaz*
maman_baz_construct (GType object_type)
{
	MamanBaz * self = NULL;
	self = (MamanBaz*) g_object_new (object_type, NULL);
	return self;
}

MamanBaz*
maman_baz_new (void)
{
	return maman_baz_construct (MAMAN_TYPE_BAZ);
}

static void
maman_baz_class_init (MamanBazClass * klass,
                      gpointer klass_data)
{
	maman_baz_parent_class = g_type_class_peek_parent (klass);
	((MamanBazClass *) klass)->do_virtual_action = (void (*) (MamanBaz*)) maman_baz_real_do_virtual_action;
}

static void
maman_baz_maman_ibaz_interface_init (MamanIbazIface * iface,
                                     gpointer iface_data)
{
	maman_baz_maman_ibaz_parent_iface = g_type_interface_peek_parent (iface);
	iface->do_action = (void (*) (MamanIbaz*)) maman_baz_real_do_action;
	iface->do_virtual_action = (void (*) (MamanIbaz*)) maman_baz_do_virtual_action;
}

static void
maman_baz_instance_init (MamanBaz * self,
                         gpointer klass)
{
}

static GType
maman_baz_get_type_once (void)
{
	static const GTypeInfo g_define_type_info = { sizeof (MamanBazClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) maman_baz_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (MamanBaz), 0, (GInstanceInitFunc) maman_baz_instance_init, NULL };
	static const GInterfaceInfo maman_ibaz_info = { (GInterfaceInitFunc) maman_baz_maman_ibaz_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
	GType maman_baz_type_id;
	maman_baz_type_id = g_type_register_static (G_TYPE_OBJECT, "MamanBaz", &g_define_type_info, 0);
	g_type_add_interface_static (maman_baz_type_id, MAMAN_TYPE_IBAZ, &maman_ibaz_info);
	return maman_baz_type_id;
}

GType
maman_baz_get_type (void)
{
	static volatile gsize maman_baz_type_id__once = 0;
	if (g_once_init_enter (&maman_baz_type_id__once)) {
		GType maman_baz_type_id;
		maman_baz_type_id = maman_baz_get_type_once ();
		g_once_init_leave (&maman_baz_type_id__once, maman_baz_type_id);
	}
	return maman_baz_type_id__once;
}

static void
maman_sub_baz_real_do_virtual_action (MamanBaz* base)
{
	MamanSubBaz * self;
	FILE* _tmp0_;
	self = G_TYPE_CHECK_INSTANCE_CAST (base, MAMAN_TYPE_SUB_BAZ, MamanSubBaz);
	_tmp0_ = stdout;
	fprintf (_tmp0_, " 6");
}

gint
maman_sub_baz_main_func (void)
{
	FILE* _tmp0_;
	MamanIbaz* ibaz = NULL;
	MamanBaz* _tmp1_;
	FILE* _tmp2_;
	FILE* _tmp3_;
	MamanIbaz* subbaz = NULL;
	MamanSubBaz* _tmp4_;
	FILE* _tmp5_;
	gint result;
	_tmp0_ = stdout;
	fprintf (_tmp0_, "Interface Test: 1");
	_tmp1_ = maman_baz_new ();
	ibaz = G_TYPE_CHECK_INSTANCE_CAST (_tmp1_, MAMAN_TYPE_IBAZ, MamanIbaz);
	maman_ibaz_do_action (ibaz);
	maman_ibaz_public_mixin (ibaz);
	maman_baz_do_mixin (MAMAN_IS_BAZ (ibaz) ? ((MamanBaz*) ibaz) : NULL);
	_tmp2_ = stdout;
	fprintf (_tmp2_, " 3");
	maman_ibaz_do_virtual_action (ibaz);
	_tmp3_ = stdout;
	fprintf (_tmp3_, " 5");
	_tmp4_ = maman_sub_baz_new ();
	subbaz = G_TYPE_CHECK_INSTANCE_CAST (_tmp4_, MAMAN_TYPE_IBAZ, MamanIbaz);
	maman_ibaz_do_virtual_action (subbaz);
	_tmp5_ = stdout;
	fprintf (_tmp5_, " 7\n");
	maman_ibaz_public_mixin (subbaz);
	maman_ibaz_public_mixin (G_TYPE_CHECK_INSTANCE_CAST (MAMAN_IS_BAZ (subbaz) ? ((MamanBaz*) subbaz) : NULL, MAMAN_TYPE_IBAZ, MamanIbaz));
	result = 0;
	_g_object_unref0 (subbaz);
	_g_object_unref0 (ibaz);
	return result;
}

MamanSubBaz*
maman_sub_baz_construct (GType object_type)
{
	MamanSubBaz * self = NULL;
	self = (MamanSubBaz*) maman_baz_construct (object_type);
	return self;
}

MamanSubBaz*
maman_sub_baz_new (void)
{
	return maman_sub_baz_construct (MAMAN_TYPE_SUB_BAZ);
}

static void
maman_sub_baz_class_init (MamanSubBazClass * klass,
                          gpointer klass_data)
{
	maman_sub_baz_parent_class = g_type_class_peek_parent (klass);
	((MamanBazClass *) klass)->do_virtual_action = (void (*) (MamanBaz*)) maman_sub_baz_real_do_virtual_action;
}

static void
maman_sub_baz_instance_init (MamanSubBaz * self,
                             gpointer klass)
{
}

static GType
maman_sub_baz_get_type_once (void)
{
	static const GTypeInfo g_define_type_info = { sizeof (MamanSubBazClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) maman_sub_baz_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (MamanSubBaz), 0, (GInstanceInitFunc) maman_sub_baz_instance_init, NULL };
	GType maman_sub_baz_type_id;
	maman_sub_baz_type_id = g_type_register_static (MAMAN_TYPE_BAZ, "MamanSubBaz", &g_define_type_info, 0);
	return maman_sub_baz_type_id;
}

GType
maman_sub_baz_get_type (void)
{
	static volatile gsize maman_sub_baz_type_id__once = 0;
	if (g_once_init_enter (&maman_sub_baz_type_id__once)) {
		GType maman_sub_baz_type_id;
		maman_sub_baz_type_id = maman_sub_baz_get_type_once ();
		g_once_init_leave (&maman_sub_baz_type_id__once, maman_sub_baz_type_id);
	}
	return maman_sub_baz_type_id__once;
}

static void
_vala_main (void)
{
	maman_sub_baz_main_func ();
}

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

