summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2016-02-29 10:02:45 +0100
committerMarc Mutz <marc.mutz@kdab.com>2016-02-29 17:38:56 +0000
commitc2e3c73a1cebb41c7fa05cc5b4f06463752de641 (patch)
tree795321d33714aabc647758a527706c057b5297b7 /src
parente0c418dc243b924dafd2acb25e239fab21a732f9 (diff)
QScene: port QMultiHash::values() to equal_range()
This avoids the double-lookup of values() followed by remove(), and the creation of the temporary QList as the return value of values(). Saves ~0.5KiB in text size on optimized GCC 5.3 Linux AMD64 builds. Change-Id: I5e43d8f408a436a7974dcbc7ef58d3a84bf40340 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/core/qscene.cpp11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/core/qscene.cpp b/src/core/qscene.cpp
index 40e6eff65..c8cc990a3 100644
--- a/src/core/qscene.cpp
+++ b/src/core/qscene.cpp
@@ -124,12 +124,13 @@ void QScene::removeObservable(QNode *observable)
if (observable != Q_NULLPTR) {
QWriteLocker lock(&d->m_lock);
QNodeId nodeUuid = observable->id();
- QObservableList observables = d->m_observablesLookupTable.values(nodeUuid);
- Q_FOREACH (QObservableInterface *o, observables) {
- o->setArbiter(Q_NULLPTR);
- d->m_observableToUuid.remove(o);
+ const auto p = d->m_observablesLookupTable.equal_range(nodeUuid); // must be non-const equal_range to ensure p.second stays valid
+ auto it = p.first;
+ while (it != p.second) {
+ it.value()->setArbiter(nullptr);
+ d->m_observableToUuid.remove(it.value());
+ it = d->m_observablesLookupTable.erase(it);
}
- d->m_observablesLookupTable.remove(nodeUuid);
d->m_nodeLookupTable.remove(nodeUuid);
observable->d_func()->setArbiter(Q_NULLPTR);
}