std.range.iota enhancement: supporting more types (AKA issue 10762)

Joseph Rushton Wakeling joseph.wakeling at webdrake.net
Tue Dec 24 05:08:23 PST 2013


On 24/12/13 12:57, Jakob Ovrum wrote:
> Implement `back` is really trivial.
>
> Simplified example:
> ---
> auto iota(T)(T start, T end)
> {
>      static struct Result
>      {
>          T start, end;
>
>          bool empty() @property { return start == end; }
>          T front() @property { return start; }
>          void popFront() { ++start; }
>          T back() @property { return end; }
>          void popBack() { --end; }
>          // etc
>      }
>
>      return Result(start, --end);
> }

Complication: as it stands, iota is defined as an open interval; its values 
consist of

     start, start + delta, start + 2*delta, ..., start + n*delta

... where n is the largest possible value of n such that start + n*delta < end.

It's NOT however guaranteed that start + n*delta == end - delta.  Consider:

     iota(0.0, 0.91, 0.1)    // gives 0.0, 0.1, ..., 0.8, 0.9

So, absent the ability to calculate start + n*delta in O(1), it's _not_ trivial 
to calculate the initial value of .back.


More information about the Digitalmars-d mailing list