char* FastInt64ToBufferLeft(int64_t i, char* buffer) { uint64_t u = i; if (i < 0) { *buffer++ = '-'; u = -i; } return FastUInt64ToBufferLeft(u, buffer); }
char* FastUInt64ToBufferLeft(uint64_t u64, char* buffer) { int digits; const char *ASCII_digits = NULL; uint32_t u = static_cast<uint32_t>(u64); if (u == u64) return FastUInt32ToBufferLeft(u, buffer); uint64_t top_11_digits = u64 / 1000000000; buffer = FastUInt64ToBufferLeft(top_11_digits, buffer); u = u64 - (top_11_digits * 1000000000); digits = u / 10000000; // 10,000,000 GOOGLE_DCHECK_LT(digits, 100); ASCII_digits = two_ASCII_digits[digits]; buffer[0] = ASCII_digits[0]; buffer[1] = ASCII_digits[1]; buffer += 2; u -= digits * 10000000; // 10,000,000 digits = u / 100000; // 100,000 ASCII_digits = two_ASCII_digits[digits]; buffer[0] = ASCII_digits[0]; buffer[1] = ASCII_digits[1]; buffer += 2; u -= digits * 100000; // 100,000 digits = u / 1000; // 1,000 ASCII_digits = two_ASCII_digits[digits]; buffer[0] = ASCII_digits[0]; buffer[1] = ASCII_digits[1]; buffer += 2; u -= digits * 1000; // 1,000 digits = u / 10; ASCII_digits = two_ASCII_digits[digits]; buffer[0] = ASCII_digits[0]; buffer[1] = ASCII_digits[1]; buffer += 2; u -= digits * 10; digits = u; *buffer++ = '0' + digits; *buffer = 0; return buffer; }
string SimpleItoa(unsigned long long i) { // NOLINT(runtime/int) char buffer[kFastToBufferSize]; return string(buffer, (sizeof(i) == 4) ? FastUInt32ToBufferLeft(i, buffer) : FastUInt64ToBufferLeft(i, buffer)); }
string SimpleItoa(unsigned int i) { char buffer[kFastToBufferSize]; return string(buffer, (sizeof(i) == 4) ? FastUInt32ToBufferLeft(i, buffer) : FastUInt64ToBufferLeft(i, buffer)); }
inline char* FastUInt64ToBuffer(uint64 i, char* buffer) { FastUInt64ToBufferLeft(i, buffer); return buffer; }