On Friday, 14 February 2014 at 16:16:28 UTC, Robin wrote:
On Friday, 14 February 2014 at 15:21:04 UTC, Jesse Phillips wrote:
FYI an infinite range is defined to have

   struct Infinite {
       enum empty = false;
   }

You know it will never be empty at compile time.

Hiho,

thank you for this interesting input. =)

Couldn't this be equally possible (also at runtime) with the following:

struct Infinite {
    enum empty_ = false;
    bool empty() pure { return empty_; }
}

Yes, but only at runtime. For some things to work, you need to be able to know it at compile time. `std.range` defines a template `isInfinite` that checks for this.

This information can be used for some optimizations: `std.algorithm.count` and `std.range.walkLength` are only defined for non-infinite ranges (to avoid creating an infinite loop), `std.algorithm.cartesianProduct` can work with two infinite ranges using a special enumeration strategy if it can detect them, `std.range.chain` can optimize index access by stopping at the first infinite range, `std.range.take` can always define a length for infinite ranges (even if they don't have a length property themselves), ...

Another example: The `length` property of ranges. It is possible to turn builtin slices (dynamic arrays) into ranges by importing `std.range` or `std.array`. Slices already have a member field `length` by default. Here you have an example where it's impossible to define a method `length()`. With properties, nothing special needs to be done: You can always use `length` without parens, even if it happens to be a method.

Reply via email to