Weird issue with std.range.iota.length

Meta via Digitalmars-d digitalmars-d at puremagic.com
Sun Feb 21 14:11:02 PST 2016


On Friday, 12 February 2016 at 05:51:34 UTC, Meta wrote:
> If you try to compile this code, it will currently not work:
>
> foreach (n; iota(1UL, 1000).parallel)
> {
>     //...
> }
>
>
> This is because of how the length is calculated by iota:
>
> auto iota(B, E)(B begin, E end)
> if (isIntegral!(CommonType!(B, E)) || isPointer!(CommonType!(B, 
> E)))
> {
>     import std.conv : unsigned;
>
>     //...
>
>     //The return type of length. When either begin or end
>     //is ulong, then IndexType == ulong
>     alias IndexType = typeof(unsigned(end - begin));
>
>     static struct Result
>     {
>         private Value current, pastLast;
>
>         //...
>
>         @property IndexType length() const
>         {
>             return unsigned(pastLast - current);
>         }
>     }
>
>     return Result(begin, end);
> }
>
>
> And because std.parallelism.TaskPool.defaultWorkUnitSize takes 
> a size_t, which with a 32-bit DMD is uint.
>
> What I want to know is, is this considered a bug? If so I will 
> submit a pull request to fix it.

I made a pull request: 
https://github.com/D-Programming-Language/phobos/pull/4013


More information about the Digitalmars-d mailing list