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

/* readonlymultimap.vala
 *
 * Copyright (C) 2013  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-object.h>
#include "gee.h"
#include <glib.h>

#define GEE_TYPE_READ_ONLY_MULTI_MAP (gee_read_only_multi_map_get_type ())
#define GEE_READ_ONLY_MULTI_MAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_READ_ONLY_MULTI_MAP, GeeReadOnlyMultiMap))
#define GEE_READ_ONLY_MULTI_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEE_TYPE_READ_ONLY_MULTI_MAP, GeeReadOnlyMultiMapClass))
#define GEE_IS_READ_ONLY_MULTI_MAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEE_TYPE_READ_ONLY_MULTI_MAP))
#define GEE_IS_READ_ONLY_MULTI_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GEE_TYPE_READ_ONLY_MULTI_MAP))
#define GEE_READ_ONLY_MULTI_MAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GEE_TYPE_READ_ONLY_MULTI_MAP, GeeReadOnlyMultiMapClass))

typedef struct _GeeReadOnlyMultiMap GeeReadOnlyMultiMap;
typedef struct _GeeReadOnlyMultiMapClass GeeReadOnlyMultiMapClass;
typedef struct _GeeReadOnlyMultiMapPrivate GeeReadOnlyMultiMapPrivate;
enum  {
	GEE_READ_ONLY_MULTI_MAP_0_PROPERTY,
	GEE_READ_ONLY_MULTI_MAP_K_TYPE,
	GEE_READ_ONLY_MULTI_MAP_K_DUP_FUNC,
	GEE_READ_ONLY_MULTI_MAP_K_DESTROY_FUNC,
	GEE_READ_ONLY_MULTI_MAP_V_TYPE,
	GEE_READ_ONLY_MULTI_MAP_V_DUP_FUNC,
	GEE_READ_ONLY_MULTI_MAP_V_DESTROY_FUNC,
	GEE_READ_ONLY_MULTI_MAP_SIZE_PROPERTY,
	GEE_READ_ONLY_MULTI_MAP_READ_ONLY_PROPERTY,
	GEE_READ_ONLY_MULTI_MAP_NUM_PROPERTIES
};
static GParamSpec* gee_read_only_multi_map_properties[GEE_READ_ONLY_MULTI_MAP_NUM_PROPERTIES];
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))

#define GEE_READ_ONLY_MAP_TYPE_MAP_ITERATOR (gee_read_only_map_map_iterator_get_type ())
#define GEE_READ_ONLY_MAP_MAP_ITERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_READ_ONLY_MAP_TYPE_MAP_ITERATOR, GeeReadOnlyMapMapIterator))
#define GEE_READ_ONLY_MAP_MAP_ITERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEE_READ_ONLY_MAP_TYPE_MAP_ITERATOR, GeeReadOnlyMapMapIteratorClass))
#define GEE_READ_ONLY_MAP_IS_MAP_ITERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEE_READ_ONLY_MAP_TYPE_MAP_ITERATOR))
#define GEE_READ_ONLY_MAP_IS_MAP_ITERATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GEE_READ_ONLY_MAP_TYPE_MAP_ITERATOR))
#define GEE_READ_ONLY_MAP_MAP_ITERATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GEE_READ_ONLY_MAP_TYPE_MAP_ITERATOR, GeeReadOnlyMapMapIteratorClass))

typedef struct _GeeReadOnlyMapMapIterator GeeReadOnlyMapMapIterator;
typedef struct _GeeReadOnlyMapMapIteratorClass GeeReadOnlyMapMapIteratorClass;

struct _GeeReadOnlyMultiMap {
	GObject parent_instance;
	GeeReadOnlyMultiMapPrivate * priv;
};

struct _GeeReadOnlyMultiMapClass {
	GObjectClass parent_class;
	GeeMultiMap* (*get_read_only_view) (GeeReadOnlyMultiMap* self);
};

struct _GeeReadOnlyMultiMapPrivate {
	GType k_type;
	GBoxedCopyFunc k_dup_func;
	GDestroyNotify k_destroy_func;
	GType v_type;
	GBoxedCopyFunc v_dup_func;
	GDestroyNotify v_destroy_func;
	GeeMultiMap* _multimap;
};

static gint GeeReadOnlyMultiMap_private_offset;
static gpointer gee_read_only_multi_map_parent_class = NULL;
static GeeMultiMapIface * gee_read_only_multi_map_gee_multi_map_parent_iface = NULL;

 G_GNUC_INTERNAL GType gee_read_only_multi_map_get_type (void) G_GNUC_CONST  G_GNUC_UNUSED ;
 G_GNUC_INTERNAL GeeMultiMap* gee_read_only_multi_map_get_read_only_view (GeeReadOnlyMultiMap* self);
 G_GNUC_INTERNAL GeeReadOnlyMultiMap* gee_read_only_multi_map_new (GType k_type,
                                                  GBoxedCopyFunc k_dup_func,
                                                  GDestroyNotify k_destroy_func,
                                                  GType v_type,
                                                  GBoxedCopyFunc v_dup_func,
                                                  GDestroyNotify v_destroy_func,
                                                  GeeMultiMap* multimap);
 G_GNUC_INTERNAL GeeReadOnlyMultiMap* gee_read_only_multi_map_construct (GType object_type,
                                                        GType k_type,
                                                        GBoxedCopyFunc k_dup_func,
                                                        GDestroyNotify k_destroy_func,
                                                        GType v_type,
                                                        GBoxedCopyFunc v_dup_func,
                                                        GDestroyNotify v_destroy_func,
                                                        GeeMultiMap* multimap);
static GeeSet* gee_read_only_multi_map_real_get_keys (GeeMultiMap* base);
static GeeMultiSet* gee_read_only_multi_map_real_get_all_keys (GeeMultiMap* base);
static GeeCollection* gee_read_only_multi_map_real_get_values (GeeMultiMap* base);
static gboolean gee_read_only_multi_map_real_contains (GeeMultiMap* base,
                                                gconstpointer key);
static GeeCollection* gee_read_only_multi_map_real_get (GeeMultiMap* base,
                                                 gconstpointer key);
static void gee_read_only_multi_map_real_set (GeeMultiMap* base,
                                       gconstpointer key,
                                       gconstpointer value);
static gboolean gee_read_only_multi_map_real_remove (GeeMultiMap* base,
                                              gconstpointer key,
                                              gconstpointer value);
static gboolean gee_read_only_multi_map_real_remove_all (GeeMultiMap* base,
                                                  gconstpointer key);
static void gee_read_only_multi_map_real_clear (GeeMultiMap* base);
static GeeMapIterator* gee_read_only_multi_map_real_map_iterator (GeeMultiMap* base);
 G_GNUC_INTERNAL GeeReadOnlyMapMapIterator* gee_read_only_map_map_iterator_new (GType k_type,
                                                               GBoxedCopyFunc k_dup_func,
                                                               GDestroyNotify k_destroy_func,
                                                               GType v_type,
                                                               GBoxedCopyFunc v_dup_func,
                                                               GDestroyNotify v_destroy_func,
                                                               GeeMapIterator* iterator);
 G_GNUC_INTERNAL GeeReadOnlyMapMapIterator* gee_read_only_map_map_iterator_construct (GType object_type,
                                                                     GType k_type,
                                                                     GBoxedCopyFunc k_dup_func,
                                                                     GDestroyNotify k_destroy_func,
                                                                     GType v_type,
                                                                     GBoxedCopyFunc v_dup_func,
                                                                     GDestroyNotify v_destroy_func,
                                                                     GeeMapIterator* iterator);
 G_GNUC_INTERNAL GType gee_read_only_map_map_iterator_get_type (void) G_GNUC_CONST  G_GNUC_UNUSED ;
static void gee_read_only_multi_map_finalize (GObject * obj);
static GType gee_read_only_multi_map_get_type_once (void);
static void _vala_gee_read_only_multi_map_get_property (GObject * object,
                                                 guint property_id,
                                                 GValue * value,
                                                 GParamSpec * pspec);
static void _vala_gee_read_only_multi_map_set_property (GObject * object,
                                                 guint property_id,
                                                 const GValue * value,
                                                 GParamSpec * pspec);

static inline gpointer
gee_read_only_multi_map_get_instance_private (GeeReadOnlyMultiMap* self)
{
	return G_STRUCT_MEMBER_P (self, GeeReadOnlyMultiMap_private_offset);
}

/**
 * Constructs a read-only multi-set that mirrors the content of the specified
 * list.
 *
 * @param multiset the multi-set to decorate.
 */
