summaryrefslogtreecommitdiffstats
path: root/src/corelib/text/qunicodetools.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/corelib/text/qunicodetools.cpp')
-rw-r--r--src/corelib/text/qunicodetools.cpp28
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: