Thin delegate adapter

Guilherme Vieira n2.nitrogen at gmail.com
Wed Jan 12 05:07:27 PST 2011


Ah, I totally missed that. But what if `s' went out of the scope and the
scope ended? Wouldn't the scope reference (the one containing `b') be lost
and cause memory corruption?

E.g.:

Switch make_switch()
{
    auto s = new Switch();
    auto b = new ToggleButton();

    s.watch = (Switch.State state) { b.toggled = cast(bool)(state); };


    return s;
}


-- 
Atenciosamente / Sincerely,
Guilherme ("n2liquid") Vieira

On Wed, Jan 12, 2011 at 10:57 AM, Dmitry Olshansky <dmitry.olsh at gmail.com>wrote:

> 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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20110112/a1393cad/attachment.html>


More information about the Digitalmars-d mailing list