D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 9447 - iota should generate char intervals too
Summary: iota should generate char intervals too
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: phobos (show other issues)
Version: D2
Hardware: All All
: P2 enhancement
Assignee: No Owner
URL:
Keywords: rejects-valid
Depends on:
Blocks:
 
Reported: 2013-02-03 18:05 UTC by bearophile_hugs
Modified: 2020-03-21 03:56 UTC (History)
3 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description bearophile_hugs 2013-02-03 18:05:18 UTC
Spinoff of Issue 8920


import std.range: iota;
void main() {
    foreach (i; iota('a', 'f')) {}
}


DMD 2.062alpha gives:

temp.d(3): Error: template std.range.iota does not match any function template declaration. Candidates are:
...\dmd2\src\phobos\std\range.d(5107):        std.range.iota(B, E, S)(B begin, E end, S step) if ((isIntegral!(CommonType!(B, E)) || isPointer!(CommonType!(B, E))) && isIntegral!(S))
...\dmd2\src\phobos\std\range.d(5192):        std.range.iota(B, E)(B begin, E end) if (isFloatingPoint!(CommonType!(B, E)))
...\dmd2\src\phobos\std\range.d(5199):        std.range.iota(B, E)(B begin, E end) if (isIntegral!(CommonType!(B, E)) || isPointer!(CommonType!(B, E)))
...\dmd2\src\phobos\std\range.d(5260):        std.range.iota(E)(E end)
...\dmd2\src\phobos\std\range.d(5267):        std.range.iota(B, E, S)(B begin, E end, S step) if (isFloatingPoint!(CommonType!(B, E, S)))
temp.d(3):        ... (1 more, -v to show) ...
...\dmd2\src\phobos\std\range.d(5107): Error: template std.range.iota cannot deduce template function from argument types !()(char,char)
Comment 1 Andrej Mitrovic 2013-02-04 10:15:42 UTC
The reason I mentioned Unicode in Issue 8920 is because I'm unsure whether simply incrementing the integral value of a character will produce a valid character (valid in how the Unicode standard defines it). 

For ASCII 'a'--'z' it's likely not an issue, but I'm thinking about the case of wchars and dchars. E.g. we would probably have to use isValidDchar.
Comment 2 Jonathan M Davis 2013-02-04 10:48:33 UTC
It is definitely _not_ the case that adding 1 to a wchar or dchar will necessarily result in a valid value. In both of them, there's a block in the middle which is invalid. Just like at the implementation of isValidDchar.
Comment 3 Andrej Mitrovic 2013-02-04 10:57:34 UTC
(In reply to comment #2)
> It is definitely _not_ the case that adding 1 to a wchar or dchar will
> necessarily result in a valid value. In both of them, there's a block in the
> middle which is invalid. Just like at the implementation of isValidDchar.

Is this the only restriction though? If that's so, it should be easy to implement this feature with a single runtime check to verify the range doesn't go over the invalid block.
Comment 4 monarchdodra 2013-07-26 00:12:08 UTC
(In reply to comment #3)
> (In reply to comment #2)
> > It is definitely _not_ the case that adding 1 to a wchar or dchar will
> > necessarily result in a valid value. In both of them, there's a block in the
> > middle which is invalid. Just like at the implementation of isValidDchar.
> 
> Is this the only restriction though? If that's so, it should be easy to
> implement this feature with a single runtime check to verify the range doesn't
> go over the invalid block.

I think that is a bad idea. We should keep it simple: User asks to iterate over xchars of values low to high, and that is all we should return.

When it comes to wchars or dchars, the notion of "invalid" is really in the eye of the beholder anyway.
Comment 5 basile-z 2017-01-23 07:12:42 UTC
available since (probably) https://github.com/dlang/phobos/pull/2895