Ranges longer than size_t.max
Peter Alexander
peter.alexander.au at gmail.com
Fri Dec 28 17:18:36 PST 2012
There was a discussion a while ago about the type returned by
.length for ranges. I believe the conclusion was that it should
always be size_t.
My question now is what to do with really large ranges? For
example, if we have a range of permutations of the elements in a
set, when the set is larger than 21 the number of permutations is
21 factorial, which is over 2^64. As far as I see, there are
three options:
1. Allow ranges to return BigInt for length.
2. Allow ranges like this but assert when .length overflows.
3. Allow ranges like this and just allow .length to overflow
dangerously.
4. Do not allow ranges like this.
Option 1 solves the problem, but significantly complicates Phobos
development for the rare case.
Option 2 works, and is practical, although runtime asserts are
undesirable.
Option 3 is current Phobos practice (presumably because overflow
is unlikely). See example below. This may be acceptable
currently, but perhaps less so when overflow is more likely.
--------------------------------
auto a = iota(size_t.max / 2 + 1);
auto b = chain(a, a);
writeln(a.length); // 9223372036854775808
writeln(b.length); // 0
--------------------------------
Option 4 works, but it would be a shame to lose these ranges.
Thoughts?
More information about the Digitalmars-d
mailing list