Thin delegate adapter

Dmitry Olshansky dmitry.olsh at gmail.com
Wed Jan 12 04:57:12 PST 2011


On 12.01.2011 15:41, Guilherme Vieira wrote:
> Hi,
>
> I'm wondering if a delegate adapter template like isn't handy for 
> Phobos (it may be especially useful for std.signal):
>
>     class Switch
>     {
>         enum State { ON, OFF }
>
>         void trigger()
>         {
>             switch (mState)
>             {
>                 case State.ON: mState = State..OFF; break;
>                 case State.OFF: mState = State.ON; break;
>                 default: break;
>             }
>
>             if (watch !is null) watch(mState);
>         }
>
>         void delegate(State s) watch;
>
>         private State mState;
>     }
>
>     class ToggleButton
>     {
>         @property toggled(bool toggled)
>         {
>             writeln("ToggleButton.toggled(", toggled, ")");
>         }
>     }
>
>     void main()
>     {
>         scope s = new Switch();
>         scope b = new ToggleButton();
>
>         s.watch = &b.toggled; // error: invalid conversion
>         s.watch = adapt!("obj.toggled = cast(bool)(a)", Switch.State)(b);
>
>         s.trigger(); // prints `ToggleButton.toggled(true)`
>         s.trigger(); // prints `ToggleButton.toggled(false)`
>         s.trigger(); // prints `ToggleButton.toggled(true)`
>         s.trigger(); // prints `ToggleButton.toggled(false)`
>     }
>
>
> Yes, it urges to be polished. Particularly, it doesn't support 
> multiple arguments. I also wanted to place the argument type tuple 
> somwhere else (actually wanted to hide it completely, but I think 
> that's not possible).
>
> Feedback?
>
> -- 
> Atenciosamente / Sincerely,
> Guilherme ("n2liquid") Vieira
How is it better then built-in language feature? This works just fine:
     void main()
     {
//they can't be scope  and compiler enforces this (+ scope is deprecated)
//actually, the orignal code is unsafe - what hapens if adapted delegate 
escapes current scope?
         auto s = new Switch();
         auto b = new ToggleButton();


         s.watch = (Switch.State a){ b.toggled = cast(bool)a; };
         s.trigger(); // prints `ToggleButton.toggled(true)`
         s.trigger(); // prints `ToggleButton.toggled(false)`
         s.trigger(); // prints `ToggleButton.toggled(true)`
         s.trigger(); // prints `ToggleButton.toggled(false)`
     }

-- 
Dmitry Olshansky



More information about the Digitalmars-d mailing list