103 lines
1.9 KiB
C++
103 lines
1.9 KiB
C++
#pragma once
|
|
#include <string>
|
|
|
|
//Fast to int to string
|
|
//Source: http://stackoverflow.com/a/4351484/192001
|
|
//Modified version to pad zeros according to min_size
|
|
|
|
namespace c11log {
|
|
namespace details {
|
|
|
|
const char digit_pairs[201] = {
|
|
"00010203040506070809"
|
|
"10111213141516171819"
|
|
"20212223242526272829"
|
|
"30313233343536373839"
|
|
"40414243444546474849"
|
|
"50515253545556575859"
|
|
"60616263646566676869"
|
|
"70717273747576777879"
|
|
"80818283848586878889"
|
|
"90919293949596979899"
|
|
};
|
|
|
|
|
|
inline std::string& fast_itostr(int n, std::string& s, int padding)
|
|
{
|
|
if (n == 0)
|
|
{
|
|
s = "0";
|
|
return s;
|
|
}
|
|
|
|
int sign = -(n < 0);
|
|
unsigned int val = (n^sign) - sign;
|
|
|
|
int size;
|
|
if (val >= 10000)
|
|
{
|
|
if (val >= 10000000)
|
|
{
|
|
if (val >= 1000000000)
|
|
size = 10;
|
|
else if (val >= 100000000)
|
|
size = 9;
|
|
else
|
|
size = 8;
|
|
}
|
|
else
|
|
{
|
|
if (val >= 1000000)
|
|
size = 7;
|
|
else if (val >= 100000)
|
|
size = 6;
|
|
else
|
|
size = 5;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (val >= 100)
|
|
{
|
|
if (val >= 1000)
|
|
size = 4;
|
|
else
|
|
size = 3;
|
|
}
|
|
else
|
|
{
|
|
if (val >= 10)
|
|
size = 2;
|
|
else
|
|
size = 1;
|
|
}
|
|
}
|
|
size -= sign;
|
|
if (size < padding)
|
|
size = padding;
|
|
|
|
s.resize(size);
|
|
char* c = &s[0];
|
|
if (sign)
|
|
*c = '-';
|
|
|
|
c += size - 1;
|
|
while (val >= 100)
|
|
{
|
|
int pos = val % 100;
|
|
val /= 100;
|
|
*(short*)(c - 1) = *(short*)(digit_pairs + 2 * pos);
|
|
c -= 2;
|
|
}
|
|
while (val > 0)
|
|
{
|
|
*c-- = '0' + (val % 10);
|
|
val /= 10;
|
|
}
|
|
|
|
while (c >= s.data())
|
|
*c-- = '0';
|
|
return s;
|
|
}
|
|
}
|
|
} |