diff options
Diffstat (limited to 'gee/treemultimap.c')
-rw-r--r-- | gee/treemultimap.c | 420 |
1 files changed, 310 insertions, 110 deletions
diff --git a/gee/treemultimap.c b/gee/treemultimap.c index 7fe5cd7..27eaa00 100644 --- a/gee/treemultimap.c +++ b/gee/treemultimap.c @@ -35,13 +35,25 @@ typedef struct _GeeMultiMap GeeMultiMap; typedef struct _GeeMultiMapIface GeeMultiMapIface; -#define GEE_TYPE_ITERABLE (gee_iterable_get_type ()) -#define GEE_ITERABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_ITERABLE, GeeIterable)) -#define GEE_IS_ITERABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEE_TYPE_ITERABLE)) -#define GEE_ITERABLE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GEE_TYPE_ITERABLE, GeeIterableIface)) +#define GEE_TYPE_TRAVERSABLE (gee_traversable_get_type ()) +#define GEE_TRAVERSABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_TRAVERSABLE, GeeTraversable)) +#define GEE_IS_TRAVERSABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEE_TYPE_TRAVERSABLE)) +#define GEE_TRAVERSABLE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GEE_TYPE_TRAVERSABLE, GeeTraversableIface)) -typedef struct _GeeIterable GeeIterable; -typedef struct _GeeIterableIface GeeIterableIface; +typedef struct _GeeTraversable GeeTraversable; +typedef struct _GeeTraversableIface GeeTraversableIface; + +#define GEE_TRAVERSABLE_TYPE_STREAM (gee_traversable_stream_get_type ()) + +#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; #define GEE_TYPE_ITERATOR (gee_iterator_get_type ()) #define GEE_ITERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_ITERATOR, GeeIterator)) @@ -51,6 +63,14 @@ typedef struct _GeeIterableIface GeeIterableIface; typedef struct _GeeIterator GeeIterator; typedef struct _GeeIteratorIface GeeIteratorIface; +#define GEE_TYPE_ITERABLE (gee_iterable_get_type ()) +#define GEE_ITERABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_ITERABLE, GeeIterable)) +#define GEE_IS_ITERABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEE_TYPE_ITERABLE)) +#define GEE_ITERABLE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GEE_TYPE_ITERABLE, GeeIterableIface)) + +typedef struct _GeeIterable GeeIterable; +typedef struct _GeeIterableIface GeeIterableIface; + #define GEE_TYPE_COLLECTION (gee_collection_get_type ()) #define GEE_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_COLLECTION, GeeCollection)) #define GEE_IS_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEE_TYPE_COLLECTION)) @@ -75,6 +95,14 @@ typedef struct _GeeSetIface GeeSetIface; typedef struct _GeeMultiSet GeeMultiSet; typedef struct _GeeMultiSetIface GeeMultiSetIface; +#define GEE_TYPE_MAP_ITERATOR (gee_map_iterator_get_type ()) +#define GEE_MAP_ITERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_MAP_ITERATOR, GeeMapIterator)) +#define GEE_IS_MAP_ITERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEE_TYPE_MAP_ITERATOR)) +#define GEE_MAP_ITERATOR_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GEE_TYPE_MAP_ITERATOR, GeeMapIteratorIface)) + +typedef struct _GeeMapIterator GeeMapIterator; +typedef struct _GeeMapIteratorIface GeeMapIteratorIface; + #define GEE_TYPE_ABSTRACT_MULTI_MAP (gee_abstract_multi_map_get_type ()) #define GEE_ABSTRACT_MULTI_MAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_ABSTRACT_MULTI_MAP, GeeAbstractMultiMap)) #define GEE_ABSTRACT_MULTI_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEE_TYPE_ABSTRACT_MULTI_MAP, GeeAbstractMultiMapClass)) @@ -94,14 +122,6 @@ typedef struct _GeeAbstractMultiMapPrivate GeeAbstractMultiMapPrivate; typedef struct _GeeMap GeeMap; typedef struct _GeeMapIface GeeMapIface; -#define GEE_TYPE_MAP_ITERATOR (gee_map_iterator_get_type ()) -#define GEE_MAP_ITERATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_MAP_ITERATOR, GeeMapIterator)) -#define GEE_IS_MAP_ITERATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEE_TYPE_MAP_ITERATOR)) -#define GEE_MAP_ITERATOR_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GEE_TYPE_MAP_ITERATOR, GeeMapIteratorIface)) - -typedef struct _GeeMapIterator GeeMapIterator; -typedef struct _GeeMapIteratorIface GeeMapIteratorIface; - #define GEE_MAP_TYPE_ENTRY (gee_map_entry_get_type ()) #define GEE_MAP_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_MAP_TYPE_ENTRY, GeeMapEntry)) #define GEE_MAP_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEE_MAP_TYPE_ENTRY, GeeMapEntryClass)) @@ -133,6 +153,26 @@ typedef struct _GeeTreeMultiMapPrivate GeeTreeMultiMapPrivate; typedef struct _GeeAbstractMap GeeAbstractMap; typedef struct _GeeAbstractMapClass GeeAbstractMapClass; +#define GEE_TYPE_ABSTRACT_SORTED_MAP (gee_abstract_sorted_map_get_type ()) +#define GEE_ABSTRACT_SORTED_MAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_ABSTRACT_SORTED_MAP, GeeAbstractSortedMap)) +#define GEE_ABSTRACT_SORTED_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEE_TYPE_ABSTRACT_SORTED_MAP, GeeAbstractSortedMapClass)) +#define GEE_IS_ABSTRACT_SORTED_MAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEE_TYPE_ABSTRACT_SORTED_MAP)) +#define GEE_IS_ABSTRACT_SORTED_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GEE_TYPE_ABSTRACT_SORTED_MAP)) +#define GEE_ABSTRACT_SORTED_MAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GEE_TYPE_ABSTRACT_SORTED_MAP, GeeAbstractSortedMapClass)) + +typedef struct _GeeAbstractSortedMap GeeAbstractSortedMap; +typedef struct _GeeAbstractSortedMapClass GeeAbstractSortedMapClass; + +#define GEE_TYPE_ABSTRACT_BIDIR_SORTED_MAP (gee_abstract_bidir_sorted_map_get_type ()) +#define GEE_ABSTRACT_BIDIR_SORTED_MAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_ABSTRACT_BIDIR_SORTED_MAP, GeeAbstractBidirSortedMap)) +#define GEE_ABSTRACT_BIDIR_SORTED_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEE_TYPE_ABSTRACT_BIDIR_SORTED_MAP, GeeAbstractBidirSortedMapClass)) +#define GEE_IS_ABSTRACT_BIDIR_SORTED_MAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEE_TYPE_ABSTRACT_BIDIR_SORTED_MAP)) +#define GEE_IS_ABSTRACT_BIDIR_SORTED_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GEE_TYPE_ABSTRACT_BIDIR_SORTED_MAP)) +#define GEE_ABSTRACT_BIDIR_SORTED_MAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GEE_TYPE_ABSTRACT_BIDIR_SORTED_MAP, GeeAbstractBidirSortedMapClass)) + +typedef struct _GeeAbstractBidirSortedMap GeeAbstractBidirSortedMap; +typedef struct _GeeAbstractBidirSortedMapClass GeeAbstractBidirSortedMapClass; + #define GEE_TYPE_TREE_MAP (gee_tree_map_get_type ()) #define GEE_TREE_MAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_TREE_MAP, GeeTreeMap)) #define GEE_TREE_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEE_TYPE_TREE_MAP, GeeTreeMapClass)) @@ -164,6 +204,26 @@ typedef struct _GeeAbstractCollectionClass GeeAbstractCollectionClass; typedef struct _GeeAbstractSet GeeAbstractSet; typedef struct _GeeAbstractSetClass GeeAbstractSetClass; +#define GEE_TYPE_ABSTRACT_SORTED_SET (gee_abstract_sorted_set_get_type ()) +#define GEE_ABSTRACT_SORTED_SET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_ABSTRACT_SORTED_SET, GeeAbstractSortedSet)) +#define GEE_ABSTRACT_SORTED_SET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEE_TYPE_ABSTRACT_SORTED_SET, GeeAbstractSortedSetClass)) +#define GEE_IS_ABSTRACT_SORTED_SET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEE_TYPE_ABSTRACT_SORTED_SET)) +#define GEE_IS_ABSTRACT_SORTED_SET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GEE_TYPE_ABSTRACT_SORTED_SET)) +#define GEE_ABSTRACT_SORTED_SET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GEE_TYPE_ABSTRACT_SORTED_SET, GeeAbstractSortedSetClass)) + +typedef struct _GeeAbstractSortedSet GeeAbstractSortedSet; +typedef struct _GeeAbstractSortedSetClass GeeAbstractSortedSetClass; + +#define GEE_TYPE_ABSTRACT_BIDIR_SORTED_SET (gee_abstract_bidir_sorted_set_get_type ()) +#define GEE_ABSTRACT_BIDIR_SORTED_SET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_ABSTRACT_BIDIR_SORTED_SET, GeeAbstractBidirSortedSet)) +#define GEE_ABSTRACT_BIDIR_SORTED_SET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEE_TYPE_ABSTRACT_BIDIR_SORTED_SET, GeeAbstractBidirSortedSetClass)) +#define GEE_IS_ABSTRACT_BIDIR_SORTED_SET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GEE_TYPE_ABSTRACT_BIDIR_SORTED_SET)) +#define GEE_IS_ABSTRACT_BIDIR_SORTED_SET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GEE_TYPE_ABSTRACT_BIDIR_SORTED_SET)) +#define GEE_ABSTRACT_BIDIR_SORTED_SET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GEE_TYPE_ABSTRACT_BIDIR_SORTED_SET, GeeAbstractBidirSortedSetClass)) + +typedef struct _GeeAbstractBidirSortedSet GeeAbstractBidirSortedSet; +typedef struct _GeeAbstractBidirSortedSetClass GeeAbstractBidirSortedSetClass; + #define GEE_TYPE_TREE_SET (gee_tree_set_get_type ()) #define GEE_TREE_SET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GEE_TYPE_TREE_SET, GeeTreeSet)) #define GEE_TREE_SET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GEE_TYPE_TREE_SET, GeeTreeSetClass)) @@ -194,23 +254,55 @@ typedef struct _GeeAbstractMultiSetClass GeeAbstractMultiSetClass; typedef struct _GeeTreeMultiSet GeeTreeMultiSet; typedef struct _GeeTreeMultiSetClass GeeTreeMultiSetClass; +typedef gboolean (*GeeForallFunc) (gpointer g, void* user_data); +typedef enum { + GEE_TRAVERSABLE_STREAM_YIELD, + GEE_TRAVERSABLE_STREAM_CONTINUE, + GEE_TRAVERSABLE_STREAM_END +} GeeTraversableStream; + +typedef GeeTraversableStream (*GeeStreamFunc) (GeeTraversableStream state, GeeLazy* g, GeeLazy** lazy, void* user_data); struct _GeeIteratorIface { GTypeInterface parent_iface; gboolean (*next) (GeeIterator* self); gboolean (*has_next) (GeeIterator* self); - gboolean (*first) (GeeIterator* self); gpointer (*get) (GeeIterator* self); void (*remove) (GeeIterator* self); + gboolean (*get_valid) (GeeIterator* self); + gboolean (*get_read_only) (GeeIterator* self); +}; + +typedef gpointer (*GeeFoldFunc) (gpointer g, gpointer a, void* user_data); +typedef gpointer (*GeeMapFunc) (gpointer g, void* user_data); +typedef gboolean (*GeePredicate) (gconstpointer g, void* user_data); +struct _GeeTraversableIface { + GTypeInterface parent_iface; + GType (*get_g_type) (GeeTraversable* self); + GBoxedCopyFunc (*get_g_dup_func) (GeeTraversable* self); + GDestroyNotify (*get_g_destroy_func) (GeeTraversable* self); + gboolean (*foreach) (GeeTraversable* self, GeeForallFunc f, void* f_target); + GeeIterator* (*stream) (GeeTraversable* self, GType a_type, GBoxedCopyFunc a_dup_func, GDestroyNotify a_destroy_func, GeeStreamFunc f, void* f_target, GDestroyNotify f_target_destroy_notify); + gpointer (*fold) (GeeTraversable* self, GType a_type, GBoxedCopyFunc a_dup_func, GDestroyNotify a_destroy_func, GeeFoldFunc f, void* f_target, gpointer seed); + GeeIterator* (*map) (GeeTraversable* self, GType a_type, GBoxedCopyFunc a_dup_func, GDestroyNotify a_destroy_func, GeeMapFunc f, void* f_target); + GeeIterator* (*scan) (GeeTraversable* self, GType a_type, GBoxedCopyFunc a_dup_func, GDestroyNotify a_destroy_func, GeeFoldFunc f, void* f_target, gpointer seed); + GeeIterator* (*filter) (GeeTraversable* self, GeePredicate pred, void* pred_target, GDestroyNotify pred_target_destroy_notify); + GeeIterator* (*chop) (GeeTraversable* self, gint offset, gint length); + GType (*get_element_type) (GeeTraversable* self); }; struct _GeeIterableIface { GTypeInterface parent_iface; + GType (*get_g_type) (GeeIterable* self); + GBoxedCopyFunc (*get_g_dup_func) (GeeIterable* self); + GDestroyNotify (*get_g_destroy_func) (GeeIterable* self); GeeIterator* (*iterator) (GeeIterable* self); - GType (*get_element_type) (GeeIterable* self); }; struct _GeeCollectionIface { GTypeInterface parent_iface; + GType (*get_g_type) (GeeCollection* self); + GBoxedCopyFunc (*get_g_dup_func) (GeeCollection* self); + GDestroyNotify (*get_g_destroy_func) (GeeCollection* self); gboolean (*contains) (GeeCollection* self, gconstpointer item); gboolean (*add) (GeeCollection* self, gconstpointer item); gboolean (*remove) (GeeCollection* self, gconstpointer item); @@ -222,21 +314,58 @@ struct _GeeCollectionIface { gpointer* (*to_array) (GeeCollection* self, int* result_length1); gint (*get_size) (GeeCollection* self); gboolean (*get_is_empty) (GeeCollection* self); + gboolean (*get_read_only) (GeeCollection* self); GeeCollection* (*get_read_only_view) (GeeCollection* self); }; struct _GeeSetIface { GTypeInterface parent_iface; + GType (*get_g_type) (GeeSet* self); + GBoxedCopyFunc (*get_g_dup_func) (GeeSet* self); + GDestroyNotify (*get_g_destroy_func) (GeeSet* self); GeeSet* (*get_read_only_view) (GeeSet* self); }; struct _GeeMultiSetIface { GTypeInterface parent_iface; + GType (*get_g_type) (GeeMultiSet* self); + GBoxedCopyFunc (*get_g_dup_func) (GeeMultiSet* self); + GDestroyNotify (*get_g_destroy_func) (GeeMultiSet* self); gint (*count) (GeeMultiSet* self, gconstpointer item); + GeeMultiSet* (*get_read_only_view) (GeeMultiSet* self); +}; + +typedef gpointer (*GeeFoldMapFunc) (gconstpointer k, gconstpointer v, gpointer a, void* user_data); +typedef gboolean (*GeeForallMapFunc) (gconstpointer k, gconstpointer v, void* user_data); +struct _GeeMapIteratorIface { + GTypeInterface parent_iface; + GType (*get_k_type) (GeeMapIterator* self); + GBoxedCopyFunc (*get_k_dup_func) (GeeMapIterator* self); + GDestroyNotify (*get_k_destroy_func) (GeeMapIterator* self); + GType (*get_v_type) (GeeMapIterator* self); + GBoxedCopyFunc (*get_v_dup_func) (GeeMapIterator* self); + GDestroyNotify (*get_v_destroy_func) (GeeMapIterator* self); + gboolean (*next) (GeeMapIterator* self); + gboolean (*has_next) (GeeMapIterator* self); + gpointer (*get_key) (GeeMapIterator* self); + gpointer (*get_value) (GeeMapIterator* self); + void (*set_value) (GeeMapIterator* self, gconstpointer value); + void (*unset) (GeeMapIterator* self); + gpointer (*fold) (GeeMapIterator* self, GType a_type, GBoxedCopyFunc a_dup_func, GDestroyNotify a_destroy_func, GeeFoldMapFunc f, void* f_target, gpointer seed); + gboolean (*foreach) (GeeMapIterator* self, GeeForallMapFunc f, void* f_target); + gboolean (*get_valid) (GeeMapIterator* self); + gboolean (*get_mutable) (GeeMapIterator* self); + gboolean (*get_read_only) (GeeMapIterator* self); }; struct _GeeMultiMapIface { GTypeInterface parent_iface; + GType (*get_k_type) (GeeMultiMap* self); + GBoxedCopyFunc (*get_k_dup_func) (GeeMultiMap* self); + GDestroyNotify (*get_k_destroy_func) (GeeMultiMap* self); + GType (*get_v_type) (GeeMultiMap* self); + GBoxedCopyFunc (*get_v_dup_func) (GeeMultiMap* self); + GDestroyNotify (*get_v_destroy_func) (GeeMultiMap* self); GeeSet* (*get_keys) (GeeMultiMap* self); GeeMultiSet* (*get_all_keys) (GeeMultiMap* self); GeeCollection* (*get_values) (GeeMultiMap* self); @@ -246,44 +375,38 @@ struct _GeeMultiMapIface { gboolean (*remove) (GeeMultiMap* self, gconstpointer key, gconstpointer value); gboolean (*remove_all) (GeeMultiMap* self, gconstpointer key); void (*clear) (GeeMultiMap* self); + GeeMapIterator* (*map_iterator) (GeeMultiMap* self); gint (*get_size) (GeeMultiMap* self); + gboolean (*get_read_only) (GeeMultiMap* self); + GeeMultiMap* (*get_read_only_view) (GeeMultiMap* self); }; -struct _GeeMapIteratorIface { - GTypeInterface parent_iface; - gboolean (*next) (GeeMapIterator* self); - gboolean (*has_next) (GeeMapIterator* self); - gboolean (*first) (GeeMapIterator* self); - gpointer (*get_key) (GeeMapIterator* self); - gpointer (*get_value) (GeeMapIterator* self); - void (*set_value) (GeeMapIterator* self, gconstpointer value); - void (*unset) (GeeMapIterator* self); -}; - +typedef gboolean (*GeeEqualDataFunc) (gconstpointer a, gconstpointer b, void* user_data); struct _GeeMapIface { GTypeInterface parent_iface; + GType (*get_k_type) (GeeMap* self); + GBoxedCopyFunc (*get_k_dup_func) (GeeMap* self); + GDestroyNotify (*get_k_destroy_func) (GeeMap* self); + GType (*get_v_type) (GeeMap* self); + GBoxedCopyFunc (*get_v_dup_func) (GeeMap* self); + GDestroyNotify (*get_v_destroy_func) (GeeMap* self); gboolean (*has_key) (GeeMap* self, gconstpointer key); - gboolean (*contains) (GeeMap* self, gconstpointer key); gboolean (*has) (GeeMap* self, gconstpointer key, gconstpointer value); gpointer (*get) (GeeMap* self, gconstpointer key); void (*set) (GeeMap* self, gconstpointer key, gconstpointer value); gboolean (*unset) (GeeMap* self, gconstpointer key, gpointer* value); - gboolean (*remove) (GeeMap* self, gconstpointer key, gpointer* value); void (*clear) (GeeMap* self); GeeMapIterator* (*map_iterator) (GeeMap* self); void (*set_all) (GeeMap* self, GeeMap* map); gboolean (*unset_all) (GeeMap* self, GeeMap* map); - gboolean (*remove_all) (GeeMap* self, GeeMap* map); gboolean (*has_all) (GeeMap* self, GeeMap* map); - gboolean (*contains_all) (GeeMap* self, GeeMap* map); gint (*get_size) (GeeMap* self); gboolean (*get_is_empty) (GeeMap* self); + gboolean (*get_read_only) (GeeMap* self); GeeSet* (*get_keys) (GeeMap* self); GeeCollection* (*get_values) (GeeMap* self); GeeSet* (*get_entries) (GeeMap* self); GeeMap* (*get_read_only_view) (GeeMap* self); - GType (*get_key_type) (GeeMap* self); - GType (*get_value_type) (GeeMap* self); }; struct _GeeAbstractMultiMap { @@ -296,7 +419,17 @@ struct _GeeAbstractMultiMapClass { GObjectClass parent_class; GeeCollection* (*create_value_storage) (GeeAbstractMultiMap* self); GeeMultiSet* (*create_multi_key_set) (GeeAbstractMultiMap* self); - GEqualFunc (*get_value_equal_func) (GeeAbstractMultiMap* self); + GeeEqualDataFunc (*get_value_equal_func) (GeeAbstractMultiMap* self, void** result_target, GDestroyNotify* result_target_destroy_notify); + void (*reserved0) (GeeAbstractMultiMap* self); + void (*reserved1) (GeeAbstractMultiMap* self); + void (*reserved2) (GeeAbstractMultiMap* self); + void (*reserved3) (GeeAbstractMultiMap* self); + void (*reserved4) (GeeAbstractMultiMap* self); + void (*reserved5) (GeeAbstractMultiMap* self); + void (*reserved6) (GeeAbstractMultiMap* self); + void (*reserved7) (GeeAbstractMultiMap* self); + void (*reserved8) (GeeAbstractMultiMap* self); + GeeMultiMap* (*get_read_only_view) (GeeAbstractMultiMap* self); }; struct _GeeTreeMultiMap { @@ -315,20 +448,31 @@ struct _GeeTreeMultiMapPrivate { GType v_type; GBoxedCopyFunc v_dup_func; GDestroyNotify v_destroy_func; - GCompareFunc _value_compare_func; + GCompareDataFunc _value_compare_func; + gpointer _value_compare_func_target; + GDestroyNotify _value_compare_func_target_destroy_notify; }; static gpointer gee_tree_multi_map_parent_class = NULL; +GType gee_traversable_stream_get_type (void) G_GNUC_CONST; +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; GType gee_iterator_get_type (void) G_GNUC_CONST; +GType gee_traversable_get_type (void) G_GNUC_CONST; GType gee_iterable_get_type (void) G_GNUC_CONST; GType gee_collection_get_type (void) G_GNUC_CONST; GType gee_set_get_type (void) G_GNUC_CONST; GType gee_multi_set_get_type (void) G_GNUC_CONST; +GType gee_map_iterator_get_type (void) G_GNUC_CONST; GType gee_multi_map_get_type (void) G_GNUC_CONST; GType gee_abstract_multi_map_get_type (void) G_GNUC_CONST; -GType gee_map_iterator_get_type (void) G_GNUC_CONST; GType gee_map_entry_get_type (void) G_GNUC_CONST; GType gee_map_get_type (void) G_GNUC_CONST; GType gee_tree_multi_map_get_type (void) G_GNUC_CONST; @@ -340,35 +484,37 @@ enum { GEE_TREE_MULTI_MAP_K_DESTROY_FUNC, GEE_TREE_MULTI_MAP_V_TYPE, GEE_TREE_MULTI_MAP_V_DUP_FUNC, - GEE_TREE_MULTI_MAP_V_DESTROY_FUNC, - GEE_TREE_MULTI_MAP_KEY_COMPARE_FUNC, - GEE_TREE_MULTI_MAP_VALUE_COMPARE_FUNC + GEE_TREE_MULTI_MAP_V_DESTROY_FUNC }; -GeeTreeMultiMap* gee_tree_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, GCompareFunc key_compare_func, GCompareFunc value_compare_func); -GeeTreeMultiMap* gee_tree_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, GCompareFunc key_compare_func, GCompareFunc value_compare_func); -GeeTreeMap* gee_tree_map_new (GType k_type, GBoxedCopyFunc k_dup_func, GDestroyNotify k_destroy_func, GType v_type, GBoxedCopyFunc v_dup_func, GDestroyNotify v_destroy_func, GCompareFunc key_compare_func, GEqualFunc value_equal_func); -GeeTreeMap* gee_tree_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, GCompareFunc key_compare_func, GEqualFunc value_equal_func); +GeeTreeMultiMap* gee_tree_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, GCompareDataFunc key_compare_func, void* key_compare_func_target, GDestroyNotify key_compare_func_target_destroy_notify, GCompareDataFunc value_compare_func, void* value_compare_func_target, GDestroyNotify value_compare_func_target_destroy_notify); +GeeTreeMultiMap* gee_tree_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, GCompareDataFunc key_compare_func, void* key_compare_func_target, GDestroyNotify key_compare_func_target_destroy_notify, GCompareDataFunc value_compare_func, void* value_compare_func_target, GDestroyNotify value_compare_func_target_destroy_notify); +GeeEqualDataFunc gee_functions_get_equal_func_for (GType t, void** result_target, GDestroyNotify* result_target_destroy_notify); +GeeTreeMap* gee_tree_map_new (GType k_type, GBoxedCopyFunc k_dup_func, GDestroyNotify k_destroy_func, GType v_type, GBoxedCopyFunc v_dup_func, GDestroyNotify v_destroy_func, GCompareDataFunc key_compare_func, void* key_compare_func_target, GDestroyNotify key_compare_func_target_destroy_notify, GeeEqualDataFunc value_equal_func, void* value_equal_func_target, GDestroyNotify value_equal_func_target_destroy_notify); +GeeTreeMap* gee_tree_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, GCompareDataFunc key_compare_func, void* key_compare_func_target, GDestroyNotify key_compare_func_target_destroy_notify, GeeEqualDataFunc value_equal_func, void* value_equal_func_target, GDestroyNotify value_equal_func_target_destroy_notify); GType gee_abstract_map_get_type (void) G_GNUC_CONST; +GType gee_abstract_sorted_map_get_type (void) G_GNUC_CONST; +GType gee_abstract_bidir_sorted_map_get_type (void) G_GNUC_CONST; GType gee_tree_map_get_type (void) G_GNUC_CONST; GeeAbstractMultiMap* gee_abstract_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, GeeMap* storage_map); -GCompareFunc gee_functions_get_compare_func_for (GType t); -static void gee_tree_multi_map_set_value_compare_func (GeeTreeMultiMap* self, GCompareFunc value); +GCompareDataFunc gee_functions_get_compare_func_for (GType t, void** result_target, GDestroyNotify* result_target_destroy_notify); +static void gee_tree_multi_map_set_value_compare_func (GeeTreeMultiMap* self, GCompareDataFunc value, gpointer value_target); static GeeCollection* gee_tree_multi_map_real_create_value_storage (GeeAbstractMultiMap* base); -GeeTreeSet* gee_tree_set_new (GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, GCompareFunc compare_func); -GeeTreeSet* gee_tree_set_construct (GType object_type, GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, GCompareFunc compare_func); +GeeTreeSet* gee_tree_set_new (GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, GCompareDataFunc compare_func, void* compare_func_target, GDestroyNotify compare_func_target_destroy_notify); +GeeTreeSet* gee_tree_set_construct (GType object_type, GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, GCompareDataFunc compare_func, void* compare_func_target, GDestroyNotify compare_func_target_destroy_notify); GType gee_abstract_collection_get_type (void) G_GNUC_CONST; GType gee_abstract_set_get_type (void) G_GNUC_CONST; +GType gee_abstract_sorted_set_get_type (void) G_GNUC_CONST; +GType gee_abstract_bidir_sorted_set_get_type (void) G_GNUC_CONST; GType gee_tree_set_get_type (void) G_GNUC_CONST; static GeeMultiSet* gee_tree_multi_map_real_create_multi_key_set (GeeAbstractMultiMap* base); -GCompareFunc gee_tree_multi_map_get_key_compare_func (GeeTreeMultiMap* self); -GeeTreeMultiSet* gee_tree_multi_set_new (GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, GCompareFunc compare_func); -GeeTreeMultiSet* gee_tree_multi_set_construct (GType object_type, GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, GCompareFunc compare_func); +GCompareDataFunc gee_tree_multi_map_get_key_compare_func (GeeTreeMultiMap* self, gpointer* result_target); +GeeTreeMultiSet* gee_tree_multi_set_new (GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, GCompareDataFunc compare_func, void* compare_func_target, GDestroyNotify compare_func_target_destroy_notify); +GeeTreeMultiSet* gee_tree_multi_set_construct (GType object_type, GType g_type, GBoxedCopyFunc g_dup_func, GDestroyNotify g_destroy_func, GCompareDataFunc compare_func, void* compare_func_target, GDestroyNotify compare_func_target_destroy_notify); GType gee_abstract_multi_set_get_type (void) G_GNUC_CONST; GType gee_tree_multi_set_get_type (void) G_GNUC_CONST; -static GEqualFunc gee_tree_multi_map_real_get_value_equal_func (GeeAbstractMultiMap* base); -GEqualFunc gee_functions_get_equal_func_for (GType t); -GCompareFunc gee_tree_map_get_key_compare_func (GeeTreeMap* self); -GCompareFunc gee_tree_multi_map_get_value_compare_func (GeeTreeMultiMap* self); +static GeeEqualDataFunc gee_tree_multi_map_real_get_value_equal_func (GeeAbstractMultiMap* base, void** result_target, GDestroyNotify* result_target_destroy_notify); +GCompareDataFunc gee_tree_map_get_key_compare_func (GeeTreeMap* self, gpointer* result_target); +GCompareDataFunc gee_tree_multi_map_get_value_compare_func (GeeTreeMultiMap* self, gpointer* result_target); static void gee_tree_multi_map_finalize (GObject* obj); static void _vala_gee_tree_multi_map_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec); static void _vala_gee_tree_multi_map_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec); @@ -383,51 +529,77 @@ static void _vala_gee_tree_multi_map_set_property (GObject * object, guint prope * @param key_compare_func an optional key comparator function * @param value_compare_func an optional value comparator function */ -GeeTreeMultiMap* gee_tree_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, GCompareFunc key_compare_func, GCompareFunc value_compare_func) { +GeeTreeMultiMap* gee_tree_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, GCompareDataFunc key_compare_func, void* key_compare_func_target, GDestroyNotify key_compare_func_target_destroy_notify, GCompareDataFunc value_compare_func, void* value_compare_func_target, GDestroyNotify value_compare_func_target_destroy_notify) { GeeTreeMultiMap * self = NULL; - GCompareFunc _tmp0_; - GEqualFunc _tmp1_; - GeeTreeMap* _tmp2_; - GeeTreeMap* _tmp3_; - GCompareFunc _tmp4_; - GCompareFunc _tmp6_; + GCompareDataFunc _tmp0_; + void* _tmp0__target; + void* _tmp1_ = NULL; + GDestroyNotify _tmp2_ = NULL; + GeeEqualDataFunc _tmp3_ = NULL; + GeeTreeMap* _tmp4_; + GeeTreeMap* _tmp5_; + GCompareDataFunc _tmp6_; + void* _tmp6__target; + GCompareDataFunc _tmp10_; + void* _tmp10__target; _tmp0_ = key_compare_func; - _tmp1_ = g_direct_equal; - _tmp2_ = gee_tree_map_new (k_type, (GBoxedCopyFunc) k_dup_func, k_destroy_func, GEE_TYPE_SET, (GBoxedCopyFunc) g_object_ref, g_object_unref, _tmp0_, _tmp1_); - _tmp3_ = _tmp2_; - self = (GeeTreeMultiMap*) gee_abstract_multi_map_construct (object_type, k_type, (GBoxedCopyFunc) k_dup_func, k_destroy_func, v_type, (GBoxedCopyFunc) v_dup_func, v_destroy_func, (GeeMap*) _tmp3_); + _tmp0__target = key_compare_func_target; + _tmp3_ = gee_functions_get_equal_func_for (GEE_TYPE_SET, &_tmp1_, &_tmp2_); + _tmp4_ = gee_tree_map_new (k_type, (GBoxedCopyFunc) k_dup_func, k_destroy_func, GEE_TYPE_SET, (GBoxedCopyFunc) g_object_ref, g_object_unref, _tmp0_, _tmp0__target, NULL, _tmp3_, _tmp1_, _tmp2_); + _tmp5_ = _tmp4_; + self = (GeeTreeMultiMap*) gee_abstract_multi_map_construct (object_type, k_type, (GBoxedCopyFunc) k_dup_func, k_destroy_func, v_type, (GBoxedCopyFunc) v_dup_func, v_destroy_func, (GeeMap*) _tmp5_); 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; - _g_object_unref0 (_tmp3_); - _tmp4_ = value_compare_func; - if (_tmp4_ == NULL) { - GCompareFunc _tmp5_ = NULL; - _tmp5_ = gee_functions_get_compare_func_for (v_type); - value_compare_func = _tmp5_; - } + _g_object_unref0 (_tmp5_); _tmp6_ = value_compare_func; - gee_tree_multi_map_set_value_compare_func (self, _tmp6_); + _tmp6__target = value_compare_func_target; + if (_tmp6_ == NULL) { + void* _tmp7_ = NULL; + GDestroyNotify _tmp8_ = NULL; + GCompareDataFunc _tmp9_ = NULL; + _tmp9_ = gee_functions_get_compare_func_for (v_type, &_tmp7_, &_tmp8_); + (value_compare_func_target_destroy_notify == NULL) ? NULL : (value_compare_func_target_destroy_notify (value_compare_func_target), NULL); + value_compare_func = NULL; + value_compare_func_target = NULL; + value_compare_func_target_destroy_notify = NULL; + value_compare_func = _tmp9_; + value_compare_func_target = _tmp7_; + value_compare_func_target_destroy_notify = _tmp8_; + } + _tmp10_ = value_compare_func; + _tmp10__target = value_compare_func_target; + gee_tree_multi_map_set_value_compare_func (self, _tmp10_, _tmp10__target); + (key_compare_func_target_destroy_notify == NULL) ? NULL : (key_compare_func_target_destroy_notify (key_compare_func_target), NULL); + key_compare_func = NULL; + key_compare_func_target = NULL; + key_compare_func_target_destroy_notify = NULL; + (value_compare_func_target_destroy_notify == NULL) ? NULL : (value_compare_func_target_destroy_notify (value_compare_func_target), NULL); + value_compare_func = NULL; + value_compare_func_target = NULL; + value_compare_func_target_destroy_notify = NULL; return self; } -GeeTreeMultiMap* gee_tree_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, GCompareFunc key_compare_func, GCompareFunc value_compare_func) { - return gee_tree_multi_map_construct (GEE_TYPE_TREE_MULTI_MAP, k_type, k_dup_func, k_destroy_func, v_type, v_dup_func, v_destroy_func, key_compare_func, value_compare_func); +GeeTreeMultiMap* gee_tree_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, GCompareDataFunc key_compare_func, void* key_compare_func_target, GDestroyNotify key_compare_func_target_destroy_notify, GCompareDataFunc value_compare_func, void* value_compare_func_target, GDestroyNotify value_compare_func_target_destroy_notify) { + return gee_tree_multi_map_construct (GEE_TYPE_TREE_MULTI_MAP, k_type, k_dup_func, k_destroy_func, v_type, v_dup_func, v_destroy_func, key_compare_func, key_compare_func_target, key_compare_func_target_destroy_notify, value_compare_func, value_compare_func_target, value_compare_func_target_destroy_notify); } static GeeCollection* gee_tree_multi_map_real_create_value_storage (GeeAbstractMultiMap* base) { GeeTreeMultiMap * self; GeeCollection* result = NULL; - GCompareFunc _tmp0_; + GCompareDataFunc _tmp0_; + void* _tmp0__target; GeeTreeSet* _tmp1_; self = (GeeTreeMultiMap*) base; _tmp0_ = self->priv->_value_compare_func; - _tmp1_ = gee_tree_set_new (self->priv->v_type, (GBoxedCopyFunc) self->priv->v_dup_func, self->priv->v_destroy_func, _tmp0_); + _tmp0__target = self->priv->_value_compare_func_target; + _tmp1_ = gee_tree_set_new (self->priv->v_type, (GBoxedCopyFunc) self->priv->v_dup_func, self->priv->v_destroy_func, _tmp0_, _tmp0__target, NULL); result = (GeeCollection*) _tmp1_; return result; } @@ -436,59 +608,94 @@ static GeeCollection* gee_tree_multi_map_real_create_value_storage (GeeAbstractM static GeeMultiSet* gee_tree_multi_map_real_create_multi_key_set (GeeAbstractMultiMap* base) { GeeTreeMultiMap * self; GeeMultiSet* result = NULL; - GCompareFunc _tmp0_; - GCompareFunc _tmp1_; + GCompareDataFunc _tmp0_; + void* _tmp0__target; + GCompareDataFunc _tmp1_; + void* _tmp1__target; GeeTreeMultiSet* _tmp2_; self = (GeeTreeMultiMap*) base; - _tmp0_ = gee_tree_multi_map_get_key_compare_func (self); + _tmp0_ = gee_tree_multi_map_get_key_compare_func (self, &_tmp0__target); _tmp1_ = _tmp0_; - _tmp2_ = gee_tree_multi_set_new (self->priv->k_type, (GBoxedCopyFunc) self->priv->k_dup_func, self->priv->k_destroy_func, _tmp1_); + _tmp1__target = _tmp0__target; + _tmp2_ = gee_tree_multi_set_new (self->priv->k_type, (GBoxedCopyFunc) self->priv->k_dup_func, self->priv->k_destroy_func, _tmp1_, _tmp1__target, NULL); result = (GeeMultiSet*) _tmp2_; return result; } -static GEqualFunc gee_tree_multi_map_real_get_value_equal_func (GeeAbstractMultiMap* base) { +static GeeEqualDataFunc gee_tree_multi_map_real_get_value_equal_func (GeeAbstractMultiMap* base, void** result_target, GDestroyNotify* result_target_destroy_notify) { GeeTreeMultiMap * self; - GEqualFunc result = NULL; - GEqualFunc _tmp0_ = NULL; + GeeEqualDataFunc result = NULL; + void* _tmp0_ = NULL; + GDestroyNotify _tmp1_ = NULL; + GeeEqualDataFunc _tmp2_ = NULL; + GeeEqualDataFunc _tmp3_; + void* _tmp3__target; + GDestroyNotify _tmp3__target_destroy_notify; self = (GeeTreeMultiMap*) base; - _tmp0_ = gee_functions_get_equal_func_for (self->priv->v_type); - result = _tmp0_; + _tmp2_ = gee_functions_get_equal_func_for (self->priv->v_type, &_tmp0_, &_tmp1_); + _tmp3_ = _tmp2_; + _tmp3__target = _tmp0_; + _tmp3__target_destroy_notify = _tmp1_; + *result_target = _tmp3__target; + *result_target_destroy_notify = _tmp3__target_destroy_notify; + result = _tmp3_; return result; } -GCompareFunc gee_tree_multi_map_get_key_compare_func (GeeTreeMultiMap* self) { - GCompareFunc result; +GCompareDataFunc gee_tree_multi_map_get_key_compare_func (GeeTreeMultiMap* self, gpointer* result_target) { + GCompareDataFunc result; GeeMap* _tmp0_; - GCompareFunc _tmp1_; - GCompareFunc _tmp2_; + GCompareDataFunc _tmp1_; + void* _tmp1__target; + GCompareDataFunc _tmp2_; + void* _tmp2__target; + GCompareDataFunc _tmp3_; + void* _tmp3__target; g_return_val_if_fail (self != NULL, NULL); _tmp0_ = ((GeeAbstractMultiMap*) self)->_storage_map; - _tmp1_ = gee_tree_map_get_key_compare_func (G_TYPE_CHECK_INSTANCE_CAST (_tmp0_, GEE_TYPE_TREE_MAP, GeeTreeMap)); + _tmp1_ = gee_tree_map_get_key_compare_func (G_TYPE_CHECK_INSTANCE_CAST (_tmp0_, GEE_TYPE_TREE_MAP, GeeTreeMap), &_tmp1__target); _tmp2_ = _tmp1_; - result = _tmp2_; + _tmp2__target = _tmp1__target; + _tmp3_ = _tmp2_; + _tmp3__target = _tmp2__target; + *result_target = _tmp3__target; + result = _tmp3_; return result; } -GCompareFunc gee_tree_multi_map_get_value_compare_func (GeeTreeMultiMap* self) { - GCompareFunc result; - GCompareFunc _tmp0_; +GCompareDataFunc gee_tree_multi_map_get_value_compare_func (GeeTreeMultiMap* self, gpointer* result_target) { + GCompareDataFunc result; + GCompareDataFunc _tmp0_; + void* _tmp0__target; + GCompareDataFunc _tmp1_; + void* _tmp1__target; g_return_val_if_fail (self != NULL, NULL); _tmp0_ = self->priv->_value_compare_func; - result = _tmp0_; + _tmp0__target = self->priv->_value_compare_func_target; + _tmp1_ = _tmp0_; + _tmp1__target = _tmp0__target; + *result_target = _tmp1__target; + result = _tmp1_; return result; } -static void gee_tree_multi_map_set_value_compare_func (GeeTreeMultiMap* self, GCompareFunc value) { - GCompareFunc _tmp0_; +static void gee_tree_multi_map_set_value_compare_func (GeeTreeMultiMap* self, GCompareDataFunc value, gpointer value_target) { + GCompareDataFunc _tmp0_; + void* _tmp0__target; g_return_if_fail (self != NULL); _tmp0_ = value; + _tmp0__target = value_target; + (self->priv->_value_compare_func_target_destroy_notify == NULL) ? NULL : (self->priv->_value_compare_func_target_destroy_notify (self->priv->_value_compare_func_target), NULL); + self->priv->_value_compare_func = NULL; + self->priv->_value_compare_func_target = NULL; + self->priv->_value_compare_func_target_destroy_notify = NULL; self->priv->_value_compare_func = _tmp0_; - g_object_notify ((GObject *) self, "value-compare-func"); + self->priv->_value_compare_func_target = _tmp0__target; + self->priv->_value_compare_func_target_destroy_notify = NULL; } @@ -507,8 +714,6 @@ static void gee_tree_multi_map_class_init (GeeTreeMultiMapClass * klass) { g_object_class_install_property (G_OBJECT_CLASS (klass), GEE_TREE_MULTI_MAP_V_TYPE, g_param_spec_gtype ("v-type", "type", "type", G_TYPE_NONE, G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (G_OBJECT_CLASS (klass), GEE_TREE_MULTI_MAP_V_DUP_FUNC, g_param_spec_pointer ("v-dup-func", "dup func", "dup func", G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); g_object_class_install_property (G_OBJECT_CLASS (klass), GEE_TREE_MULTI_MAP_V_DESTROY_FUNC, g_param_spec_pointer ("v-destroy-func", "destroy func", "destroy func", G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); - g_object_class_install_property (G_OBJECT_CLASS (klass), GEE_TREE_MULTI_MAP_KEY_COMPARE_FUNC, g_param_spec_pointer ("key-compare-func", "key-compare-func", "key-compare-func", G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), GEE_TREE_MULTI_MAP_VALUE_COMPARE_FUNC, g_param_spec_pointer ("value-compare-func", "value-compare-func", "value-compare-func", G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_READABLE)); } @@ -520,6 +725,10 @@ static void gee_tree_multi_map_instance_init (GeeTreeMultiMap * self) { static void gee_tree_multi_map_finalize (GObject* obj) { GeeTreeMultiMap * self; self = G_TYPE_CHECK_INSTANCE_CAST (obj, GEE_TYPE_TREE_MULTI_MAP, GeeTreeMultiMap); + (self->priv->_value_compare_func_target_destroy_notify == NULL) ? NULL : (self->priv->_value_compare_func_target_destroy_notify (self->priv->_value_compare_func_target), NULL); + self->priv->_value_compare_func = NULL; + self->priv->_value_compare_func_target = NULL; + self->priv->_value_compare_func_target_destroy_notify = NULL; G_OBJECT_CLASS (gee_tree_multi_map_parent_class)->finalize (obj); } @@ -544,12 +753,6 @@ static void _vala_gee_tree_multi_map_get_property (GObject * object, guint prope GeeTreeMultiMap * self; self = G_TYPE_CHECK_INSTANCE_CAST (object, GEE_TYPE_TREE_MULTI_MAP, GeeTreeMultiMap); switch (property_id) { - case GEE_TREE_MULTI_MAP_KEY_COMPARE_FUNC: - g_value_set_pointer (value, gee_tree_multi_map_get_key_compare_func (self)); - break; - case GEE_TREE_MULTI_MAP_VALUE_COMPARE_FUNC: - g_value_set_pointer (value, gee_tree_multi_map_get_value_compare_func (self)); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -561,9 +764,6 @@ static void _vala_gee_tree_multi_map_set_property (GObject * object, guint prope GeeTreeMultiMap * self; self = G_TYPE_CHECK_INSTANCE_CAST (object, GEE_TYPE_TREE_MULTI_MAP, GeeTreeMultiMap); switch (property_id) { - case GEE_TREE_MULTI_MAP_VALUE_COMPARE_FUNC: - gee_tree_multi_map_set_value_compare_func (self, g_value_get_pointer (value)); - break; case GEE_TREE_MULTI_MAP_K_TYPE: self->priv->k_type = g_value_get_gtype (value); break; |