summaryrefslogtreecommitdiffstats
path: root/src/widgets/itemviews/qdatawidgetmapper.cpp
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2014-08-09 21:25:57 +0200
committerMarc Mutz <marc.mutz@kdab.com>2014-08-26 09:07:25 +0200
commit2d4954810bbfe22a38fea8cb056f4961e4e524b3 (patch)
treeba7dbc22c5b2ffb98e719b6b95d61da2a075360f /src/widgets/itemviews/qdatawidgetmapper.cpp
parent1c73a237cebe5ed0fb975cb33133316b278b9c9e (diff)
QDataWidgetMapper: micro-optimize clearMapping()
QList<WidgetMapper>::takeLast() is a needlessly expensive operation (involves copying a QPersistentModelIndex and a QPointer). Instead of looping over takeLast() until empty, reverse-iterate over the list and call removeEventFilter(), then clear the whole list. We reverse-iterate to preserve existing behavior. Also, since the original code popped the WidgetMapper instance before calling removeEventFilter(), we move the whole list into a local copy before iterating. There's little chance that a removeEventFilter() call will cause reentrancy into QDataWidgetMapper, but better safe than sorry. This and the previous change together save 448 bytes of text size in libQt5Widgets. Change-Id: I1bfe907751659f31e618aa05bbb7b840f0aa61f4 Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
Diffstat (limited to 'src/widgets/itemviews/qdatawidgetmapper.cpp')
-rw-r--r--src/widgets/itemviews/qdatawidgetmapper.cpp9
1 files changed, 5 insertions, 4 deletions
diff --git a/src/widgets/itemviews/qdatawidgetmapper.cpp b/src/widgets/itemviews/qdatawidgetmapper.cpp
index 8b9d6f9d6c..4158e00dfc 100644
--- a/src/widgets/itemviews/qdatawidgetmapper.cpp
+++ b/src/widgets/itemviews/qdatawidgetmapper.cpp
@@ -762,10 +762,11 @@ void QDataWidgetMapper::clearMapping()
{
Q_D(QDataWidgetMapper);
- while (!d->widgetMap.isEmpty()) {
- QWidget *w = d->widgetMap.takeLast().widget;
- if (w)
- w->removeEventFilter(d->delegate);
+ QList<QDataWidgetMapperPrivate::WidgetMapper> copy;
+ d->widgetMap.swap(copy); // a C++98 move
+ for (std::reverse_iterator<QList<QDataWidgetMapperPrivate::WidgetMapper>::const_iterator> it(copy.cend()), end(copy.cbegin()); it != end; ++it) {
+ if (it->widget)
+ it->widget->removeEventFilter(d->delegate);
}
}