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 _IndexType_. 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