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:
Marco Bubke
2023-10-10 16:09:39 +02:00
parent ea44631300
commit 100ea34060
3 changed files with 20 additions and 7 deletions

View File

@@ -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); }

View File

@@ -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)

View File

@@ -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)