static gpointer
_g_object_ref0 (gpointer self)
{
	return self ? g_object_ref (self) : NULL;
}

 G_GNUC_INTERNAL GeeReadOnlyMultiMap*
gee_read_only_multi_map_construct (GType object_type,
                                   GType k_type,
                                   GBoxedCopyFunc k_dup_func,
                                   GDestroyNotify k_destroy_func,
                                   GType v_type,
                                   GBoxedCopyFunc v_dup_func,
                                   GDestroyNotify v_destroy_func,
                                   GeeMultiMap* multimap)
{
	GeeReadOnlyMultiMap * self = NULL;
	GeeMultiMap* _tmp0_;
	g_return_val_if_fail (multimap != NULL, NULL);
	self = (GeeReadOnlyMultiMap*) g_object_new (object_type, "k-type", k_type, "k-dup-func", k_dup_func, "k-destroy-func", k_destroy_func, "v-type", v_type, "v-dup-func", v_dup_func, "v-destroy-func", v_destroy_func, NULL);
	self->priv->k_type = k_type;
	self->priv->k_dup_func = k_dup_func;
	self->priv->k_destroy_func = k_destroy_func;
	self->priv->v_type = v_type;
	self->priv->v_dup_func = v_dup_func;
	self->priv->v_destroy_func = v_destroy_func;
	_tmp0_ = _g_object_ref0 (multimap);
	_g_object_unref0 (self->priv->_multimap);
	self->priv->_multimap = _tmp0_;
	return self;
}

 G_GNUC_INTERNAL GeeReadOnlyMultiMap*
