Get rid of isInfinite()?
Mehrdad
wfunction at hotmail.com
Mon Jun 25 23:24:56 PDT 2012
On Tuesday, 26 June 2012 at 06:05:49 UTC, Jonathan M Davis wrote:
> If you can't calculate the length in O(1), then you're stuck
> using walkLength,
> which means iterating over the entire range to get its length.
> And if that's
> the case, then you can't make it a random access range, because
> for it to be a
> random access range, it either needs to have a length property
> (which must be
> O(1)) or be infinite. And I would fully expect for your code to
> run into a
> variety of bugs if you tried to claim that it was a length that
> it wasn't
> (e.g. ulong.max), since a number of functions will expect that
> that's its
> actual length and won't work properly if it's not.
>
> For a range to be random access, it must fulfill these
> requirements:
>
> template isRandomAccessRange(R)
> {
> enum bool isRandomAccessRange = is(typeof(
> (inout int _dummy=0)
> {
> static assert(isBidirectionalRange!R ||
> isForwardRange!R && isInfinite!R);
> R r = void;
> auto e = r[1];
> static assert(!isNarrowString!R);
> static assert(hasLength!R || isInfinite!R);
> }));
> }
>
> and I'm not sure that you can squeeze your range into that. You
> could do it if
> you just read in the entire range and created another range
> from it (be it an
> array or whatever), but you appear to be attempting something
> which probably
> won't quite work with the current range design. I suspect that
> you'd do better
> trying to claim that it wasn infinite rather than had a length,
> but then you'd
> have to be able to deal with the fact that empty is always
> false.
>
> - Jonathan M Davis
I actually only needed length() because random access ranges
required it (not because I did), but maybe I can avoid it some
way without using random access ranges at all... I'll try to
rework stuff. Thanks for the explanations.
More information about the Digitalmars-d
mailing list