From 9c53f4d33a1953bc84e5b5e8bbef14db375bb180 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sun, 25 Oct 2015 20:00:42 +0100 Subject: QStringBuilder: add support for QStringView [ChangeLog][QtCore][QStringBuilder] Added support for QStringView. Change-Id: I5b6803397b107ef69d198a935b3ba4339ac95087 Reviewed-by: Anton Kudryavtsev Reviewed-by: Olivier Goffart (Woboq GmbH) Reviewed-by: Edward Welbourne --- src/corelib/tools/qstringbuilder.cpp | 2 +- src/corelib/tools/qstringbuilder.h | 14 ++++++++++++++ .../tools/qstringbuilder/qstringbuilder1/stringbuilder.cpp | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/corelib/tools/qstringbuilder.cpp b/src/corelib/tools/qstringbuilder.cpp index 37b0e08caf..73748e55a3 100644 --- a/src/corelib/tools/qstringbuilder.cpp +++ b/src/corelib/tools/qstringbuilder.cpp @@ -73,7 +73,7 @@ QT_BEGIN_NAMESPACE For building QStrings: \list - \li QString, QStringRef, + \li QString, QStringRef, (since 5.10:) QStringView \li QChar, QCharRef, QLatin1Char, (since 5.10:) \c char16_t, \li QLatin1String, \li (since 5.10:) \c{const char16_t[]} (\c{u"foo"}), diff --git a/src/corelib/tools/qstringbuilder.h b/src/corelib/tools/qstringbuilder.h index e9ca2245ba..1d96d70637 100644 --- a/src/corelib/tools/qstringbuilder.h +++ b/src/corelib/tools/qstringbuilder.h @@ -289,6 +289,20 @@ template <> struct QConcatenable : private QAbstractConcatenable } }; +template <> struct QConcatenable : private QAbstractConcatenable +{ + typedef QStringView type; + typedef QString ConvertTo; + enum { ExactSize = true }; + static int size(QStringView a) { return a.length(); } + static inline void appendTo(QStringView a, QChar *&out) + { + const auto n = a.size(); + memcpy(out, a.data(), sizeof(QChar) * n); + out += n; + } +}; + template struct QConcatenable : private QAbstractConcatenable { typedef const char type[N]; diff --git a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/stringbuilder.cpp b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/stringbuilder.cpp index 4f7b05530c..ac7f439248 100644 --- a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/stringbuilder.cpp +++ b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/stringbuilder.cpp @@ -60,6 +60,7 @@ template QString toQString(const T &t); template <> QString toQString(const QString &s) { return s; } template <> QString toQString(const QStringRef &r) { return r.toString(); } +template <> QString toQString(const QStringView &v) { return v.toString(); } template <> QString toQString(const QLatin1String &l) { return l; } template <> QString toQString(const QLatin1Char &l) { return QChar(l); } template <> QString toQString(const QChar &c) { return c; } @@ -84,6 +85,7 @@ void runScenario() QLatin1String l1string(LITERAL); QString string(l1string); QStringRef stringref(&string, 2, 10); + QStringView stringview(stringref); QLatin1Char lchar('c'); QChar qchar(lchar); QChar::SpecialCharacter special(QChar::Nbsp); @@ -108,6 +110,7 @@ void runScenario() CHECK(P, l1string, l1string); CHECK(P, l1string, string); CHECK(P, l1string, stringref); + CHECK(Q, l1string, stringview); CHECK(P, l1string, lchar); CHECK(P, l1string, qchar); CHECK(P, l1string, special); @@ -118,6 +121,7 @@ void runScenario() CHECK(P, string, string); CHECK(P, string, stringref); + CHECK(Q, string, stringview); CHECK(P, string, lchar); CHECK(P, string, qchar); CHECK(P, string, special); @@ -127,6 +131,7 @@ void runScenario() CHECK(Q, string, u16charstar); CHECK(P, stringref, stringref); + CHECK(Q, stringref, stringview); CHECK(P, stringref, lchar); CHECK(P, stringref, qchar); CHECK(P, stringref, special); @@ -135,6 +140,15 @@ void runScenario() CHECK(Q, stringref, u16chararray); CHECK(Q, stringref, u16charstar); + CHECK(Q, stringview, stringview); + CHECK(Q, stringview, lchar); + CHECK(Q, stringview, qchar); + CHECK(Q, stringview, special); + CHECK(P, stringview, QStringLiteral(LITERAL)); + CHECK(Q, stringview, u16char); + CHECK(Q, stringview, u16chararray); + CHECK(Q, stringview, u16charstar); + CHECK(P, lchar, lchar); CHECK(P, lchar, qchar); CHECK(P, lchar, special); -- cgit v1.2.3