format.conv.number2String -> format.integral2String (intern)
This commit is contained in:
		@@ -355,81 +355,3 @@ if (isIntegral!From && is(To == enum))
 | 
				
			|||||||
    throw make!ConvException(defaultAllocator,
 | 
					    throw make!ConvException(defaultAllocator,
 | 
				
			||||||
                             "Value not found in enum '" ~ To.stringof ~ "'");
 | 
					                             "Value not found in enum '" ~ To.stringof ~ "'");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
// Returns the last part of buffer with converted number.
 | 
					 | 
				
			||||||
package(tanya) char[] number2String(T)(const T number,
 | 
					 | 
				
			||||||
                                       return ref char[21] buffer)
 | 
					 | 
				
			||||||
if (isIntegral!T)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    // abs the integer.
 | 
					 | 
				
			||||||
    ulong n64 = number < 0 ? -cast(long) number : number;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    char* start = buffer[].ptr + buffer.sizeof - 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    while (true)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        // Do in 32-bit chunks (avoid lots of 64-bit divides even with constant
 | 
					 | 
				
			||||||
        // denominators).
 | 
					 | 
				
			||||||
        char* o = start - 8;
 | 
					 | 
				
			||||||
        uint n;
 | 
					 | 
				
			||||||
        if (n64 >= 100000000)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            n = n64 % 100000000;
 | 
					 | 
				
			||||||
            n64 /= 100000000;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        else
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            n = cast(uint) n64;
 | 
					 | 
				
			||||||
            n64 = 0;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        while (n)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            *--start = cast(char) (n % 10) + '0';
 | 
					 | 
				
			||||||
            n /= 10;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        // Ignore the leading zero if it was the last part of the integer.
 | 
					 | 
				
			||||||
        if (n64 == 0)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            if ((start[0] == '0')
 | 
					 | 
				
			||||||
             && (start != (buffer[].ptr + buffer.sizeof -1)))
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                ++start;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            break;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        // Copy leading zeros if it wasn't the most significant part of the
 | 
					 | 
				
			||||||
        // integer.
 | 
					 | 
				
			||||||
        while (start != o)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            *--start = '0';
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Get the length that we have copied.
 | 
					 | 
				
			||||||
    uint l = cast(uint) ((buffer[].ptr + buffer.sizeof - 1) - start);
 | 
					 | 
				
			||||||
    if (l == 0)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        *--start = '0';
 | 
					 | 
				
			||||||
        l = 1;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else if (number < 0) // Set the sign.
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        *--start = '-';
 | 
					 | 
				
			||||||
        ++l;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return buffer[$ - l - 1 .. $ - 1];
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Converting an integer to string.
 | 
					 | 
				
			||||||
@nogc nothrow pure @system unittest
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    char[21] buf;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    assert(number2String(80, buf) == "80");
 | 
					 | 
				
			||||||
    assert(number2String(-80, buf) == "-80");
 | 
					 | 
				
			||||||
    assert(number2String(0, buf) == "0");
 | 
					 | 
				
			||||||
    assert(number2String(uint.max, buf) == "4294967295");
 | 
					 | 
				
			||||||
    assert(number2String(int.min, buf) == "-2147483648");
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,3 +15,81 @@
 | 
				
			|||||||
module tanya.format;
 | 
					module tanya.format;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public import tanya.format.conv;
 | 
					public import tanya.format.conv;
 | 
				
			||||||
 | 
					import tanya.meta.trait;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Returns the last part of buffer with converted number.
 | 
				
			||||||
 | 
					package(tanya) char[] integral2String(T)(T number, return ref char[21] buffer)
 | 
				
			||||||
 | 
					if (isIntegral!T)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    // abs the integer.
 | 
				
			||||||
 | 
					    ulong n64 = number < 0 ? -cast(long) number : number;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    char* start = buffer[].ptr + buffer.sizeof - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    while (true)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // Do in 32-bit chunks (avoid lots of 64-bit divides even with constant
 | 
				
			||||||
 | 
					        // denominators).
 | 
				
			||||||
 | 
					        char* o = start - 8;
 | 
				
			||||||
 | 
					        uint n;
 | 
				
			||||||
 | 
					        if (n64 >= 100000000)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            n = n64 % 100000000;
 | 
				
			||||||
 | 
					            n64 /= 100000000;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            n = cast(uint) n64;
 | 
				
			||||||
 | 
					            n64 = 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        while (n)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            *--start = cast(char) (n % 10) + '0';
 | 
				
			||||||
 | 
					            n /= 10;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // Ignore the leading zero if it was the last part of the integer.
 | 
				
			||||||
 | 
					        if (n64 == 0)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if ((start[0] == '0')
 | 
				
			||||||
 | 
					             && (start != (buffer[].ptr + buffer.sizeof -1)))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                ++start;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // Copy leading zeros if it wasn't the most significant part of the
 | 
				
			||||||
 | 
					        // integer.
 | 
				
			||||||
 | 
					        while (start != o)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            *--start = '0';
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Get the length that we have copied.
 | 
				
			||||||
 | 
					    uint l = cast(uint) ((buffer[].ptr + buffer.sizeof - 1) - start);
 | 
				
			||||||
 | 
					    if (l == 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        *--start = '0';
 | 
				
			||||||
 | 
					        l = 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else if (number < 0) // Set the sign.
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        *--start = '-';
 | 
				
			||||||
 | 
					        ++l;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return buffer[$ - l - 1 .. $ - 1];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Converting an integer to string.
 | 
				
			||||||
 | 
					@nogc nothrow pure @system unittest
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    char[21] buf;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    assert(integral2String(80, buf) == "80");
 | 
				
			||||||
 | 
					    assert(integral2String(-80, buf) == "-80");
 | 
				
			||||||
 | 
					    assert(integral2String(0, buf) == "0");
 | 
				
			||||||
 | 
					    assert(integral2String(uint.max, buf) == "4294967295");
 | 
				
			||||||
 | 
					    assert(integral2String(int.min, buf) == "-2147483648");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user