"IndexType" for ranges

Jonathan M Davis jmdavisProg at gmx.com
Tue Oct 2 10:13:42 PDT 2012

On Tuesday, October 02, 2012 15:17:58 monarch_dodra wrote:
> You might think "just use typeof(length)" BUT:
> *you aren't even guaranteed that "typeof(length)" will be
> correct! Certain ranges, such as iota, will return a length
> usually of type uint, but be indexed with ulong... :/
> *Infinite ranges don't have length...

I'd argue that that's a bug in iota. iota's length even specifically returns 

It makes no sense for length, opIndex, or opSlice to vary in type at all. They 
should all use the same type (ideally size_t). The fact that it's not outright 
required to be size_t is bad enough (though IIRC iota had some good reasons 
for using ulong).

> These are not big changes I'm proposing, but they *may* break
> some existing ranges. Those ranges are arguably retarded, and
> these changes would enforce correctness, but they'd break none
> the less. I'd like some feedback if you think this trait is worth
> pushing?

Requiring that length, opIndex, and opSlice all use the same index type would 
be very much the right way to go IMHO. If that's done however, I don't know if 
we'll really need IndexType (though it may still be a good idea to add it).

In addition, I'd argue that they should require that they all be at least as 
large as size_t (ideally, they'd even have to be either size_t or ulong and 
that's it - no signed types allowed), but that may be too strict at this point 
given that it could break existing code that did stupid stuff like use int 
(which _way_ too many people seem inclined to do).

- Jonathan M Davis

More information about the Digitalmars-d mailing list