Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 31 additions & 31 deletions druntime/src/core/internal/string.d
Original file line number Diff line number Diff line change
Expand Up @@ -31,38 +31,39 @@ Params:
Returns:
The unsigned integer value as a string of characters
*/
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)))
T[] unsignedToTempString(uint radix = 10, bool upperCase = false, T, U)(in U value, return scope T[] buf)
if(__traits(isUnsigned, U))
{
enum baseChar = upperCase ? 'A' : 'a';
size_t i = buf.length;

static if (size_t.sizeof == 4) // 32 bit CPU
// Process oversized unsigned on 32 bit CPU?
static if (size_t.sizeof == 4 && U.sizeof > 4)
{
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 .. $];
return toTempStringImpl!(radix, upperCase)(val, buf);
}
}

return toTempStringImpl!(radix, upperCase)(cast()value, buf);
}

///ditto
//TODO: remove after Phobos will acquire necessary changes
T[] unsignedToTempString(uint radix = 10, bool upperCase = false, T, V)(in V value, return scope T[] buf)
if(!__traits(isUnsigned, V))
{
return unsignedToTempString!(radix, upperCase)(cast(ulong)value, buf);
}

private T[] toTempStringImpl(uint radix, bool upperCase, V, T)(V value, ref scope T[] buf)
if (radix >= 2 && radix <= 36 &&
__traits(isUnsigned, V) &&
(is(T == char) || is(T == wchar) || is(T == dchar)))
{
enum baseChar = upperCase ? 'A' : 'a';
size_t i = buf.length;

do
{
uint x = void;
Expand Down Expand Up @@ -117,11 +118,11 @@ auto unsignedToTempString(uint radix = 10)(ulong value)
unittest
{
UnsignedStringBuf buf = void;
assert(0.unsignedToTempString(buf) == "0");
assert(1.unsignedToTempString(buf) == "1");
assert(12.unsignedToTempString(buf) == "12");
assert(0x12ABCF .unsignedToTempString!16(buf) == "12abcf");
assert(0x12ABCF .unsignedToTempString!(16, true)(buf) == "12ABCF");
assert(0u.unsignedToTempString(buf) == "0");
assert(1u.unsignedToTempString(buf) == "1");
assert(12u.unsignedToTempString(buf) == "12");
assert(0x12ABCFu .unsignedToTempString!16(buf) == "12abcf");
assert(0x12ABCFu .unsignedToTempString!(16, true)(buf) == "12ABCF");
assert(long.sizeof.unsignedToTempString(buf) == "8");
assert(uint.max.unsignedToTempString(buf) == "4294967295");
assert(ulong.max.unsignedToTempString(buf) == "18446744073709551615");
Expand All @@ -146,9 +147,8 @@ alias SignedStringBuf = char[65];
T[] signedToTempString(uint radix = 10, bool upperCase = false, T)(long value, return scope T[] buf)
{
bool neg = value < 0;
if (neg)
value = cast(ulong)-value;
auto r = unsignedToTempString!(radix, upperCase)(value, buf);
ulong v = neg ? -value : value;
auto r = unsignedToTempString!(radix, upperCase)(v, buf);
if (neg)
{
// about to do a slice without a bounds check
Expand Down
Loading