aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/util/qquickstate.cpp
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2019-07-01 23:10:14 +0200
committerMarc Mutz <marc.mutz@kdab.com>2019-07-04 12:31:14 +0200
commitd425848d0c09c49a734d1832e3a9f8e6fa12541b (patch)
treedb737c6beae3cd901ab2c9a7c295f5eb65797dc4 /src/quick/util/qquickstate.cpp
parent9db3ec26136aa7a7ea58c85c92f5c6288e50e8f5 (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.cpp14
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());
}
}