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 .. $];
}