On Wednesday, 26 October 2022 at 21:10:54 UTC, 0xEAB wrote:
I know this is advanced stuff, but the compiler *could* even
prove that the calculation(s) won’t go beyond `ubyte.max`.
```d
//... => char?
return (decimal - ubyte(10) + ubyte('A'));
return '\xFF';
}
```
You should help the compiler with return type:
```d
char toHexDigit(ubyte decimal) pure nothrow @nogc
{
if (decimal < 10)
return cast(char) (decimal + ubyte('0'));
if (decimal < 16)
return cast(char) (decimal - ubyte(10) + ubyte('A'));
return '\xFF';
}
void main()
{
import std.stdio : writeln;
foreach(ubyte n; 0..256)
{
const c = n.toHexDigit();
if(n < 16)
{
c.writeln(": ", n);
} else assert(c == char.init);
}
} /*
0: 0
1: 1
2: 2
3: 3
4: 4
5: 5
6: 6
7: 7
8: 8
9: 9
A: 10
B: 11
C: 12
D: 13
E: 14
F: 15
Process finished.
*/
```
SDB@79