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>
bb10
Marc Mutz 2014-08-09 21:25:57 +02:00
parent 1c73a237ce
commit 2d4954810b
1 changed files with 5 additions and 4 deletions

View File

@ -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);
}
}