gee_read_only_multi_map_new (GType k_type,
                             GBoxedCopyFunc k_dup_func,
                             GDestroyNotify k_destroy_func,
                             GType v_type,
                             GBoxedCopyFunc v_dup_func,
                             GDestroyNotify v_destroy_func,
                             GeeMultiMap* multimap)
{
	return gee_read_only_multi_map_construct (GEE_TYPE_READ_ONLY_MULTI_MAP, k_type, k_dup_func, k_destroy_func, v_type, v_dup_func, v_destroy_func, multimap);
}

/**
 * {@inheritDoc}
 */
static GeeSet*
gee_read_only_multi_map_real_get_keys (GeeMultiMap* base)
{
	GeeReadOnlyMultiMap * self;
	GeeMultiMap* _tmp0_;
	GeeSet* _tmp1_;
	GeeSet* result;
	self = (GeeReadOnlyMultiMap*) base;
	_tmp0_ = self->priv->_multimap;
	_tmp1_ = gee_multi_map_get_keys (_tmp0_);
	result = _tmp1_;
	return result;
}

/**
 * {@inheritDoc}
 */
static GeeMultiSet*
gee_read_only_multi_map_real_get_all_keys (GeeMultiMap* base)
{
	GeeReadOnlyMultiMap * self;
	GeeMultiMap* _tmp0_;
	GeeMultiSet* _tmp1_;
	GeeMultiSet* result;
	self = (GeeReadOnlyMultiMap*) base;
	_tmp0_ = self->priv->_multimap;
	_tmp1_ = gee_multi_map_get_all_keys (_tmp0_);
	result = _tmp1_;
	return result;
}

/**
 * {@inheritDoc}
 */
static GeeCollection*
gee_read_only_multi_map_real_get_values (GeeMultiMap* base)
{
	GeeReadOnlyMultiMap * self;
	GeeMultiMap* _tmp0_;
	GeeCollection* _tmp1_;
	GeeCollection* result;
	self = (GeeReadOnlyMultiMap*) base;
	_tmp0_ = self->priv->_multimap;
	_tmp1_ = gee_multi_map_get_values (_tmp0_);
	result = _tmp1_;
	return result;
}

/**
 * {@inheritDoc}
 */
static gboolean
gee_read_only_multi_map_real_contains (GeeMultiMap* base,
                                       gconstpointer key)
{
	GeeReadOnlyMultiMap * self;
	GeeMultiMap* _tmp0_;
	gboolean result;
	self = (GeeReadOnlyMultiMap*) base;
	_tmp0_ = self->priv->_multimap;
	result = gee_multi_map_contains (_tmp0_, key);
	return result;
}

/**
 * {@inheritDoc}
 */
