From 2ec3334959f84b5ac49fe27a06e1c4723cc8f600 Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 20 May 2009 10:37:41 +0200 Subject: [PATCH] qstringbuilder: make it work for the char % string case --- src/libs/utils/qstringbuilder.cpp | 6 +- src/libs/utils/qstringbuilder.h | 80 +++++++++---------- tests/benchmarks/qstringbuilder/main.cpp | 59 +++++++++++--- .../qstringbuilder/qstringbuilder.pro | 6 +- 4 files changed, 91 insertions(+), 60 deletions(-) diff --git a/src/libs/utils/qstringbuilder.cpp b/src/libs/utils/qstringbuilder.cpp index f3925e56b5e..730966bfdb9 100644 --- a/src/libs/utils/qstringbuilder.cpp +++ b/src/libs/utils/qstringbuilder.cpp @@ -53,7 +53,7 @@ smaller chunks. Contrary to \c QLatin1String, a \c QLatin1Literal can retrieve its size - int \i{O(1)}. + without iterating over the literal. \ingroup tools \ingroup shared @@ -127,5 +127,7 @@ Creates a helper object containing both parameters. - This is the main function to build up + This is the main function to build up complex QStringBuilder objects from + smaller QStringBuilder objects. */ + diff --git a/src/libs/utils/qstringbuilder.h b/src/libs/utils/qstringbuilder.h index d9a5d9132cf..cef502bfcfd 100644 --- a/src/libs/utils/qstringbuilder.h +++ b/src/libs/utils/qstringbuilder.h @@ -46,14 +46,18 @@ #include +// Using this relies on chaning the QString::QString(QChar *, int) +// constructor to allocated an unitialized string of the given size. +//#define USE_CHANGED_QSTRING 1 + class QLatin1Literal { public: template QLatin1Literal(const char (&str)[N]) : m_size(N - 1), m_data(str) {} - int size() const { return m_size; } - const char *data() const { return m_data; } + inline int size() const { return m_size; } + inline const char *data() const { return m_data; } void append(QChar *&out) const { @@ -64,13 +68,18 @@ public: operator QString() const { +#ifdef USE_CHANGED_QSTRING + QString s(m_size, QChar(-1)); +#else QString s; s.resize(m_size); +#endif QChar *d = s.data(); append(d); return s; } + private: const int m_size; const char *m_data; @@ -84,8 +93,12 @@ public: operator QString() const { +#ifdef USE_CHANGED_QSTRING + QString s(this->size(), QChar(-1)); +#else QString s; s.resize(this->size()); +#endif QChar *d = s.data(); this->append(d); return s; @@ -115,35 +128,42 @@ private: }; -template <> -class QStringBuilder -{ -public: - QStringBuilder(char c_) : c(c_) {} +template +int qStringBuilderSize(const A a) { return a.size(); } - inline int size() const { return 1; } - inline void append(QChar *&out) const { *out++ = QLatin1Char(c); } - -private: - const char c; -}; +inline int qStringBuilderSize(const char) { return 1; } +template +inline void qStringBuilderAppend(const A a, QChar *&out) { a.append(out); } -template +inline void qStringBuilderAppend(char c, QChar *&out) { *out++ = QLatin1Char(c); } + + +template class QStringBuilderPair { public: QStringBuilderPair(A a_, B b_) : a(a_), b(b_) {} - inline int size() const { return a.size() + b.size(); } - inline void append(QChar *&out) const { a.append(out); b.append(out); } + + inline int size() const + { + return qStringBuilderSize(a) + qStringBuilderSize(b); + } + + inline void append(QChar *&out) const + { + qStringBuilderAppend(a, out); + qStringBuilderAppend(b, out); + } + private: A a; B b; }; -template +template QStringBuilder< QStringBuilderPair > operator%(const A &a, const B &b) { @@ -176,31 +196,5 @@ operator%(const QString &a, const QString &b) QStringBuilder > (a, b); } -// char related specializations - -template -inline QStringBuilder< QStringBuilderPair > > -operator%(const A &a, char b) -{ - return QStringBuilderPair > (a, b); -} - -template -inline QStringBuilder< QStringBuilderPair, B> > -operator%(char a, const B &b) -{ - return QStringBuilderPair, B> (a, b); -} - -inline QStringBuilder< - QStringBuilderPair, QStringBuilder > -> -operator%(const QString &a, char b) -{ - return QStringBuilderPair< - QStringBuilder, QStringBuilder - > (a, b); -} - #endif // QSTRINGBUILDER_H diff --git a/tests/benchmarks/qstringbuilder/main.cpp b/tests/benchmarks/qstringbuilder/main.cpp index ba5cfe0a762..d5a538f521b 100644 --- a/tests/benchmarks/qstringbuilder/main.cpp +++ b/tests/benchmarks/qstringbuilder/main.cpp @@ -1,12 +1,15 @@ +#include "qstringbuilder.h" + #include #include -#include "../../../src/libs/utils/qstringbuilder.h" - #include +#define COMPARE(a, b) QCOMPARE(a, b) +//#define COMPARE(a, b) + class tst_qstringbuilder : public QObject { Q_OBJECT @@ -20,14 +23,18 @@ private slots: void b_2_l1literal(); void b_3_l1literal(); void b_4_l1literal(); + void b_5_l1literal(); void b_string_4_char(); + void b_char_string_char(); // QString based for comparison void s_separator() { qDebug() << "\n-------- QString based ---------"; } void s_2_l1string(); void s_3_l1string(); void s_4_l1string(); + void s_5_l1string(); void s_string_4_char(); + void s_char_string_char(); private: const QLatin1Literal l1literal; @@ -48,28 +55,42 @@ void tst_qstringbuilder::b_2_l1literal() { QString result; QBENCHMARK { result = l1literal % l1literal; } - QCOMPARE(result, l1string + l1string); + COMPARE(result, l1string + l1string); } void tst_qstringbuilder::b_3_l1literal() { QString result; QBENCHMARK { result = l1literal % l1literal % l1literal; } - QCOMPARE(result, l1string + l1string + l1string); + COMPARE(result, l1string + l1string + l1string); } void tst_qstringbuilder::b_4_l1literal() { QString result; QBENCHMARK { result = l1literal % l1literal % l1literal % l1literal; } - QCOMPARE(result, l1string + l1string + l1string + l1string); + COMPARE(result, l1string + l1string + l1string + l1string); +} + +void tst_qstringbuilder::b_5_l1literal() +{ + QString result; + QBENCHMARK { result = l1literal % l1literal % l1literal % l1literal %l1literal; } + COMPARE(result, l1string + l1string + l1string + l1string + l1string); } void tst_qstringbuilder::b_string_4_char() { QString result; - QBENCHMARK { result = string + achar + achar + achar; } - QCOMPARE(result, QString(string % achar % achar % achar)); + QBENCHMARK { result = string + achar + achar + achar + achar; } + COMPARE(result, QString(string % achar % achar % achar % achar)); +} + +void tst_qstringbuilder::b_char_string_char() +{ + QString result; + QBENCHMARK { result = achar + string + achar; } + COMPARE(result, QString(achar % string % achar)); } @@ -77,28 +98,42 @@ void tst_qstringbuilder::s_2_l1string() { QString result; QBENCHMARK { result = l1string + l1string; } - QCOMPARE(result, QString(l1literal % l1literal)); + COMPARE(result, QString(l1literal % l1literal)); } void tst_qstringbuilder::s_3_l1string() { QString result; QBENCHMARK { result = l1string + l1string + l1string; } - QCOMPARE(result, QString(l1literal % l1literal % l1literal)); + COMPARE(result, QString(l1literal % l1literal % l1literal)); } void tst_qstringbuilder::s_4_l1string() { QString result; QBENCHMARK { result = l1string + l1string + l1string + l1string; } - QCOMPARE(result, QString(l1literal % l1literal % l1literal % l1literal)); + COMPARE(result, QString(l1literal % l1literal % l1literal % l1literal)); +} + +void tst_qstringbuilder::s_5_l1string() +{ + QString result; + QBENCHMARK { result = l1string + l1string + l1string + l1string + l1string; } + COMPARE(result, QString(l1literal % l1literal % l1literal % l1literal % l1literal)); } void tst_qstringbuilder::s_string_4_char() { QString result; - QBENCHMARK { result = string + achar + achar + achar; } - QCOMPARE(result, QString(string % achar % achar % achar)); + QBENCHMARK { result = string + achar + achar + achar + achar; } + COMPARE(result, QString(string % achar % achar % achar % achar)); +} + +void tst_qstringbuilder::s_char_string_char() +{ + QString result; + QBENCHMARK { result = achar + string + achar; } + COMPARE(result, QString(achar % string % achar)); } QTEST_MAIN(tst_qstringbuilder) diff --git a/tests/benchmarks/qstringbuilder/qstringbuilder.pro b/tests/benchmarks/qstringbuilder/qstringbuilder.pro index 81c42bc565d..578ca1d3ac7 100644 --- a/tests/benchmarks/qstringbuilder/qstringbuilder.pro +++ b/tests/benchmarks/qstringbuilder/qstringbuilder.pro @@ -1,12 +1,12 @@ load(qttest_p4) TEMPLATE = app TARGET = tst_qstringbuilder -DEPENDPATH += . -INCLUDEPATH += . +STRINGBUILDERDIR = ../../../src/libs/utils +INCLUDEPATH += $$STRINGBUILDERDIR QT -= gui CONFIG += release # Input -SOURCES += main.cpp +SOURCES += main.cpp $$STRINGBUILDERDIR/qstringbuilder.cpp