diff options
-rw-r--r-- | src/corelib/tools/qcache.h | 3 | ||||
-rw-r--r-- | tests/auto/corelib/tools/qcache/tst_qcache.cpp | 14 |
2 files changed, 16 insertions, 1 deletions
diff --git a/src/corelib/tools/qcache.h b/src/corelib/tools/qcache.h index 41cf9abc46..8a341c8555 100644 --- a/src/corelib/tools/qcache.h +++ b/src/corelib/tools/qcache.h @@ -245,8 +245,9 @@ public: auto result = d.findOrInsert(key); Node *n = result.it.node(); if (result.initialized) { - cost -= n->value.cost; + auto prevCost = n->value.cost; result.it.node()->emplace(object, cost); + cost -= prevCost; relink(key); } else { Node::createInPlace(n, key, object, cost); diff --git a/tests/auto/corelib/tools/qcache/tst_qcache.cpp b/tests/auto/corelib/tools/qcache/tst_qcache.cpp index 54cf00f9da..da6f1bb34b 100644 --- a/tests/auto/corelib/tools/qcache/tst_qcache.cpp +++ b/tests/auto/corelib/tools/qcache/tst_qcache.cpp @@ -49,6 +49,7 @@ private slots: void axioms_on_key_type(); void largeCache(); void internalChainOrderAfterEntryUpdate(); + void emplaceLowerCost(); }; @@ -431,5 +432,18 @@ void tst_QCache::internalChainOrderAfterEntryUpdate() QCOMPARE(cache.size(), 0); } +void tst_QCache::emplaceLowerCost() +{ + QCache<QString, int> cache; + cache.setMaxCost(5); + cache.insert("a", new int, 3); // insert high cost + cache.insert("a", new int, 1); // and then exchange it with a lower-cost object + QCOMPARE(cache.totalCost(), 1); + cache.remove("a"); // then remove the object + // The cache should now have a cost == 0 and be empty. + QCOMPARE(cache.totalCost(), 0); + QVERIFY(cache.isEmpty()); +} + QTEST_APPLESS_MAIN(tst_QCache) #include "tst_qcache.moc" |