diff options
| author | Dan Goodliffe <dan@randomdan.homeip.net> | 2016-01-05 21:21:31 +0000 | 
|---|---|---|
| committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2016-01-05 21:21:31 +0000 | 
| commit | af7b05e4f6116f21c3d43a5558e87681215cab44 (patch) | |
| tree | f2e38f2d1f97c67a17d80fbe1d4d485e0d0711ce | |
| parent | Test with a class that has suitable semantics instead of a POD type (diff) | |
| download | libadhocutil-af7b05e4f6116f21c3d43a5558e87681215cab44.tar.bz2 libadhocutil-af7b05e4f6116f21c3d43a5558e87681215cab44.tar.xz libadhocutil-af7b05e4f6116f21c3d43a5558e87681215cab44.zip | |
Add support explicitly removing an item from the cache
| -rw-r--r-- | libadhocutil/cache.h | 3 | ||||
| -rw-r--r-- | libadhocutil/cache.impl.h | 8 | ||||
| -rw-r--r-- | libadhocutil/unittests/testCache.cpp | 20 | 
3 files changed, 31 insertions, 0 deletions
| diff --git a/libadhocutil/cache.h b/libadhocutil/cache.h index 06d4d5a..72ad879 100644 --- a/libadhocutil/cache.h +++ b/libadhocutil/cache.h @@ -92,6 +92,9 @@ class DLL_PUBLIC Cache {  		 * determine or estimate the amount of memory used by items in the cache without further  		 * knowledge of the items themselves. */  		size_t size() const; +		/** Explicitly remove an item from the cache. +		 * @param k Cache key to remove. */ +		void remove(const K & k);  	private:  		void DLL_PRIVATE prune() const; diff --git a/libadhocutil/cache.impl.h b/libadhocutil/cache.impl.h index 7b0340c..c07d9c0 100644 --- a/libadhocutil/cache.impl.h +++ b/libadhocutil/cache.impl.h @@ -119,6 +119,14 @@ Cache<T, K>::size() const  template<typename T, typename K>  void +Cache<T, K>::remove(const K & k) +{ +	Lock(lock); +	cached.template get<byKey>().erase(k); +} + +template<typename T, typename K> +void  Cache<T, K>::prune() const  {  	auto now = time(NULL); diff --git a/libadhocutil/unittests/testCache.cpp b/libadhocutil/unittests/testCache.cpp index 650e3c7..1f41836 100644 --- a/libadhocutil/unittests/testCache.cpp +++ b/libadhocutil/unittests/testCache.cpp @@ -63,6 +63,26 @@ BOOST_AUTO_TEST_CASE( hit )  	BOOST_REQUIRE_EQUAL(vu, tc.getItem("key")->validUntil);  	BOOST_REQUIRE_EQUAL("key", tc.getItem("key")->key);  	BOOST_REQUIRE_EQUAL(1, tc.size()); +	tc.remove("key"); +	BOOST_REQUIRE_EQUAL(0, tc.size()); +} + +BOOST_AUTO_TEST_CASE( multivalues ) +{ +	TestCache tc; +	auto vu = time(NULL) + 5; +	tc.add("key1", 1, vu); +	tc.add("key2", 2, vu); +	tc.add("key3", 3, vu); +	BOOST_REQUIRE_EQUAL(3, tc.size()); +	BOOST_REQUIRE_EQUAL(1, *tc.get("key1")); +	BOOST_REQUIRE_EQUAL(2, *tc.get("key2")); +	BOOST_REQUIRE_EQUAL(3, *tc.get("key3")); +	tc.remove("key1"); +	BOOST_REQUIRE_EQUAL(2, tc.size()); +	BOOST_REQUIRE(!tc.get("key1")); +	BOOST_REQUIRE_EQUAL(2, *tc.get("key2")); +	BOOST_REQUIRE_EQUAL(3, *tc.get("key3"));  }  BOOST_AUTO_TEST_CASE( expired ) | 
