54 lines
1.4 KiB
D
54 lines
1.4 KiB
D
module core.internal.string;
|
|
|
|
alias UnsignedStringBuf = char[64];
|
|
|
|
T[] unsignedToTempString(uint radix = 10, bool upperCase = false, T)(ulong value, return scope T[] buf)
|
|
if (radix >= 2 && radix <= 36 &&
|
|
(is(T == char) || is(T == wchar) || is(T == dchar)))
|
|
{
|
|
enum baseChar = upperCase ? 'A' : 'a';
|
|
size_t i = buf.length;
|
|
|
|
static if (size_t.sizeof == 4) // 32 bit CPU
|
|
{
|
|
if (value <= uint.max)
|
|
{
|
|
// use faster 32 bit arithmetic
|
|
uint val = cast(uint) value;
|
|
do
|
|
{
|
|
uint x = void;
|
|
if (val < radix)
|
|
{
|
|
x = cast(uint)val;
|
|
val = 0;
|
|
}
|
|
else
|
|
{
|
|
x = cast(uint)(val % radix);
|
|
val /= radix;
|
|
}
|
|
buf[--i] = cast(char)((radix <= 10 || x < 10) ? x + '0' : x - 10 + baseChar);
|
|
} while (val);
|
|
return buf[i .. $];
|
|
}
|
|
}
|
|
|
|
do
|
|
{
|
|
uint x = void;
|
|
if (value < radix)
|
|
{
|
|
x = cast(uint)value;
|
|
value = 0;
|
|
}
|
|
else
|
|
{
|
|
x = cast(uint)(value % radix);
|
|
value /= radix;
|
|
}
|
|
buf[--i] = cast(char)((radix <= 10 || x < 10) ? x + '0' : x - 10 + baseChar);
|
|
} while (value);
|
|
return buf[i .. $];
|
|
}
|