diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2014-07-28 20:46:18 -0700 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2014-08-19 03:39:30 +0200 |
commit | 55c1f54c5550848af9aa2ababb559b8f2346c912 (patch) | |
tree | 0b426db7202a334cc2c9f42cb9be0b39aa9db13a /src/corelib/tools | |
parent | 6dd759c8e947670f28dccba946138b7f8d609eaa (diff) |
Add rvalue-ref qualified overload of QByteArray::to{Upper,Lower}
Those operations aren't very common with QByteArray but this is easy to
optimize.
Qt Qt Creator
const & && const & &&
toLower 34 10 0 1
toUpper 3 1 0 0
Change-Id: I2097955f4c889ea5a21903c35ddbc0ff27bf62c5
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Reviewed-by: Olivier Goffart <ogoffart@woboq.com>
Diffstat (limited to 'src/corelib/tools')
-rw-r--r-- | src/corelib/tools/qbytearray.cpp | 24 | ||||
-rw-r--r-- | src/corelib/tools/qbytearray.h | 25 | ||||
-rw-r--r-- | src/corelib/tools/qstring_compat.cpp | 14 |
3 files changed, 56 insertions, 7 deletions
diff --git a/src/corelib/tools/qbytearray.cpp b/src/corelib/tools/qbytearray.cpp index 6b6a9d2c1a..8b2d48df66 100644 --- a/src/corelib/tools/qbytearray.cpp +++ b/src/corelib/tools/qbytearray.cpp @@ -2777,10 +2777,10 @@ static QByteArray toCase_template(T &input, const uchar * table) } if (firstBad == e) - return input; + return qMove(input); // transform the rest - QByteArray s = input; + QByteArray s = qMove(input); // will copy if T is const QByteArray char *b = s.begin(); // will detach if necessary char *p = b + (firstBad - orig_begin); e = b + s.size(); @@ -2790,13 +2790,19 @@ static QByteArray toCase_template(T &input, const uchar * table) return s; } +QByteArray QByteArray::toLower_helper(const QByteArray &a) +{ + return toCase_template(a, latin1_lowercased); +} -QByteArray QByteArray::toLower() const +QByteArray QByteArray::toLower_helper(QByteArray &a) { - return toCase_template(*this, latin1_lowercased); + return toCase_template(a, latin1_lowercased); } /*! + \fn QByteArray QByteArray::toUpper() const + Returns an uppercase copy of the byte array. The bytearray is interpreted as a Latin-1 encoded string. @@ -2805,9 +2811,15 @@ QByteArray QByteArray::toLower() const \sa toLower(), {8-bit Character Comparisons} */ -QByteArray QByteArray::toUpper() const + +QByteArray QByteArray::toUpper_helper(const QByteArray &a) +{ + return toCase_template(a, latin1_uppercased); +} + +QByteArray QByteArray::toUpper_helper(QByteArray &a) { - return toCase_template(*this, latin1_uppercased); + return toCase_template(a, latin1_uppercased); } /*! \fn void QByteArray::clear() diff --git a/src/corelib/tools/qbytearray.h b/src/corelib/tools/qbytearray.h index ba7fdbb10a..cb1ebf8493 100644 --- a/src/corelib/tools/qbytearray.h +++ b/src/corelib/tools/qbytearray.h @@ -264,8 +264,29 @@ public: void truncate(int pos); void chop(int n); +#if defined(Q_COMPILER_REF_QUALIFIERS) && !defined(QT_COMPILING_QSTRING_COMPAT_CPP) +# if defined(Q_CC_GNU) + // required due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61941 +# pragma push_macro("Q_REQUIRED_RESULT") +# undef Q_REQUIRED_RESULT +# define Q_REQUIRED_RESULT +# define Q_REQUIRED_RESULT_pushed +# endif + QByteArray toLower() const & Q_REQUIRED_RESULT + { return toLower_helper(*this); } + QByteArray toLower() && Q_REQUIRED_RESULT + { return toLower_helper(*this); } + QByteArray toUpper() const & Q_REQUIRED_RESULT + { return toUpper_helper(*this); } + QByteArray toUpper() && Q_REQUIRED_RESULT + { return toUpper_helper(*this); } +# ifdef Q_REQUIRED_RESULT_pushed +# pragma pop_macro("Q_REQUIRED_RESULT") +# endif +#else QByteArray toLower() const Q_REQUIRED_RESULT; QByteArray toUpper() const Q_REQUIRED_RESULT; +#endif QByteArray trimmed() const Q_REQUIRED_RESULT; QByteArray simplified() const Q_REQUIRED_RESULT; @@ -422,6 +443,10 @@ private: void expand(int i); QByteArray nulTerminated() const; + static QByteArray toLower_helper(const QByteArray &a); + static QByteArray toLower_helper(QByteArray &a); + static QByteArray toUpper_helper(const QByteArray &a); + static QByteArray toUpper_helper(QByteArray &a); friend class QByteRef; friend class QString; friend Q_CORE_EXPORT QByteArray qUncompress(const uchar *data, int nbytes); diff --git a/src/corelib/tools/qstring_compat.cpp b/src/corelib/tools/qstring_compat.cpp index 6613dfde8e..be74775c1a 100644 --- a/src/corelib/tools/qstring_compat.cpp +++ b/src/corelib/tools/qstring_compat.cpp @@ -39,11 +39,12 @@ ** ****************************************************************************/ -#if defined(QSTRING_H) +#if defined(QSTRING_H) || defined(QBYTEARRAY_H) # error "This file cannot be compiled with pre-compiled headers" #endif #define QT_COMPILING_QSTRING_COMPAT_CPP +#include "qbytearray.h" #include "qstring.h" QT_BEGIN_NAMESPACE @@ -64,4 +65,15 @@ QByteArray QString::toUtf8() const return toUtf8_helper(*this); } +// ditto, for qbytearray.h (because we're lazy) +QByteArray QByteArray::toLower() const +{ + return toLower_helper(*this); +} + +QByteArray QByteArray::toUpper() const +{ + return toUpper_helper(*this); +} + QT_END_NAMESPACE |