diff options
author | Konstantin Ritt <ritt.ks@gmail.com> | 2011-10-18 12:27:24 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2011-10-18 14:15:50 +0200 |
commit | 74110936f0426248058e1ec1655b5c164bf40b70 (patch) | |
tree | 1761fdef058fc26a945323ea36d4ed6b30be590c | |
parent | 044770f9b004ff364a1581a4a442bcad2e663325 (diff) |
make fromWCharArray() and toWCharArray() inlined
because we may have the size of wchar_t varying,
we need to know which is the correct encoding: UTF-16 or UCS-4
Merge-request: 49
Change-Id: Ib5a1e7dea51d0cd8394e686634a36aae984fa072
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com>
-rw-r--r-- | src/corelib/tools/qstring.cpp | 33 | ||||
-rw-r--r-- | src/corelib/tools/qstring.h | 19 |
2 files changed, 25 insertions, 27 deletions
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index c22c8a9edd..9278c7b97f 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -939,7 +939,7 @@ int QString::grow(int size) \sa fromUtf16(), fromLatin1(), fromLocal8Bit(), fromUtf8(), fromUcs4() */ -/*! +/*! \fn QString QString::fromWCharArray(const wchar_t *string, int size) \since 4.2 Returns a copy of the \a string, where the encoding of \a string depends on @@ -950,14 +950,6 @@ int QString::grow(int size) \sa fromUtf16(), fromLatin1(), fromLocal8Bit(), fromUtf8(), fromUcs4(), fromStdWString() */ -QString QString::fromWCharArray(const wchar_t *string, int size) -{ - if (sizeof(wchar_t) == sizeof(QChar)) { - return fromUtf16((const ushort *)string, size); - } else { - return fromUcs4((uint *)string, size); - } -} /*! \fn std::wstring QString::toStdWString() const @@ -975,25 +967,25 @@ QString QString::fromWCharArray(const wchar_t *string, int size) \sa utf16(), toAscii(), toLatin1(), toUtf8(), toLocal8Bit() */ -template<typename T> int toUcs4_helper(const unsigned short *uc, int length, T *out) +// ### replace with QCharIterator +int QString::toUcs4_helper(const ushort *uc, int length, uint *out) { int i = 0; for (; i < length; ++i) { uint u = uc[i]; - if (QChar::isHighSurrogate(u) && i < length-1) { + if (QChar::isHighSurrogate(u) && i + 1 < length) { ushort low = uc[i+1]; if (QChar::isLowSurrogate(low)) { ++i; u = QChar::surrogateToUcs4(u, low); } } - *out = T(u); - ++out; + *out++ = u; } return i; } -/*! +/*! \fn int QString::toWCharArray(wchar_t *array) const \since 4.2 Fills the \a array with the data contained in this QString object. @@ -1011,15 +1003,6 @@ template<typename T> int toUcs4_helper(const unsigned short *uc, int length, T * \sa utf16(), toUcs4(), toAscii(), toLatin1(), toUtf8(), toLocal8Bit(), toStdWString() */ -int QString::toWCharArray(wchar_t *array) const -{ - if (sizeof(wchar_t) == sizeof(QChar)) { - memcpy(array, utf16(), sizeof(wchar_t)*length()); - return length(); - } else { - return toUcs4_helper<wchar_t>(utf16(), length(), array); - } -} /*! \fn QString::QString(const QString &other) @@ -3758,7 +3741,7 @@ QVector<uint> QString::toUcs4() const { QVector<uint> v(length()); uint *a = v.data(); - int len = toUcs4_helper<uint>(utf16(), length(), a); + int len = toUcs4_helper(d->data(), length(), a); v.resize(len); return v; } @@ -8783,7 +8766,7 @@ QVector<uint> QStringRef::toUcs4() const { QVector<uint> v(length()); uint *a = v.data(); - int len = toUcs4_helper<uint>(reinterpret_cast<const unsigned short *>(unicode()), length(), a); + int len = QString::toUcs4_helper(reinterpret_cast<const ushort *>(unicode()), length(), a); v.resize(len); return v; } diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h index b73a34a2a0..313b4769e7 100644 --- a/src/corelib/tools/qstring.h +++ b/src/corelib/tools/qstring.h @@ -415,8 +415,8 @@ public: static QString fromUcs4(const uint *, int size = -1); static QString fromRawData(const QChar *, int size); - int toWCharArray(wchar_t *array) const; - static QString fromWCharArray(const wchar_t *, int size = -1); + inline int toWCharArray(wchar_t *array) const; + static inline QString fromWCharArray(const wchar_t *string, int size = -1) Q_REQUIRED_RESULT; QString &setRawData(const QChar *unicode, int size); QString &setUnicode(const QChar *unicode, int size); @@ -625,6 +625,7 @@ private: const QChar *data2, int length2); static Data *fromLatin1_helper(const char *str, int size = -1); static Data *fromAscii_helper(const char *str, int size = -1); + static int toUcs4_helper(const ushort *uc, int length, uint *out); void replace_helper(uint *indices, int nIndices, int blen, const QChar *after, int alen); friend class QCharRef; friend class QTextCodec; @@ -771,6 +772,20 @@ inline QString QString::arg(const QString &a1, const QString &a2, const QString inline QString QString::section(QChar asep, int astart, int aend, SectionFlags aflags) const { return section(QString(asep), astart, aend, aflags); } +inline int QString::toWCharArray(wchar_t *array) const +{ + if (sizeof(wchar_t) == sizeof(QChar)) { + qMemCopy(array, d->data(), sizeof(QChar) * size()); + return size(); + } + return toUcs4_helper(d->data(), size(), reinterpret_cast<uint *>(array)); +} +inline QString QString::fromWCharArray(const wchar_t *string, int size) +{ + return sizeof(wchar_t) == sizeof(QChar) ? fromUtf16((const ushort *)string, size) + : fromUcs4((uint *)string, size); +} + class Q_CORE_EXPORT QCharRef { QString &s; |