QT_USE_QSTRINGBUILDER to fix source compatibility
authorOlivier Goffart <olivier.goffart@nokia.com>
Fri, 6 May 2011 11:13:42 +0000 (13:13 +0200)
committerOlivier Goffart <olivier.goffart@nokia.com>
Wed, 18 May 2011 13:17:17 +0000 (15:17 +0200)
In 4.8 we added support for using StringBuilder with QByteArray.
But this is breaking source compatibility for people that used
QT_USE_FAST_OPERATOR_PLUS in Qt 4.7. So we introduce a new macro

Notice that QT_USE_FAST_CONCATENATION was not working without
QT_USE_FAST_OPERATOR_PLUS, so we remove the checking of that macro.

Reviewed-by: joao
(cherry picked from commit 8447f5616be731d78081f326bb9cb3f5aa9087a4)

doc/src/snippets/qstring/stringbuilder.cpp
src/corelib/tools/qbytearray.h
src/corelib/tools/qstring.cpp
src/corelib/tools/qstring.h
src/corelib/tools/qstringbuilder.h
src/qbase.pri
tests/auto/qstringbuilder1/tst_qstringbuilder1.cpp
tests/auto/qstringbuilder2/tst_qstringbuilder2.cpp
tests/auto/qstringbuilder3/tst_qstringbuilder3.cpp
tests/auto/qstringbuilder4/tst_qstringbuilder4.cpp

index 8ff1dd8..b8acbc1 100644 (file)
 //! [0]
 
 //! [3]
-    #define QT_USE_FAST_CONCATENATION
+    DEFINES *= QT_USE_QSTRINGBUILDER
 //! [3]
 
-//! [4]
-    #define QT_USE_FAST_CONCATENATION
-    #define QT_USE_FAST_OPERATOR_PLUS
-//! [4]
-
 //! [5]
     #include <QStringBuilder>
 
index 0627b4e..df58d95 100644 (file)
 #  ifdef QT_USE_FAST_OPERATOR_PLUS
 #    undef QT_USE_FAST_OPERATOR_PLUS
 #  endif
-#  ifdef QT_USE_FAST_CONCATENATION
-#    undef QT_USE_FAST_CONCATENATION
+#  ifdef QT_USE_QSTRINGBUILDER
+#    undef QT_USE_QSTRINGBUILDER
 #  endif
+
 #endif
 
 
@@ -559,8 +560,7 @@ inline bool operator>=(const QByteArray &a1, const char *a2)
 { return qstrcmp(a1, a2) >= 0; }
 inline bool operator>=(const char *a1, const QByteArray &a2)
 { return qstrcmp(a1, a2) >= 0; }
-#ifndef QT_USE_FAST_OPERATOR_PLUS
-# ifndef QT_USE_FAST_CONCATENATION
+#if !defined(QT_USE_QSTRINGBUILDER)
 inline const QByteArray operator+(const QByteArray &a1, const QByteArray &a2)
 { return QByteArray(a1) += a2; }
 inline const QByteArray operator+(const QByteArray &a1, const char *a2)
@@ -571,8 +571,7 @@ inline const QByteArray operator+(const char *a1, const QByteArray &a2)
 { return QByteArray(a1) += a2; }
 inline const QByteArray operator+(char a1, const QByteArray &a2)
 { return QByteArray(&a1, 1) += a2; }
-# endif // QT_USE_FAST_CONCATENATION
-#endif // QT_USE_FAST_OPERATOR_PLUS
+#endif // QT_USE_QSTRINGBUILDER
 inline QBool QByteArray::contains(const char *c) const
 { return QBool(indexOf(c) != -1); }
 inline QByteArray &QByteArray::replace(char before, const char *c)
@@ -615,7 +614,7 @@ QT_END_NAMESPACE
 
 QT_END_HEADER
 
-#ifdef QT_USE_FAST_CONCATENATION
+#ifdef QT_USE_QSTRINGBUILDER
 #include <QtCore/qstring.h>
 #endif
 
index 5493ba9..3b3f715 100644 (file)
@@ -777,16 +777,12 @@ const QString::Null QString::null = { };
 
     \snippet doc/src/snippets/qstring/stringbuilder.cpp 5
 
-    A more global approach is to include this define:
+    A more global approach which is the most convenient but
+    not entirely source compatible, is to this define in your
+    .pro file:
 
     \snippet doc/src/snippets/qstring/stringbuilder.cpp 3
 
-    and use \c{'%'} instead of \c{'+'} for string concatenation
-    everywhere. The third approach, which is the most convenient but
-    not entirely source compatible, is to include two defines:
-
-    \snippet doc/src/snippets/qstring/stringbuilder.cpp 4
-
     and the \c{'+'} will automatically be performed as the
     \c{QStringBuilder} \c{'%'} everywhere.
 
index 6418a8c..7c4367e 100644 (file)
@@ -1016,8 +1016,7 @@ inline int QByteArray::findRev(const QString &s, int from) const
 #  endif // QT3_SUPPORT
 #endif // QT_NO_CAST_TO_ASCII
 
