Issue 7982 [1] is caused by iota.length() [2] not working properly with unsigned values where the begin is greater than the end (the larger value is subtracted from the smaller value causing it to wrap around).

I asked Andrei in IRC if replacing:

    return unsigned((pastLast - current) / step);

with:

return unsigned(((cast(Signed!Value)pastLast) - (cast(Signed!Value)current)) / step);

was a sane approach. Although it does seem to fix the problem (though I haven't tested thoroughly) Andrei said it wasn't sane. I'm not sure what would be a better approach so I'm asking for ideas here.

(why does std.traits have unsigned() to take advantage of IFTI but no signed() equivalent?)

[1] http://d.puremagic.com/issues/show_bug.cgi?id=7982
[2] https://github.com/D-Programming-Language/phobos/blob/master/std/range.d#L4383

Regards,
Brad Anderson

Reply via email to