diff --git a/src/libs/utils/qstringbuilder.h b/src/libs/utils/qstringbuilder.h index b160ad4345b1b2876767ab638ed7e896605ddad7..ffe120cca5358df809b9aaffdf6fb72e5d780d09 100644 --- a/src/libs/utils/qstringbuilder.h +++ b/src/libs/utils/qstringbuilder.h @@ -88,10 +88,17 @@ private: template <typename A, typename B> -class QStringBuilderPair; +class QStringBuilderPair +{ +public: + QStringBuilderPair(const A &a_, const B &b_) : a(a_), b(b_) {} -template <typename A, typename B> -inline int qStringBuilderSize(const QStringBuilderPair<A, B> &p); + const A &a; + const B &b; +}; + + +namespace Qt { inline int qStringBuilderSize(const char) { return 1; } @@ -105,13 +112,22 @@ inline int qStringBuilderSize(const QString &a) { return a.size(); } inline int qStringBuilderSize(const QStringRef &a) { return a.size(); } - template <typename A, typename B> -inline void qStringBuilderAppend(const QStringBuilderPair<A, B> &p, QChar *&out); +inline int qStringBuilderSize(const QStringBuilderPair<A, B> &p) +{ + return qStringBuilderSize(p.a) + qStringBuilderSize(p.b); +} -inline void qStringBuilderAppend(const char c, QChar *&out) { *out++ = QLatin1Char(c); } -inline void qStringBuilderAppend(const QLatin1Char c, QChar *&out) { *out++ = c; } +inline void qStringBuilderAppend(const char c, QChar *&out) +{ + *out++ = QLatin1Char(c); +} + +inline void qStringBuilderAppend(const QLatin1Char c, QChar *&out) +{ + *out++ = c; +} inline void qStringBuilderAppend(const QLatin1String &a, QChar *&out) { @@ -139,6 +155,15 @@ inline void qStringBuilderAppend(const QLatin1Literal &a, QChar *&out) *out++ = QLatin1Char(*s++); } +template <typename A, typename B> +inline void qStringBuilderAppend(const QStringBuilderPair<A, B> &p, QChar *&out) +{ + qStringBuilderAppend(p.a, out); + qStringBuilderAppend(p.b, out); +} + +} // Qt + template <typename A> class QStringBuilder : public A @@ -152,43 +177,15 @@ public: QString s(this->size(), QChar(-1)); #else QString s; - s.resize(this->size()); + s.resize(Qt::qStringBuilderSize(*this)); #endif QChar *d = s.data(); - qStringBuilderAppend(*this, d); + Qt::qStringBuilderAppend(*this, d); return s; } }; -template <> -class QStringBuilder<QString> -{ -public: - QStringBuilder(const QString &a_) : a(&a_) {} - - inline operator QString() const { return *a; } - -private: - const QString *a; -}; - - - -template <typename A, typename B> -class QStringBuilderPair -{ -public: - QStringBuilderPair(const A &a_, const B &b_) : a(a_), b(b_) {} - - inline int size() const - { - return qStringBuilderSize(a) + qStringBuilderSize(b); - } -//private: - const A &a; - const B &b; -}; template <typename A, typename B> QStringBuilder< QStringBuilderPair<A, B> > @@ -197,18 +194,6 @@ operator%(const A &a, const B &b) return QStringBuilderPair<A, B> (a, b); } -template <typename A, typename B> -inline void qStringBuilderAppend(const QStringBuilderPair<A, B> &p, QChar *&out) -{ - qStringBuilderAppend(p.a, out); - qStringBuilderAppend(p.b, out); -} - -template <typename A, typename B> -inline int qStringBuilderSize(const QStringBuilderPair<A, B> &p) -{ - return qStringBuilderSize(p.a) + qStringBuilderSize(p.b); -} QT_END_NAMESPACE diff --git a/tests/benchmarks/qstringbuilder/main.cpp b/tests/benchmarks/qstringbuilder/main.cpp index d5aea2d96c3fad283a3c578efc418c67d762e974..b8f087346b36b5c17d5ebd273a3fdf7167608349 100644 --- a/tests/benchmarks/qstringbuilder/main.cpp +++ b/tests/benchmarks/qstringbuilder/main.cpp @@ -124,11 +124,11 @@ private slots: } void b_string_l1string() { QBENCHMARK { r = string % l1string; } - COMPARE(r, string + l1literal); + COMPARE(r, string + l1string); } void s_string_l1literal() { - QBENCHMARK { r = string + l1literal; } - COMPARE(r, QString(string % l1string)); + QBENCHMARK { r = string + l1string; } + COMPARE(r, QString(string % l1literal)); } void s_string_l1string() { QBENCHMARK { r = string + l1string; }