On Tue, 12 Mar 2013 11:02:43 -0400, monarch_dodra <[email protected]> wrote:

On Tuesday, 12 March 2013 at 14:30:00 UTC, Steven Schveighoffer wrote:
On Tue, 12 Mar 2013 06:49:56 -0400, monarch_dodra <[email protected]> wrote:

On Tuesday, 12 March 2013 at 10:01:38 UTC, deadalnix wrote:
I want to resurrect that thread. Can someone explains the benefices of isInfinite ? I fail to see how it really benefit the code.

The advantage of "enum empty = false" is that algorithms gain a great performance boost by optimizing out any "if (r.empty)". This can be exploited for things like take, or anything that iterates as a matter of fact. I don't think anybody will argue that this is a bad approach.

Wouldn't it automatically be optimized out? I mean if r.empty is an enum, it's like saying if(false) I would think even with optimizations off, this might be done.

Not that I'm questioning the value of isInfinite (I'm neutral on it), but this is not a benefit.

-Steve

Right, that's what I said. This first paragraph was just about enum empty = false.

Oh, ok. When you said "optmizing out" I thought you meant using isInfinite to optionally remove calls to empty by hand.

Another point: isInfinite is useful, if only to propagate infiniteness. For example: "1.repeat().map"a * 2"()". If "map" didn't know that repeat is infinite, it would simply provide the "dumb" empty implementation, and the final range will have lost it's infinite trait.

With inlining, this should propagate properly:

struct WrapperRange(R)
{
   R src;
   @property auto front() { return src.front;}
@property bool empty() { return src.empty;} // should be optimized to 'false' with inlining
   void popFront() { src.popFront();}
}

If R's empty is an enum, then WrapperRange's empty should inline to the enum also.

-Steve

Reply via email to