On Friday, 21 September 2012 at 10:45:42 UTC, Jonathan M Davis
wrote:
On Friday, September 21, 2012 12:38:07 monarch_dodra wrote:
On Friday, 21 September 2012 at 10:23:39 UTC, Jonathan M Davis
wrote:
> On Friday, September 21, 2012 11:00:31 monarch_dodra wrote:
>> What do you (you two) think of my proposition for a
>> "std.strictascii" module?
>
> I don't think that it's at all worth it. It's just duplicate
> functionality in
> order to avoid a cast.
(and contract)
If that's what you want, it's easy enough to create a helper
function which
you use instead of a cast which does the contract check as
well. e.g.
char toChar(dchar c)
{
assert(isAscii(c));
return cast(char)c;
}
foreach(ref char c; str)
c = toChar(std.ascii.toLower(c));
It should be completely optimized out with -release and -inline.
- Jonathan M Davis
That's a real good idea. Also, I find it is these kinds of
situations where UFCS really shines (IMO):
foreach(i, c; s1)
cs[i] = c.toUpper().toChar();
I love this syntax.
Related, could "toChar" be considered for inclusion? I think it
would be a convenient tool for validation.
/*
* Casts dchar to a char.
*
* Preconditions:
* $(D c) must be representable in a single char.
*/
char toChar(dchar c)
{
assert(c < 256, "toChar: Input too large for char");
return cast(char)c;
}
That said, if we go that way, we might as well just have a more
generic safeCast in std.conv or something:
T safeCast(T, U)(U i)
if(isBasicType!T && isBasicType!U)
{
assert(cast(T)i == i, "safeCast: Cast failed");
return cast(T)i;
}
foreach(i, c; s1)
cs[i] = c.toUpper().safeCast!char();
Hum... yeah... I don't know...
I seem to be typing faster than I can really think of the
consequences of such a function.