Should r.length of type ulong be supported on 32-bit systems?
Andrei Alexandrescu via Digitalmars-d
digitalmars-d at puremagic.com
Fri Sep 30 22:04:01 PDT 2016
On 09/30/2016 11:58 PM, Walter Bright wrote:
> On 9/30/2016 7:31 PM, Andrei Alexandrescu wrote:
>> https://github.com/dlang/phobos/pull/4827 still allows that but
>> specifies that
>> phobos algorithms are not required to. -- Andrei
>
> A couple instances where a length may be longer than the address space:
>
> 1. large files
> 2. sequences of mathematically generated values
>
> I don't see a particular advantage to restricting hasLength() to be
> size_t or ulong. Whether an algorithm requires the length to be within
> the addressable capabilities of the CPU or not should be up to the
> algorithm.
>
> There is also cause for r.length to return an int even on a 64 bit
> system - it can be more efficient.
Indeed the "I have a dream" cases are quite the lure. The reality in the
field, however, is that Phobos thoroughly assumes length has type
size_t. The problem is defining hasLength in ways that are at the same
time general and that also work is extremely laborious. Just grep
through Consider:
1. std.algorithm.comparison:1007 (abridged)
const rc = mulu(r, c, overflow);
if (_matrix.length < rc)
So here we assume length is comparable for inequality with a const
size_t. That should probably rule out signed integrals.
2. ibid, 1694 (abridged)
static if (hasLength!(Range1) && hasLength!(Range2))
{
return r1.length == r2.length;
}
Here we assume any two ranges satisfying hasLength have lengths
comparable for equality. That projects a rather tenuous definition of
hasLength: "the range must define a length that is comparable for
equality with any other range that also defines a length". Not
impossible, but definitely not what we have right now, de facto or de jure.
3. ibid, 634 (abridged)
immutable len = min(r1.length, r2.length);
So here two lengths must be comparable for ordering, have a common type,
and have an immutable constructor.
4. ibid, 656 (abridged)
return threeWay(r1.length, r2.length);
Here threeWay takes two size_t. So both lengths must be at least
convertible implicitly to size_t.
I got to the end of the first file I scanned with grep, and I don't know
what a robust definition of hasLength should be - outside of size_t
itself. The more locations one examines, the more the capabilities
required get closer to those of size_t - or the more latent bugs exist
in phobos if we want to support something else.
We have two options here.
1. Support a range of types (e.g.: any integral and any user-defined
type that supports the following list of primitives: ...) for length
with hasLength, and then have each range-based algorithm define its own
additional restrictions if they have such. That means right now a bunch
of phobos code is incorrect and needs to be fixed.
2. Require lengths to be size_t.
I'm all for generality, but of the useful kind. It seems to me
supporting a complicated definition of length is a protracted
proposition with little upside. That's why I'm going with the
engineering solution in the PR.
Andrei
More information about the Digitalmars-d
mailing list