From 273011f95ff3990dd813c5aaf8c3294e418980ed Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Wed, 27 May 2009 12:56:33 +0200
Subject: [PATCH] Revert "qstringbuilder: a version without QLatin1Literal"

This reverts commit 28303e861dfa53fb5b7388e2b0269a1abd5c0100.
---
 src/libs/utils/qstringbuilder.h          | 69 +++++++++++++-----------
 tests/benchmarks/qstringbuilder/main.cpp | 25 +++++----
 2 files changed, 49 insertions(+), 45 deletions(-)

diff --git a/src/libs/utils/qstringbuilder.h b/src/libs/utils/qstringbuilder.h
index 6054446b2cc..7a12ba6c386 100644
--- a/src/libs/utils/qstringbuilder.h
+++ b/src/libs/utils/qstringbuilder.h
@@ -57,9 +57,22 @@ QT_MODULE(Core)
 // constructor to allocated an unitialized string of the given size.
 //#define USE_CHANGED_QSTRING 1
 
-namespace {
+class QLatin1Literal
+{
+public:
+    template <int N>
+    QLatin1Literal(const char (&str)[N]) : m_size(N - 1), m_data(str) {}
 
-template <typename T> struct QConcatenable {};
+    inline int size() const { return m_size; }
+    inline const char *data() const { return m_data; }
+
+private:
+    const int m_size;
+    const char *m_data;
+};
+
+
+namespace {
 
 template <typename A, typename B>
 class QStringBuilder
@@ -73,6 +86,10 @@ public:
     const B &b;
 };
 
+// make sure the operator% defined below acts only on types we want to handle.
+template <typename T> struct QConcatenable {};
+
+
 template <typename A, typename B>
 QStringBuilder<A, B>::operator QString() const 
 {
@@ -90,7 +107,7 @@ QStringBuilder<A, B>::operator QString() const
 template <> struct QConcatenable<char>
 {
     typedef char type;
-    static inline int size(const char) { return 1; }
+    static int size(const char) { return 1; }
     static inline void appendTo(const char c, QChar *&out)
     {
         *out++ = QLatin1Char(c);
@@ -100,7 +117,7 @@ template <> struct QConcatenable<char>
 template <> struct QConcatenable<QLatin1Char>
 {
     typedef QLatin1Char type;
-    static inline int size(const QLatin1Char) { return 1; }
+    static int size(const QLatin1Char) { return 1; }
     static inline void appendTo(const QLatin1Char c, QChar *&out)
     {
         *out++ = c;
@@ -110,7 +127,7 @@ template <> struct QConcatenable<QLatin1Char>
 template <> struct QConcatenable<QLatin1String>
 {
     typedef QLatin1String type;
-    static inline int size(const QLatin1String &a) { return qstrlen(a.latin1()); }
+    static int size(const QLatin1String &a) { return qstrlen(a.latin1()); }
     static inline void appendTo(const QLatin1String &a, QChar *&out)
     {
         for (const char *s = a.latin1(); *s; )
@@ -119,10 +136,21 @@ template <> struct QConcatenable<QLatin1String>
 
 };
 
+template <> struct QConcatenable<QLatin1Literal>
+{
+    typedef QLatin1Literal type;
+    static int size(const QLatin1Literal &a) { return a.size(); }
+    static inline void appendTo(const QLatin1Literal &a, QChar *&out)
+    {
+        for (const char *s = a.data(); *s; )
+            *out++ = QLatin1Char(*s++);
+    }
+};
+
 template <> struct QConcatenable<QString>
 {
     typedef QString type;
-    static inline int size(const QString &a) { return a.size(); }
+    static int size(const QString &a) { return a.size(); }
     static inline void appendTo(const QString &a, QChar *&out)
     {
         const int n = a.size();
@@ -134,7 +162,7 @@ template <> struct QConcatenable<QString>
 template <> struct QConcatenable<QStringRef>
 {
     typedef QStringRef type;
-    static inline int size(const QStringRef &a) { return a.size(); }
+    static int size(const QStringRef &a) { return a.size(); }
     static inline void appendTo(QStringRef a, QChar *&out)
     {
         const int n = a.size();
@@ -143,36 +171,12 @@ template <> struct QConcatenable<QStringRef>
     }
 };
 
-template <int N>
-struct QConcatenable<const char[N]>
-{
-    typedef const char type[N];
-    static inline int size(const char *) { return N - 1; }
-    static inline void appendTo(const char *a, QChar *&out)
-    {
-        for (int i = 0; i < N - 1; ++i)
-            *out++ = QLatin1Char(*a++);
-    }
-};
-
-template <int N>
-struct QConcatenable<char[N]>
-{
-    typedef char type[N];
-    static inline int size(const char *) { return N - 1; }
-    static inline void appendTo(const char *a, QChar *&out)
-    {
-        for (int i = 0; i < N - 1; ++i)
-            *out++ = QLatin1Char(*a++);
-    }
-};
-
 
 template <typename A, typename B>
 struct QConcatenable< QStringBuilder<A, B> >
 {
     typedef QStringBuilder<A, B> type;
-    static inline int size(const type &p) 
+    static int size(const type &p) 
     {
         return QConcatenable<A>::size(p.a) + QConcatenable<B>::size(p.b);
     }
@@ -194,6 +198,7 @@ QStringBuilder<A, B> operator%(const A &a, const B &b)
     return QStringBuilder<A1, B1>(a, b);
 }
 
+
 QT_END_NAMESPACE
 
 QT_END_HEADER
diff --git a/tests/benchmarks/qstringbuilder/main.cpp b/tests/benchmarks/qstringbuilder/main.cpp
index 4010db0e60d..6cecfba6b48 100644
--- a/tests/benchmarks/qstringbuilder/main.cpp
+++ b/tests/benchmarks/qstringbuilder/main.cpp
@@ -13,17 +13,15 @@
 #define SEP(s) qDebug() << "\n\n-------- " s "  ---------";
 #define L(s) QLatin1String(s)
 
-const char l1literal[] = "some string literal";
-
 class tst_qstringbuilder : public QObject
 {
     Q_OBJECT
 
 public:
     tst_qstringbuilder()
-      :
-        l1string(l1literal),
-        ba(l1literal),
+      : l1literal("some string literal"),
+        l1string("some string literal"),
+        ba("some string literal"),
         string(l1string),
         stringref(&string, 2, 10),
         achar('c')
@@ -73,12 +71,12 @@ private slots:
     void separator_1() { SEP("literal + literal  (builder first)"); }
 
     void b_2_l1literal() {
-        QBENCHMARK { r = l1string % l1literal; }
+        QBENCHMARK { r = l1literal % l1literal; }
         COMPARE(r, l1string + l1string);
     }
     void s_2_l1string() {
         QBENCHMARK { r = l1string + l1string; }
-        COMPARE(r, QString(l1string % l1literal));
+        COMPARE(r, QString(l1literal % l1literal));
     }
 
 
@@ -141,37 +139,37 @@ private slots:
     void separator_3() { SEP("3 literals"); }
 
     void b_3_l1literal() {
-        QBENCHMARK { r = l1string % l1literal % l1literal; }
+        QBENCHMARK { r = l1literal % l1literal % l1literal; }
         COMPARE(r, l1string + l1string + l1string);
     }
     void s_3_l1string() {
         QBENCHMARK { r = l1string + l1string + l1string; }
-        COMPARE(r, QString(l1string % l1literal % l1literal));
+        COMPARE(r, QString(l1literal % l1literal % l1literal));
     }
 
 
     void separator_4() { SEP("4 literals"); }
 
     void b_4_l1literal() {
-        QBENCHMARK { r = l1string % l1literal % l1literal % l1literal; }
+        QBENCHMARK { r = l1literal % l1literal % l1literal % l1literal; }
         COMPARE(r, l1string + l1string + l1string + l1string);
     }
     void s_4_l1string() {
         QBENCHMARK { r = l1string + l1string + l1string + l1string; }
-        COMPARE(r, QString(l1string % l1literal % l1literal % l1literal));
+        COMPARE(r, QString(l1literal % l1literal % l1literal % l1literal));
     }
 
 
     void separator_5() { SEP("5 literals"); }
 
     void b_5_l1literal() {
-        QBENCHMARK { r = l1string % l1literal % l1literal % l1literal %l1literal; }
+        QBENCHMARK { r = l1literal % l1literal % l1literal % l1literal %l1literal; }
         COMPARE(r, l1string + l1string + l1string + l1string + l1string);
     }
 
     void s_5_l1string() {
         QBENCHMARK { r = l1string + l1string + l1string + l1string + l1string; }
-        COMPARE(r, QString(l1string % l1literal % l1literal % l1literal % l1literal));
+        COMPARE(r, QString(l1literal % l1literal % l1literal % l1literal % l1literal));
     }
 
 
@@ -262,6 +260,7 @@ private slots:
     }
 
 private:
+    const QLatin1Literal l1literal;
     const QLatin1String l1string;
     const QByteArray ba;
     const QString string;
-- 
GitLab