Uranuz:

bool isDigit(char c) nothrow

This function is already in Phobos, it's std.ascii.isDigit.


ushort hexValue(char c) nothrow

Better to use this signature (assuming you want a ushort result, despite a ubyte suffices and a uint is faster):

ushort hexValue(in char c) pure nothrow @safe @nogc


        else
                return ushort.max;

Special error values are not very safe. Consider the usage of a Nullable!(ubyte, ubyte.max) instead, if you can stand the little abstraction penalty.


why these expressions are casted to int?

Because in C/C++/D if you perform arithmetic operations among types shorter than int you produce an int.


I was thinking that result should be of char type.

In general it can't be a char.


And it could be implicitly converted to ushort
(because there is enough place to store result).

The precedent compiler version was wrong, and the bug has being fixed by the great Kenji.

If you have an expression like:

char - 'a' + 10

It means:

[0, 255] - 87

That is [-87, 168] that can't fit in the [0, 65535] range.

Currently in D the range value analysis works only on the current expression, so the information from the "if(c >= 'a' && c <= 'f')" condition is ignored here.

There are discussions and even code to fix this:
http://forum.dlang.org/thread/lnrc8l$1254$1...@digitalmars.com
https://github.com/lionello/dmd/compare/if-else-range
https://github.com/D-Programming-Language/dmd/pull/3679

But both Walter and Andrei have so far ignored this significant D improvement, so I don't know if and when it will be added.

Bye,
bearophile

Reply via email to