static GeeCollection*
gee_read_only_multi_map_real_get (GeeMultiMap* base,
                                  gconstpointer key)
{
	GeeReadOnlyMultiMap * self;
	GeeMultiMap* _tmp0_;
	GeeCollection* _tmp1_;
	GeeCollection* result;
	self = (GeeReadOnlyMultiMap*) base;
	_tmp0_ = self->priv->_multimap;
	_tmp1_ = gee_multi_map_get (_tmp0_, key);
	result = _tmp1_;
	return result;
}

/**
 * {@inheritDoc}
 */
static void
gee_read_only_multi_map_real_set (GeeMultiMap* base,
                                  gconstpointer key,
                                  gconstpointer value)
{
	GeeReadOnlyMultiMap * self;
	self = (GeeReadOnlyMultiMap*) base;
	g_assert_not_reached ();
}

/**
 * {@inheritDoc}
 */
static gboolean
gee_read_only_multi_map_real_remove (GeeMultiMap* base,
                                     gconstpointer key,
                                     gconstpointer value)
{
	GeeReadOnlyMultiMap * self;
	self = (GeeReadOnlyMultiMap*) base;
	g_assert_not_reached ();
}

/**
 * {@inheritDoc}
 */
static gboolean
gee_read_only_multi_map_real_remove_all (GeeMultiMap* base,
                                         gconstpointer key)
{
	GeeReadOnlyMultiMap * self;
	self = (GeeReadOnlyMultiMap*) base;
	g_assert_not_reached ();
}

/**
 * {@inheritDoc}
 */
static void
gee_read_only_multi_map_real_clear (GeeMultiMap* base)
{
	GeeReadOnlyMultiMap * self;
	self = (GeeReadOnlyMultiMap*) base;
	g_assert_not_reached ();
}

/**
 * {@inheritDoc}
 */
static GeeMapIterator*
gee_read_only_multi_map_real_map_iterator (GeeMultiMap* base)
{
	GeeReadOnlyMultiMap * self;
	GeeMultiMap* _tmp0_;
	GeeMapIterator* _tmp1_;
	GeeMapIterator* _tmp2_;
	GeeReadOnlyMapMapIterator* _tmp3_;
	GeeMapIterator* _tmp4_;
	GeeMapIterator* result;
	self = (GeeReadOnlyMultiMap*) base;
	_tmp0_ = self->priv->_multimap;
	_tmp1_ = gee_multi_map_map_iterator (_tmp0_);
	_tmp2_ = _tmp1_;
	_tmp3_ = gee_read_only_map_map_iterator_new (self->priv->k_type, (GBoxedCopyFunc) self->priv->k_dup_func, (GDestroyNotify) self->priv->k_destroy_func, self->priv->v_type, (GBoxedCopyFunc) self->priv->v_dup_func, (GDestroyNotify) self->priv->v_destroy_func, _tmp2_);
	_tmp4_ = (GeeMapIterator*) _tmp3_;
	_g_object_unref0 (_tmp2_);
	result = _tmp4_;
	return result;
}

static gint
gee_read_only_multi_map_real_get_size (GeeMultiMap* base)
{
	gint result;
	GeeReadOnlyMultiMap* self;
	GeeMultiMap* _tmp0_;
	gint _tmp1_;
	gint _tmp2_;
	self = (GeeReadOnlyMultiMap*) base;
	_tmp0_ = self->priv->_multimap;
	_tmp1_ = gee_multi_map_get_size (_tmp0_);
	_tmp2_ = _tmp1_;
	result = _tmp2_;
	return result;
}

static gboolean
gee_read_only_multi_map_real_get_read_only (GeeMultiMap* base)
{
	gboolean result;
	GeeReadOnlyMultiMap* self;
	self = (GeeReadOnlyMultiMap*) base;
	result = TRUE;
	return result;
}

 G_GNUC_INTERNAL GeeMultiMap*
gee_read_only_multi_map_get_read_only_view (GeeReadOnlyMultiMap* self)
{
	GeeReadOnlyMultiMapClass* _klass_;
	g_return_val_if_fail (self != NULL, NULL);
	_klass_ = GEE_READ_ONLY_MULTI_MAP_GET_CLASS (self);
	if (_klass_->get_read_only_view) {
		return _klass_->get_read_only_view (self);
	}
	return NULL;
}

