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
parent
1c73a237ce
commit
2d4954810b
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue