forked from qt-creator/qt-creator
Sqlite: Make SmallString::number locale independent
std::to_string is locale dependent. std::to_chars it not. Because some of our supported compiler(libC++) don't support std::to_chars for float we use the QString. Change-Id: I9a8f5d1d9b769faca0a7ac2d0798b91ee6b814d2 Reviewed-by: Burak Hancerli <burak.hancerli@qt.io> Reviewed-by: Tim Jenssen <tim.jenssen@qt.io> Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
This commit is contained in:
@@ -11,6 +11,7 @@
|
||||
#include "smallstringmemory.h"
|
||||
|
||||
#include <QByteArray>
|
||||
#include <QLocale>
|
||||
#include <QString>
|
||||
#include <QStringEncoder>
|
||||
|
||||
@@ -562,7 +563,7 @@ public:
|
||||
{
|
||||
// 2 bytes for the sign and because digits10 returns the floor
|
||||
char buffer[std::numeric_limits<int>::digits10 + 2];
|
||||
auto result = std::to_chars(buffer, buffer + sizeof(buffer), number, 10);
|
||||
auto result = std::to_chars(buffer, buffer + sizeof(buffer), number);
|
||||
auto endOfConversionString = result.ptr;
|
||||
return BasicSmallString(buffer, endOfConversionString);
|
||||
}
|
||||
@@ -571,12 +572,24 @@ public:
|
||||
{
|
||||
// 2 bytes for the sign and because digits10 returns the floor
|
||||
char buffer[std::numeric_limits<long long int>::digits10 + 2];
|
||||
auto result = std::to_chars(buffer, buffer + sizeof(buffer), number, 10);
|
||||
auto result = std::to_chars(buffer, buffer + sizeof(buffer), number);
|
||||
auto endOfConversionString = result.ptr;
|
||||
return BasicSmallString(buffer, endOfConversionString);
|
||||
}
|
||||
|
||||
static BasicSmallString number(double number) noexcept { return std::to_string(number); }
|
||||
static BasicSmallString number(double number) noexcept
|
||||
{
|
||||
#if defined(__cpp_lib_to_chars) && (__cpp_lib_to_chars >= 201611L)
|
||||
// 2 bytes for the sign and because digits10 returns the floor
|
||||
char buffer[std::numeric_limits<double>::digits10 + 2];
|
||||
auto result = std::to_chars(buffer, buffer + sizeof(buffer), number);
|
||||
auto endOfConversionString = result.ptr;
|
||||
return BasicSmallString(buffer, endOfConversionString);
|
||||
#else
|
||||
QLocale locale{QLocale::Language::C};
|
||||
return BasicSmallString{locale.toString(number)};
|
||||
#endif
|
||||
}
|
||||
|
||||
char &operator[](std::size_t index) noexcept { return *(data() + index); }
|
||||
|
||||
|
||||
@@ -400,7 +400,7 @@ TEST_F(CreateTableSqlStatementBuilder, default_value_float)
|
||||
|
||||
builder.addColumn("id", ColumnType::Real, {Sqlite::DefaultValue{1.1}});
|
||||
|
||||
ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id REAL DEFAULT 1.100000)");
|
||||
ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id REAL DEFAULT 1.1)");
|
||||
}
|
||||
|
||||
TEST_F(CreateTableSqlStatementBuilder, default_value_string)
|
||||
@@ -928,7 +928,7 @@ TEST_F(CreateStrictTableSqlStatementBuilder, default_value_float)
|
||||
|
||||
builder.addColumn("id", StrictColumnType::Real, {Sqlite::DefaultValue{1.1}});
|
||||
|
||||
ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id REAL DEFAULT 1.100000) STRICT");
|
||||
ASSERT_THAT(builder.sqlStatement(), "CREATE TABLE test(id REAL DEFAULT 1.1) STRICT");
|
||||
}
|
||||
|
||||
TEST_F(CreateStrictTableSqlStatementBuilder, default_value_string)
|
||||
|
||||
@@ -1837,8 +1837,8 @@ TEST(SmallString, number_to_string)
|
||||
ASSERT_THAT(SmallString::number(std::numeric_limits<int>::min()), "-2147483648");
|
||||
ASSERT_THAT(SmallString::number(std::numeric_limits<long long int>::max()), "9223372036854775807");
|
||||
ASSERT_THAT(SmallString::number(std::numeric_limits<long long int>::min()), "-9223372036854775808");
|
||||
ASSERT_THAT(SmallString::number(1.2), "1.200000");
|
||||
ASSERT_THAT(SmallString::number(-1.2), "-1.200000");
|
||||
ASSERT_THAT(SmallString::number(1.2), "1.2");
|
||||
ASSERT_THAT(SmallString::number(-1.2), "-1.2");
|
||||
}
|
||||
|
||||
TEST(SmallString, string_view_plus_operator)
|
||||
|
||||
Reference in New Issue
Block a user