static GeeMultiMap*
gee_read_only_multi_map_real_get_read_only_view (GeeReadOnlyMultiMap* base)
{
	GeeMultiMap* result;
	GeeReadOnlyMultiMap* self;
	GeeMultiMap* _tmp0_;
	self = base;
	_tmp0_ = _g_object_ref0 ((GeeMultiMap*) self);
	result = _tmp0_;
	return result;
}

static void
gee_read_only_multi_map_class_init (GeeReadOnlyMultiMapClass * klass,
                                    gpointer klass_data)
{
	gee_read_only_multi_map_parent_class = g_type_class_peek_parent (klass);
	g_type_class_adjust_private_offset (klass, &GeeReadOnlyMultiMap_private_offset);
	GEE_READ_ONLY_MULTI_MAP_CLASS (klass)->get_read_only_view = gee_read_only_multi_map_real_get_read_only_view;
	G_OBJECT_CLASS (klass)->get_property = _vala_gee_read_only_multi_map_get_property;
	G_OBJECT_CLASS (klass)->set_property = _vala_gee_read_only_multi_map_set_property;
	G_OBJECT_CLASS (klass)->finalize = gee_read_only_multi_map_finalize;
	g_object_class_install_property (G_OBJECT_CLASS (klass), GEE_READ_ONLY_MULTI_MAP_K_TYPE, g_param_spec_gtype ("k-type", "type", "type", G_TYPE_NONE, G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GEE_READ_ONLY_MULTI_MAP_K_DUP_FUNC, g_param_spec_pointer ("k-dup-func", "dup func", "dup func", G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GEE_READ_ONLY_MULTI_MAP_K_DESTROY_FUNC, g_param_spec_pointer ("k-destroy-func", "destroy func", "destroy func", G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GEE_READ_ONLY_MULTI_MAP_V_TYPE, g_param_spec_gtype ("v-type", "type", "type", G_TYPE_NONE, G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GEE_READ_ONLY_MULTI_MAP_V_DUP_FUNC, g_param_spec_pointer ("v-dup-func", "dup func", "dup func", G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GEE_READ_ONLY_MULTI_MAP_V_DESTROY_FUNC, g_param_spec_pointer ("v-destroy-func", "destroy func", "destroy func", G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
	/**
	 * {@inheritDoc}
	 */
	g_object_class_install_property (G_OBJECT_CLASS (klass), GEE_READ_ONLY_MULTI_MAP_SIZE_PROPERTY, gee_read_only_multi_map_properties[GEE_READ_ONLY_MULTI_MAP_SIZE_PROPERTY] = g_param_spec_int ("size", "size", "size", G_MININT, G_MAXINT, 0, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE));
	/**
	 * {@inheritDoc}
	 */
	g_object_class_install_property (G_OBJECT_CLASS (klass), GEE_READ_ONLY_MULTI_MAP_READ_ONLY_PROPERTY, gee_read_only_multi_map_properties[GEE_READ_ONLY_MULTI_MAP_READ_ONLY_PROPERTY] = g_param_spec_boolean ("read-only", "read-only", "read-only", FALSE, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE));
}

static GType
gee_read_only_multi_map_gee_multi_map_get_k_type (GeeReadOnlyMultiMap* self)
{
	return self->priv->k_type;
}

static GBoxedCopyFunc
gee_read_only_multi_map_gee_multi_map_get_k_dup_func (GeeReadOnlyMultiMap* self)
{
	return self->priv->k_dup_func;
}

static GDestroyNotify
gee_read_only_multi_map_gee_multi_map_get_k_destroy_func (GeeReadOnlyMultiMap* self)
{
	return self->priv->k_destroy_func;
}

static GType
gee_read_only_multi_map_gee_multi_map_get_v_type (GeeReadOnlyMultiMap* self)
{
	return self->priv->v_type;
}

static GBoxedCopyFunc
gee_read_only_multi_map_gee_multi_map_get_v_dup_func (GeeReadOnlyMultiMap* self)
{
	return self->priv->v_dup_func;
}

static GDestroyNotify
gee_read_only_multi_map_gee_multi_map_get_v_destroy_func (GeeReadOnlyMultiMap* self)
{
	return self->priv->v_destroy_func;
}

static void
gee_read_only_multi_map_gee_multi_map_interface_init (GeeMultiMapIface * iface,
                                                      gpointer iface_data)
{
	gee_read_only_multi_map_gee_multi_map_parent_iface = g_type_interface_peek_parent (iface);
	iface->get_keys = (GeeSet* (*) (GeeMultiMap*)) gee_read_only_multi_map_real_get_keys;
	iface->get_all_keys = (GeeMultiSet* (*) (GeeMultiMap*)) gee_read_only_multi_map_real_get_all_keys;
	iface->get_values = (GeeCollection* (*) (GeeMultiMap*)) gee_read_only_multi_map_real_get_values;
	iface->contains = (gboolean (*) (GeeMultiMap*, gconstpointer)) gee_read_only_multi_map_real_contains;
	iface->get = (GeeCollection* (*) (GeeMultiMap*, gconstpointer)) gee_read_only_multi_map_real_get;
	iface->set = (void (*) (GeeMultiMap*, gconstpointer, gconstpointer)) gee_read_only_multi_map_real_set;
	iface->remove = (gboolean (*) (GeeMultiMap*, gconstpointer, gconstpointer)) gee_read_only_multi_map_real_remove;
	iface->remove_all = (gboolean (*) (GeeMultiMap*, gconstpointer)) gee_read_only_multi_map_real_remove_all;
	iface->clear = (void (*) (GeeMultiMap*)) gee_read_only_multi_map_real_clear;
	iface->map_iterator = (GeeMapIterator* (*) (GeeMultiMap*)) gee_read_only_multi_map_real_map_iterator;
	iface->get_k_type = (GType (*) (GeeMultiMap *)) gee_read_only_multi_map_gee_multi_map_get_k_type;
	iface->get_k_dup_func = (GBoxedCopyFunc (*) (GeeMultiMap *)) gee_read_only_multi_map_gee_multi_map_get_k_dup_func;
	iface->get_k_destroy_func = (GDestroyNotify (*) (GeeMultiMap *)) gee_read_only_multi_map_gee_multi_map_get_k_destroy_func;
	iface->get_v_type = (GType (*) (GeeMultiMap *)) gee_read_only_multi_map_gee_multi_map_get_v_type;
	iface->get_v_dup_func = (GBoxedCopyFunc (*) (GeeMultiMap *)) gee_read_only_multi_map_gee_multi_map_get_v_dup_func;
	iface->get_v_destroy_func = (GDestroyNotify (*) (GeeMultiMap *)) gee_read_only_multi_map_gee_multi_map_get_v_destroy_func;
	iface->get_size = gee_read_only_multi_map_real_get_size;
	iface->get_read_only = gee_read_only_multi_map_real_get_read_only;
	iface->get_read_only_view = (GeeMultiMap* (*) (GeeMultiMap *)) gee_read_only_multi_map_get_read_only_view;
}

static void
gee_read_only_multi_map_instance_init (GeeReadOnlyMultiMap * self,
                                       gpointer klass)
{
	self->priv = gee_read_only_multi_map_get_instance_private (self);
}

static void
gee_read_only_multi_map_finalize (GObject * obj)
{
	GeeReadOnlyMultiMap * self;
	self = G_TYPE_CHECK_INSTANCE_CAST (obj, GEE_TYPE_READ_ONLY_MULTI_MAP, GeeReadOnlyMultiMap);
	_g_object_unref0 (self->priv->_multimap);
	G_OBJECT_CLASS (gee_read_only_multi_map_parent_class)->finalize (obj);
}

/**
 * Read-only view for {@link MultiMap} collections.
 *
 * This class decorates any class which implements the {@link MultiMap}
 * interface by making it read only. Any method which normally modify data will
 * throw an error.
 *
 * @see MultiMap
 */
static GType
gee_read_only_multi_map_get_type_once (void)
{
	static const GTypeInfo g_define_type_info = { sizeof (GeeReadOnlyMultiMapClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) gee_read_only_multi_map_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (GeeReadOnlyMultiMap), 0, (GInstanceInitFunc) gee_read_only_multi_map_instance_init, NULL };
	static const GInterfaceInfo gee_multi_map_info = { (GInterfaceInitFunc) gee_read_only_multi_map_gee_multi_map_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
	GType gee_read_only_multi_map_type_id;
	gee_read_only_multi_map_type_id = g_type_register_static (G_TYPE_OBJECT, "GeeReadOnlyMultiMap", &g_define_type_info, 0);
	g_type_add_interface_static (gee_read_only_multi_map_type_id, GEE_TYPE_MULTI_MAP, &gee_multi_map_info);
	GeeReadOnlyMultiMap_private_offset = g_type_add_instance_private (gee_read_only_multi_map_type_id, sizeof (GeeReadOnlyMultiMapPrivate));
	return gee_read_only_multi_map_type_id;
}

 G_GNUC_INTERNAL GType
gee_read_only_multi_map_get_type (void)
{
	static volatile gsize gee_read_only_multi_map_type_id__once = 0;
	if (g_once_init_enter (&gee_read_only_multi_map_type_id__once)) {
		GType gee_read_only_multi_map_type_id;
		gee_read_only_multi_map_type_id = gee_read_only_multi_map_get_type_once ();
		g_once_init_leave (&gee_read_only_multi_map_type_id__once, gee_read_only_multi_map_type_id);
	}
	return gee_read_only_multi_map_type_id__once;
}

static void
_vala_gee_read_only_multi_map_get_property (GObject * object,
                                            guint property_id,
                                            GValue * value,
                                            GParamSpec * pspec)
{
	GeeReadOnlyMultiMap * self;
	self = G_TYPE_CHECK_INSTANCE_CAST (object, GEE_TYPE_READ_ONLY_MULTI_MAP, GeeReadOnlyMultiMap);
	switch (property_id) {
		case GEE_READ_ONLY_MULTI_MAP_SIZE_PROPERTY:
		g_value_set_int (value, gee_multi_map_get_size ((GeeMultiMap*) self));
		break;
		case GEE_READ_ONLY_MULTI_MAP_READ_ONLY_PROPERTY:
		g_value_set_boolean (value, gee_multi_map_get_read_only ((GeeMultiMap*) self));
		break;
		case GEE_READ_ONLY_MULTI_MAP_K_TYPE:
		g_value_set_gtype (value, self->priv->k_type);
		break;
		case GEE_READ_ONLY_MULTI_MAP_K_DUP_FUNC:
		g_value_set_pointer (value, self->priv->k_dup_func);
		break;
		case GEE_READ_ONLY_MULTI_MAP_K_DESTROY_FUNC:
		g_value_set_pointer (value, self->priv->k_destroy_func);
		break;
		case GEE_READ_ONLY_MULTI_MAP_V_TYPE:
		g_value_set_gtype (value, self->priv->v_type);
		break;
		case GEE_READ_ONLY_MULTI_MAP_V_DUP_FUNC:
		g_value_set_pointer (value, self->priv->v_dup_func);
		break;
		case GEE_READ_ONLY_MULTI_MAP_V_DESTROY_FUNC:
		g_value_set_pointer (value, self->priv->v_destroy_func);
		break;
		default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
		break;
	}
}

static void
_vala_gee_read_only_multi_map_set_property (GObject * object,
                                            guint property_id,
                                            const GValue * value,
                                            GParamSpec * pspec)
{
	GeeReadOnlyMultiMap * self;
	self = G_TYPE_CHECK_INSTANCE_CAST (object, GEE_TYPE_READ_ONLY_MULTI_MAP, GeeReadOnlyMultiMap);
	switch (property_id) {
		case GEE_READ_ONLY_MULTI_MAP_K_TYPE:
		self->priv->k_type = g_value_get_gtype (value);
		break;
		case GEE_READ_ONLY_MULTI_MAP_K_DUP_FUNC:
		self->priv->k_dup_func = g_value_get_pointer (value);
		break;
		case GEE_READ_ONLY_MULTI_MAP_K_DESTROY_FUNC:
		self->priv->k_destroy_func = g_value_get_pointer (value);
		break;
		case GEE_READ_ONLY_MULTI_MAP_V_TYPE:
		self->priv->v_type = g_value_get_gtype (value);
		break;
		case GEE_READ_ONLY_MULTI_MAP_V_DUP_FUNC:
		self->priv->v_dup_func = g_value_get_pointer (value);
		break;
		case GEE_READ_ONLY_MULTI_MAP_V_DESTROY_FUNC:
		self->priv->v_destroy_func = g_value_get_pointer (value);
		break;
		default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
		break;
	}
}

