Gee HashMap containing methods as values
Asked Answered
I

2

6

I'm trying to fill a Libgee HashMap where each entry has a string as key, and a function as value. Is this possible? I want this sort of thing:

var keybindings = new Gee.HashMap<string, function> ();
keybindings.set ("<control>h", this.show_help ());
keybindings.set ("<control>q", this.explode ());

so that I can eventually do something like this:

foreach (var entry in keybindings.entries) {
    uint key_code;
    Gdk.ModifierType accelerator_mods;
    Gtk.accelerator_parse((string) entry.key, out key_code, out accelerator_mods);      
   accel_group.connect(key_code, accelerator_mods, Gtk.AccelFlags.VISIBLE, entry.value);
}

But perhaps this isn't the best way?

Irremissible answered 26/5, 2011 at 22:0 Comment(0)
M
5

Delegates are what you're looking for. But last time I checked, generics didn't support delegates, so a not-so-elegant way is to wrap it:

delegate void DelegateType();

private class DelegateWrapper {
    public DelegateType d;
    public DelegateWrapper(DelegateType d) {
        this.d = d;
    }
}

Gee.HashMap keybindings = new Gee.HashMap<string, DelegateWrapper> ();
keybindings.set ("<control>h", new DelegateWrapper(this.show_help));
keybindings.set ("<control>q", new DelegateWrapper(this.explode));

//then connect like you normally would do:
accel_group.connect(entry.value.d);
Monkfish answered 26/5, 2011 at 23:24 Comment(2)
I think generics are implemented, or at least there's a section related to them in the tutorialIrremissible
I meant 'using delegates as the generic type argument' is not supported, not generics in general:) Edited.Monkfish
E
2

It is possible only for delegates with [CCode (has_target = false)], otherwise you have to create a wrapper as takoi suggested.

Ergot answered 28/5, 2011 at 19:24 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.