diff --git a/src/libs/utils/smallstring.h b/src/libs/utils/smallstring.h index f1a95d3a78d..35c01030fcb 100644 --- a/src/libs/utils/smallstring.h +++ b/src/libs/utils/smallstring.h @@ -39,6 +39,7 @@ #endif #include +#include #include #include #include @@ -603,19 +604,31 @@ public: static BasicSmallString number(int number) { - char buffer[12]; - std::size_t size = itoa(number, buffer, 10); - - return BasicSmallString(buffer, size); +#ifdef __cpp_lib_to_chars + // +1 for the sign, +1 for the extra digit + char buffer[std::numeric_limits::digits10 + 2]; + auto result = std::to_chars(buffer, buffer + sizeof(buffer), number, 10); + Q_ASSERT(result.ec == std::errc{}); + auto endOfConversionString = result.ptr; + return BasicSmallString(buffer, endOfConversionString); +#else + return std::to_string(number); +#endif } static BasicSmallString number(long long int number) { - char buffer[22]; - std::size_t size = itoa(number, buffer, 10); - - return BasicSmallString(buffer, size); +#ifdef __cpp_lib_to_chars + // +1 for the sign, +1 for the extra digit + char buffer[std::numeric_limits::digits10 + 2]; + auto result = std::to_chars(buffer, buffer + sizeof(buffer), number, 10); + Q_ASSERT(result.ec == std::errc{}); + auto endOfConversionString = result.ptr; + return BasicSmallString(buffer, endOfConversionString); +#else + return std::to_string(number); +#endif } static @@ -913,51 +926,6 @@ private: m_data.allocated.data.size = size; } - static - std::size_t itoa(long long int number, char* string, uint base) - { - using llint = long long int; - using lluint = long long unsigned int; - std::size_t size = 0; - bool isNegative = false; - lluint unsignedNumber = 0; - - if (number == 0) - { - string[size] = '0'; - string[++size] = '\0'; - - return size; - } - - if (number < 0 && base == 10) - { - isNegative = true; - if (number == std::numeric_limits::min()) - unsignedNumber = lluint(std::numeric_limits::max()) + 1; - else - unsignedNumber = lluint(-number); - } else { - unsignedNumber = lluint(number); - } - - while (unsignedNumber != 0) - { - int remainder = int(unsignedNumber % base); - string[size++] = (remainder > 9) ? char((remainder - 10) + 'a') : char(remainder + '0'); - unsignedNumber /= base; - } - - if (isNegative) - string[size++] = '-'; - - string[size] = '\0'; - - std::reverse(string, string+size); - - return size; - } - private: Internal::StringDataLayout m_data; };