diff options
author | Marc Mutz <marc.mutz@kdab.com> | 2016-02-29 10:02:45 +0100 |
---|---|---|
committer | Marc Mutz <marc.mutz@kdab.com> | 2016-02-29 17:38:56 +0000 |
commit | c2e3c73a1cebb41c7fa05cc5b4f06463752de641 (patch) | |
tree | 795321d33714aabc647758a527706c057b5297b7 /src | |
parent | e0c418dc243b924dafd2acb25e239fab21a732f9 (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.cpp | 11 |
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); } |