From 4682af483fd7f6e06e28c237f5029733927652fd Mon Sep 17 00:00:00 2001 From: Ievgenii Meshcheriakov Date: Thu, 7 Oct 2021 17:28:32 +0200 Subject: [PATCH] QString: Use QStringIterator in QtPrivate::isRightToLeft() This simplifies the code. While at it, also expand default case so changes in the QChar::Direction enum don't go unnoticed. Change-Id: Id52140b0aaf7fd259c4b8079462811603eb3ff93 Reviewed-by: Edward Welbourne Reviewed-by: Giuseppe D'Angelo Reviewed-by: Thiago Macieira --- src/corelib/text/qstring.cpp | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index ec813ee750..437fde6875 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -9974,20 +9974,12 @@ QDataStream &operator>>(QDataStream &in, QString &str) */ bool QtPrivate::isRightToLeft(QStringView string) noexcept { - const char16_t *p = string.utf16(); - const char16_t * const end = p + string.size(); int isolateLevel = 0; - while (p < end) { - uint ucs4 = *p; - if (QChar::isHighSurrogate(ucs4) && p < end - 1) { - char16_t low = p[1]; - if (QChar::isLowSurrogate(low)) { - ucs4 = QChar::surrogateToUcs4(ucs4, low); - ++p; - } - } - switch (QChar::direction(ucs4)) - { + + for (QStringIterator i(string); i.hasNext();) { + const char32_t c = i.next(); + + switch (QChar::direction(c)) { case QChar::DirRLI: case QChar::DirLRI: case QChar::DirFSI: @@ -10006,10 +9998,24 @@ bool QtPrivate::isRightToLeft(QStringView string) noexcept if (isolateLevel) break; return true; - default: + case QChar::DirEN: + case QChar::DirES: + case QChar::DirET: + case QChar::DirAN: + case QChar::DirCS: + case QChar::DirB: + case QChar::DirS: + case QChar::DirWS: + case QChar::DirON: + case QChar::DirLRE: + case QChar::DirLRO: + case QChar::DirRLE: + case QChar::DirRLO: + case QChar::DirPDF: + case QChar::DirNSM: + case QChar::DirBN: break; } - ++p; } return false; }