Thin delegate adapter
Guilherme Vieira
n2.nitrogen at gmail.com
Wed Jan 12 15:16:19 PST 2011
No sh*t..?! @__@ That's so cool! But is it smart enough to know the stack
frame doesn't need to go to heap in this case? (since it returns a heap
object referecing another heap object, i.e. can it untangle `b' from the
stack?)
--
Atenciosamente / Sincerely,
Guilherme ("n2liquid") Vieira
On Wed, Jan 12, 2011 at 11:49 AM, Dmitry Olshansky <dmitry.olsh at gmail.com>wrote:
> On 12.01.2011 16:07, Guilherme Vieira wrote:
>
>> 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;
>> }
>>
>>
>> That's the main point of built-in delegates - the compiler detects them
> and places the enclosing stack frame on heap, so it's all sort of cool magic
> that just works :)
>
>> --
>> Atenciosamente / Sincerely,
>> Guilherme ("n2liquid") Vieira
>>
>> On Wed, Jan 12, 2011 at 10:57 AM, Dmitry Olshansky <dmitry.olsh at gmail.com<mailto:
>> 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
>>
>>
>
> --
> Dmitry Olshansky
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20110112/c53ff3e0/attachment.html>
More information about the Digitalmars-d
mailing list