diff options
author | Joni Poikelin <joni.poikelin@qt.io> | 2020-03-25 12:15:17 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@qt.io> | 2020-08-19 14:38:17 +0200 |
commit | f6a57817798a1ade1eb643d0c532c98997f9d65a (patch) | |
tree | c0fdf9f90fea0219ea15b6bed98da6ef31db93b6 /src/gui | |
parent | 21635935a5532af2f9efb452e216a64244709a16 (diff) |
Avoid recreating QRegularExpression for every text block
With very complex regular expressions this makes a significant
difference in performance.
Change-Id: I5267bf71cae98dffb58ec7a1fc982dae639ff312
Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>
(cherry picked from commit d0b30de54299e8e6e8b1df0c138494c17c2b2642)
Reviewed-by: Joni Poikelin <joni.poikelin@qt.io>
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/text/qtextdocument.cpp | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp index b629264ee5..a633e5da11 100644 --- a/src/gui/text/qtextdocument.cpp +++ b/src/gui/text/qtextdocument.cpp @@ -1544,15 +1544,9 @@ QTextCursor QTextDocument::find(const QRegExp &expr, const QTextCursor &cursor, #endif // QT_REGEXP #if QT_CONFIG(regularexpression) -static bool findInBlock(const QTextBlock &block, const QRegularExpression &expression, int offset, +static bool findInBlock(const QTextBlock &block, const QRegularExpression &expr, int offset, QTextDocument::FindFlags options, QTextCursor *cursor) { - QRegularExpression expr(expression); - if (!(options & QTextDocument::FindCaseSensitively)) - expr.setPatternOptions(expr.patternOptions() | QRegularExpression::CaseInsensitiveOption); - else - expr.setPatternOptions(expr.patternOptions() & ~QRegularExpression::CaseInsensitiveOption); - QString text = block.text(); text.replace(QChar::Nbsp, QLatin1Char(' ')); QRegularExpressionMatch match; @@ -1619,16 +1613,22 @@ QTextCursor QTextDocument::find(const QRegularExpression &expr, int from, FindFl QTextBlock block = d->blocksFind(pos); int blockOffset = pos - block.position(); + QRegularExpression expression(expr); + if (!(options & QTextDocument::FindCaseSensitively)) + expression.setPatternOptions(expr.patternOptions() | QRegularExpression::CaseInsensitiveOption); + else + expression.setPatternOptions(expr.patternOptions() & ~QRegularExpression::CaseInsensitiveOption); + if (!(options & FindBackward)) { while (block.isValid()) { - if (findInBlock(block, expr, blockOffset, options, &cursor)) + if (findInBlock(block, expression, blockOffset, options, &cursor)) return cursor; block = block.next(); blockOffset = 0; } } else { while (block.isValid()) { - if (findInBlock(block, expr, blockOffset, options, &cursor)) + if (findInBlock(block, expression, blockOffset, options, &cursor)) return cursor; block = block.previous(); blockOffset = block.length() - 1; |