From 2d4954810bbfe22a38fea8cb056f4961e4e524b3 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Sat, 9 Aug 2014 21:25:57 +0200 Subject: QDataWidgetMapper: micro-optimize clearMapping() QList::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 Reviewed-by: Friedemann Kleint --- src/widgets/itemviews/qdatawidgetmapper.cpp | 9 +++++---- 1 file 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 copy; + d->widgetMap.swap(copy); // a C++98 move + for (std::reverse_iterator::const_iterator> it(copy.cend()), end(copy.cbegin()); it != end; ++it) { + if (it->widget) + it->widget->removeEventFilter(d->delegate); } } -- cgit v1.2.3