diff options
Diffstat (limited to 'src/corelib')
-rw-r--r-- | src/corelib/tools/qstring.cpp | 34 | ||||
-rw-r--r-- | src/corelib/tools/qstringalgorithms.h | 1 | ||||
-rw-r--r-- | src/corelib/tools/qstringview.cpp | 9 | ||||
-rw-r--r-- | src/corelib/tools/qstringview.h | 3 |
4 files changed, 44 insertions, 3 deletions
diff --git a/src/corelib/tools/qstring.cpp b/src/corelib/tools/qstring.cpp index 8093a26f7d..e6b4cc4b4f 100644 --- a/src/corelib/tools/qstring.cpp +++ b/src/corelib/tools/qstring.cpp @@ -8506,7 +8506,7 @@ bool QString::isSimpleText() const */ bool QString::isRightToLeft() const { - return QStringRef(this).isRightToLeft(); + return QtPrivate::isRightToLeft(QStringView(*this)); } /*! \fn QChar *QString::data() @@ -10778,8 +10778,23 @@ int QStringRef::count(const QStringRef &str, Qt::CaseSensitivity cs) const */ bool QStringRef::isRightToLeft() const { - const ushort *p = reinterpret_cast<const ushort*>(unicode()); - const ushort * const end = p + size(); + return QtPrivate::isRightToLeft(QStringView(unicode(), size())); +} + +/*! + \since 5.11 + \internal + \relates QStringView + + Returns \c true if the string is read right to left. + + \sa QString::isRightToLeft() +*/ +bool QtPrivate::isRightToLeft(QStringView string) +{ + const ushort *p = reinterpret_cast<const ushort*>(string.data()); + const ushort * const end = p + string.size(); + int isolateLevel = 0; while (p < end) { uint ucs4 = *p; if (QChar::isHighSurrogate(ucs4) && p < end - 1) { @@ -10791,10 +10806,23 @@ bool QStringRef::isRightToLeft() const } switch (QChar::direction(ucs4)) { + case QChar::DirRLI: + case QChar::DirLRI: + case QChar::DirFSI: + ++isolateLevel; + break; + case QChar::DirPDI: + if (isolateLevel) + --isolateLevel; + break; case QChar::DirL: + if (isolateLevel) + break; return false; case QChar::DirR: case QChar::DirAL: + if (isolateLevel) + break; return true; default: break; diff --git a/src/corelib/tools/qstringalgorithms.h b/src/corelib/tools/qstringalgorithms.h index aaa702301e..6146e525d9 100644 --- a/src/corelib/tools/qstringalgorithms.h +++ b/src/corelib/tools/qstringalgorithms.h @@ -80,6 +80,7 @@ Q_REQUIRED_RESULT Q_CORE_EXPORT QByteArray convertToLatin1(QStringView str); Q_REQUIRED_RESULT Q_CORE_EXPORT QByteArray convertToUtf8(QStringView str); Q_REQUIRED_RESULT Q_CORE_EXPORT QByteArray convertToLocal8Bit(QStringView str); Q_REQUIRED_RESULT Q_CORE_EXPORT QVector<uint> convertToUcs4(QStringView str); +Q_REQUIRED_RESULT Q_CORE_EXPORT bool isRightToLeft(QStringView string); } // namespace QtPRivate diff --git a/src/corelib/tools/qstringview.cpp b/src/corelib/tools/qstringview.cpp index 6321427a2d..f1abf13454 100644 --- a/src/corelib/tools/qstringview.cpp +++ b/src/corelib/tools/qstringview.cpp @@ -772,4 +772,13 @@ QT_BEGIN_NAMESPACE \sa QString::isNull(), QStringRef::isNull(), QStringView */ +/*! + \fn bool QStringView::isRightToLeft(); + \since 5.11 + + Returns \c true if the string is read right to left. + + \sa QString::isRightToLeft() +*/ + QT_END_NAMESPACE diff --git a/src/corelib/tools/qstringview.h b/src/corelib/tools/qstringview.h index ef442e5b65..480021a165 100644 --- a/src/corelib/tools/qstringview.h +++ b/src/corelib/tools/qstringview.h @@ -266,6 +266,9 @@ public: Q_REQUIRED_RESULT bool endsWith(QChar c, Qt::CaseSensitivity cs) const Q_DECL_NOTHROW { return QtPrivate::endsWith(*this, QStringView(&c, 1), cs); } + Q_REQUIRED_RESULT bool isRightToLeft() const Q_DECL_NOTHROW + { return QtPrivate::isRightToLeft(*this); } + // // STL compatibility API: // |