-#ifndef QT_USE_FAST_OPERATOR_PLUS
-# ifndef QT_USE_FAST_CONCATENATION
+#if !defined(QT_USE_FAST_OPERATOR_PLUS) && !defined(QT_USE_QSTRINGBUILDER)
 inline const QString operator+(const QString &s1, const QString &s2)
 { QString t(s1); t += s2; return t; }
 inline const QString operator+(const QString &s1, QChar s2)
@@ -1038,8 +1037,7 @@ inline QT_ASCII_CAST_WARN const QString operator+(const QByteArray &ba, const QS
 inline QT_ASCII_CAST_WARN const QString operator+(const QString &s, const QByteArray &ba)
 { QString t(s); t += QString::fromAscii(ba.constData(), qstrnlen(ba.constData(), ba.size())); return t; }
 #  endif // QT_NO_CAST_FROM_ASCII
-# endif // QT_USE_FAST_CONCATENATION
-#endif // QT_USE_FAST_OPERATOR_PLUS
+#endif // QT_USE_QSTRINGBUILDER
 
 #ifndef QT_NO_STL
 inline std::string QString::toStdString() const
@@ -1288,7 +1286,7 @@ QT_END_NAMESPACE
 
 QT_END_HEADER
 
-#ifdef QT_USE_FAST_CONCATENATION
+#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
 #include <QtCore/qstringbuilder.h>
 #endif
 
index 2d3475f..029aa0b 100644 (file)
@@ -410,7 +410,9 @@ operator%(const A &a, const B &b)
    return QStringBuilder<typename QConcatenable<A>::type, typename QConcatenable<B>::type>(a, b);
 }
 
-#ifdef QT_USE_FAST_OPERATOR_PLUS
+// QT_USE_FAST_OPERATOR_PLUS was introduced in 4.7, QT_USE_QSTRINGBUILDER is to be used from 4.8 onwards
+// QT_USE_FAST_OPERATOR_PLUS does not remove the normal operator+ for QByteArray
+#if defined(QT_USE_FAST_OPERATOR_PLUS) || defined(QT_USE_QSTRINGBUILDER)
 template <typename A, typename B>
 QStringBuilder<typename QConcatenable<A>::type, typename QConcatenable<B>::type>
 operator+(const A &a, const B &b)
index 03f85cf..cf02978 100644 (file)
@@ -174,7 +174,7 @@ contains(QT_PRODUCT, OpenSource.*):DEFINES *= QT_OPENSOURCE
 DEFINES *= QT_NO_CAST_TO_ASCII QT_ASCII_CAST_WARNINGS
 contains(QT_CONFIG, gui-qt3support):DEFINES *= QT3_SUPPORT
 DEFINES *= QT_MOC_COMPAT #we don't need warnings from calling moc code in our generated code
-DEFINES *= QT_USE_FAST_OPERATOR_PLUS QT_USE_FAST_CONCATENATION
+DEFINES *= QT_USE_QSTRINGBUILDER
 
 TARGET = $$qtLibraryTarget($$TARGET$$QT_LIBINFIX) #do this towards the end
 
index 36b6b80..463f200 100644 (file)
@@ -44,8 +44,7 @@
 // this is the "no harm done" version. Only operator% is active,
 // with NO_CAST * defined
 #define P %
-#undef QT_USE_FAST_OPERATOR_PLUS
-#undef QT_USE_FAST_CONCATENATION
+#undef QT_USE_QSTRINGBUILDER
 #define QT_NO_CAST_FROM_ASCII
 #define QT_NO_CAST_TO_ASCII
 
index 88b1f73..bcf88cb 100644 (file)
@@ -45,8 +45,7 @@
 // based version
 // with NO_CAST * defined
 #define P +
-#define QT_USE_FAST_OPERATOR_PLUS
-#define QT_USE_FAST_CONCATENATION
+#define QT_USE_QSTRINGBUILDER
 #define QT_NO_CAST_FROM_ASCII
 #define QT_NO_CAST_TO_ASCII
 
index afc3333..338fbf4 100644 (file)
@@ -44,8 +44,7 @@
 // this is the "no harm done" version. Only operator% is active,
 // with NO_CAST * _not_ defined
 #define P %
-#undef QT_USE_FAST_OPERATOR_PLUS
-#undef QT_USE_FAST_CONCATENATION
+#undef QT_USE_QSTRINGBUILDER
 #undef QT_NO_CAST_FROM_ASCII
 #undef QT_NO_CAST_TO_ASCII
 
index ae4100a..d046e59 100644 (file)
@@ -45,8 +45,7 @@
 // based version
 // with NO_CAST * _not_ defined
 #define P +
-#define QT_USE_FAST_OPERATOR_PLUS
-#define QT_USE_FAST_CONCATENATION
+#define QT_USE_QSTRINGBUILDER
 #undef QT_NO_CAST_FROM_ASCII
 #undef QT_NO_CAST_TO_ASCII