diff options
author | Marc Mutz <marc.mutz@kdab.com> | 2019-07-01 23:10:14 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@kdab.com> | 2019-07-04 12:31:14 +0200 |
commit | d425848d0c09c49a734d1832e3a9f8e6fa12541b (patch) | |
tree | db737c6beae3cd901ab2c9a7c295f5eb65797dc4 /src/quick/util/qquickstate.cpp | |
parent | 9db3ec26136aa7a7ea58c85c92f5c6288e50e8f5 (diff) |
QQuickState: fix quadratic loop
QMutableListIterator::remove() is a linear operation, so calling it in a loop
makes the overall loop quadratic. Fix by using std::remove_if + lambda, which
is linear.
Change-Id: Ia37b0ff947bd214d3b411dc4c274bf673c7f5577
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
Diffstat (limited to 'src/quick/util/qquickstate.cpp')
-rw-r--r-- | src/quick/util/qquickstate.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/src/quick/util/qquickstate.cpp b/src/quick/util/qquickstate.cpp index 0d62960de9..d130cc1f8e 100644 --- a/src/quick/util/qquickstate.cpp +++ b/src/quick/util/qquickstate.cpp @@ -452,10 +452,7 @@ void QQuickState::removeAllEntriesFromRevertList(QObject *target) Q_D(QQuickState); if (isStateActive()) { - QMutableListIterator<QQuickSimpleAction> revertListIterator(d->revertList); - - while (revertListIterator.hasNext()) { - QQuickSimpleAction &simpleAction = revertListIterator.next(); + const auto actionMatchesTarget = [target](QQuickSimpleAction &simpleAction) { if (simpleAction.property().object() == target) { QQmlPropertyPrivate::removeBinding(simpleAction.property()); @@ -463,9 +460,14 @@ void QQuickState::removeAllEntriesFromRevertList(QObject *target) if (simpleAction.binding()) QQmlPropertyPrivate::setBinding(simpleAction.binding()); - revertListIterator.remove(); + return true; } - } + return false; + }; + + d->revertList.erase(std::remove_if(d->revertList.begin(), d->revertList.end(), + actionMatchesTarget), + d->revertList.end()); } } |