Should r.length of type ulong be supported on 32-bit systems?

Marco Leise via Digitalmars-d digitalmars-d at puremagic.com
Sat Oct 1 22:11:40 PDT 2016


Am Sat, 1 Oct 2016 01:04:01 -0400
schrieb Andrei Alexandrescu <SeeWebsiteForEmail at erdani.org>:

> 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

Me too, I haven't looked into it, but I noticed that all the
points you mentioned are resolved if length was required
to be a natural number, i.e. unsigned basic type.

Based on these points alone, I tend to agree with Walter.

Note:
Point 4. is arguable, because `threeWay` is a local function
designed to compare char types and only used once to compare
lengths under the (silent) assumption that they are < int.max.
I.e. It would be cleaner to replace that call with an explicit
comparison.

-- 
Marco



More information about the Digitalmars-d mailing list