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.

Reply via email to