void LruCacheTest::ClearTestHelper(int keyCount) { size_t cacheLimit = keyCount; size_t bucketCount = 128; auto cacheSPtr = make_shared<TestCache>(cacheLimit, bucketCount); for (auto ix=0; ix<keyCount; ++ix) { auto key = wformatString("key{0}", ix); SyncTryPut(*cacheSPtr, key, true); SyncTryGet(*cacheSPtr, key, true); } vector<weak_ptr<TestCacheEntry>> weakPtrs; for (auto ix=0; ix<keyCount; ++ix) { auto key = wformatString("key{0}", ix); TestCacheEntrySPtr entry; cacheSPtr->TryGet(key, entry); weak_ptr<TestCacheEntry> weakPtr(entry); entry.reset(); VERIFY_IS_TRUE_FMT(weakPtr.use_count() == 1, "{0}: wptr use_count {1} != 1", key, weakPtr.use_count()); VERIFY_IS_TRUE_FMT(weakPtr.lock().get() != nullptr, "{0}: wptr lock() failed", key); VERIFY_IS_TRUE_FMT(!weakPtr.expired(), "{0}: wptr expired {1}", key, weakPtr.expired()); weakPtr.reset(); cacheSPtr->TryGet(key, entry); weakPtrs.push_back(weak_ptr<TestCacheEntry>(entry)); } cacheSPtr.reset(); for (auto ix=0; ix<keyCount; ++ix) { auto key = wformatString("key{0}", ix); auto & weakPtr = weakPtrs[ix]; VERIFY_IS_TRUE_FMT(weakPtr.use_count() == 0, "{0}: wptr use_count {1} != 0", key, weakPtr.use_count()); VERIFY_IS_TRUE_FMT(weakPtr.lock().get() == nullptr, "{0}: wptr lock() succeeded", key); VERIFY_IS_TRUE_FMT(weakPtr.expired(), "{0}: wptr !expired", key, weakPtr.expired()); } }
//================================================================================================= BaseObject* BaseObject::TryGet(cstring id, bool* is_variant) { assert(id); if(strcmp(id, "painting") == 0) { if(is_variant) *is_variant = true; return TryGet(GetRandomPainting()); } if(strcmp(id, "tombstone") == 0) { if(is_variant) *is_variant = true; int id = Random(0, 9); if(id != 0) return TryGet(Format("tombstone_x%d", id)); else return TryGet("tombstone_1"); } if(strcmp(id, "random") == 0) { switch(Rand() % 3) { case 0: return TryGet("wheel"); case 1: return TryGet("rope"); case 2: return TryGet("woodpile"); } } for(uint i = 0; i < n_objs; ++i) { if(strcmp(objs[i].id, id) == 0) return &objs[i]; } return nullptr; }