diff options
Diffstat (limited to 'src/corelib/text/qunicodetools.cpp')
| -rw-r--r-- | src/corelib/text/qunicodetools.cpp | 28 |
1 files changed, 8 insertions, 20 deletions
diff --git a/src/corelib/text/qunicodetools.cpp b/src/corelib/text/qunicodetools.cpp index dd751709d8a..56fa41c51ab 100644 --- a/src/corelib/text/qunicodetools.cpp +++ b/src/corelib/text/qunicodetools.cpp @@ -388,16 +388,11 @@ static const uchar breakTable[BAfter + 1][QUnicodeTables::NumSentenceBreakClasse static void getSentenceBreaks(const char16_t *string, qsizetype len, QCharAttributes *attributes) { uchar state = SB::BAfter; // to meet SB1 - for (qsizetype i = 0; i != len; ++i) { - const qsizetype pos = i; - char32_t ucs4 = string[i]; - if (QChar::isHighSurrogate(ucs4) && i + 1 != len) { - ushort low = string[i + 1]; - if (QChar::isLowSurrogate(low)) { - ucs4 = QChar::surrogateToUcs4(ucs4, low); - ++i; - } - } + + QStringIterator it(QStringView{string, len}); + while (it.hasNext()) { + const qsizetype pos = it.index(); + const char32_t ucs4 = it.nextOrRawCodeUnit(); const auto prop = QUnicodeTables::properties(ucs4); QUnicodeTables::SentenceBreakClass ncls = (QUnicodeTables::SentenceBreakClass) prop->sentenceBreakClass; @@ -406,15 +401,8 @@ static void getSentenceBreaks(const char16_t *string, qsizetype len, QCharAttrib state = SB::breakTable[state][ncls]; if (Q_UNLIKELY(state == SB::Lookup)) { // SB8 state = SB::Break; - for (qsizetype lookahead = i + 1; lookahead < len; ++lookahead) { - char32_t ucs4 = string[lookahead]; - if (QChar::isHighSurrogate(ucs4) && lookahead + 1 != len) { - ushort low = string[lookahead + 1]; - if (QChar::isLowSurrogate(low)) { - ucs4 = QChar::surrogateToUcs4(ucs4, low); - ++lookahead; - } - } + for (auto lookahead = it; lookahead.hasNext(); /**/) { + const char32_t ucs4 = lookahead.nextOrRawCodeUnit(); const auto prop = QUnicodeTables::properties(ucs4); QUnicodeTables::SentenceBreakClass tcls = (QUnicodeTables::SentenceBreakClass) prop->sentenceBreakClass; @@ -427,7 +415,7 @@ static void getSentenceBreaks(const char16_t *string, qsizetype len, QCharAttrib case QUnicodeTables::SentenceBreak_Close: continue; case QUnicodeTables::SentenceBreak_Lower: - i = lookahead; + it = lookahead; state = SB::Initial; break; default: |
