On 07/13/2010 05:09 AM, Shin Fujishiro wrote:
Andrei Alexandrescu<seewebsiteforem...@erdani.org>  wrote:
I've just had an idea that is so dark and devious, I was almost afraid
to try it. But it works like a charm. Consider:

T * getNext(R, E)(ref R range,
                    ref E store = *(cast(E*) alloca(E.sizeof))
{
      ...
}

With this, allocating a dummy buffer on caller's stack is automated, so
client code can just write:

for (T * p; (p = getNext(r)); )  {
     ... process *p ...
}

I feel dirty.

How about a TLS variable?

template temporary(T)
{
     static T temporary;
}
E* getNext(R, E)(ref R range, ref E store = temporary!E);

There's the classic problem of reusing the same temporary. Consider:

Range r1, r2;
ElementType!Range * p1, p2;
while ((p1 = getNext(r1)) && (p2 = getNext(r2)))
{
   ... oops ...
}

You need one temporary for each static occurrence of getNext.

Andrei

Reply via email to