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