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