@@ -11,8 +11,9 @@ template <typename Key, typename Value>
1111using fifo_cache_t = typename caches::fixed_sized_cache<Key, Value, caches::FIFOCachePolicy>;
1212#else
1313template <typename Key, typename Value>
14- using fifo_cache_t = typename caches::fixed_sized_cache<Key, Value, caches::FIFOCachePolicy,
15- phmap::node_hash_map<Key, Value>>;
14+ using fifo_cache_t =
15+ typename caches::fixed_sized_cache<Key, Value, caches::FIFOCachePolicy,
16+ phmap::node_hash_map<Key, std::shared_ptr<Value>>>;
1617#endif /* CUSTOM_HASHMAP */
1718
1819TEST (FIFOCache, Simple_Test)
@@ -23,17 +24,17 @@ TEST(FIFOCache, Simple_Test)
2324 fc.Put (2 , 20 );
2425
2526 EXPECT_EQ (fc.Size (), 2 );
26- EXPECT_EQ (fc.Get (1 ), 10 );
27- EXPECT_EQ (fc.Get (2 ), 20 );
27+ EXPECT_EQ (* fc.Get (1 ), 10 );
28+ EXPECT_EQ (* fc.Get (2 ), 20 );
2829
2930 fc.Put (1 , 30 );
3031 EXPECT_EQ (fc.Size (), 2 );
31- EXPECT_EQ (fc.Get (1 ), 30 );
32+ EXPECT_EQ (* fc.Get (1 ), 30 );
3233
3334 fc.Put (3 , 30 );
3435 EXPECT_THROW (fc.Get (1 ), std::range_error);
35- EXPECT_EQ (fc.Get (2 ), 20 );
36- EXPECT_EQ (fc.Get (3 ), 30 );
36+ EXPECT_EQ (* fc.Get (2 ), 20 );
37+ EXPECT_EQ (* fc.Get (3 ), 30 );
3738}
3839
3940TEST (FIFOCache, Missing_Value)
@@ -43,7 +44,7 @@ TEST(FIFOCache, Missing_Value)
4344 fc.Put (1 , 10 );
4445
4546 EXPECT_EQ (fc.Size (), 1 );
46- EXPECT_EQ (fc.Get (1 ), 10 );
47+ EXPECT_EQ (* fc.Get (1 ), 10 );
4748 EXPECT_THROW (fc.Get (2 ), std::range_error);
4849}
4950
@@ -61,7 +62,7 @@ TEST(FIFOCache, Sequence_Test)
6162
6263 for (size_t i = 0 ; i < TEST_SIZE; ++i)
6364 {
64- EXPECT_EQ (fc.Get (std::to_string (' 0' + i)), i);
65+ EXPECT_EQ (* fc.Get (std::to_string (' 0' + i)), i);
6566 }
6667
6768 // replace a half
@@ -79,12 +80,12 @@ TEST(FIFOCache, Sequence_Test)
7980
8081 for (size_t i = 0 ; i < TEST_SIZE / 2 ; ++i)
8182 {
82- EXPECT_EQ (fc.Get (std::to_string (' a' + i)), i);
83+ EXPECT_EQ (* fc.Get (std::to_string (' a' + i)), i);
8384 }
8485
8586 for (size_t i = TEST_SIZE / 2 ; i < TEST_SIZE; ++i)
8687 {
87- EXPECT_EQ (fc.Get (std::to_string (' 0' + i)), i);
88+ EXPECT_EQ (* fc.Get (std::to_string (' 0' + i)), i);
8889 }
8990}
9091
@@ -127,7 +128,7 @@ TEST(FIFOCache, TryGet)
127128 {
128129 auto element = cache.TryGet (std::to_string (i));
129130 EXPECT_TRUE (element.second );
130- EXPECT_EQ (element.first -> second , i);
131+ EXPECT_EQ (* element.first , i);
131132 }
132133
133134 for (std::size_t i = TEST_CASE; i < TEST_CASE * 2 ; ++i)
@@ -136,3 +137,44 @@ TEST(FIFOCache, TryGet)
136137 EXPECT_FALSE (element.second );
137138 }
138139}
140+
141+ TEST (FIFOCache, GetWithReplacement)
142+ {
143+ fifo_cache_t <std::string, std::size_t > cache{2 };
144+
145+ cache.Put (" 1" , 1 );
146+ cache.Put (" 2" , 2 );
147+
148+ auto element1 = cache.Get (" 1" );
149+ auto element2 = cache.Get (" 2" );
150+ EXPECT_EQ (*element1, 1 );
151+ EXPECT_EQ (*element2, 2 );
152+ cache.Put (" 3" , 3 );
153+ auto element3 = cache.Get (" 3" );
154+ EXPECT_EQ (*element3, 3 );
155+
156+ std::string replaced_key;
157+
158+ for (size_t i = 1 ; i <= 2 ; ++i)
159+ {
160+ const auto key = std::to_string (i);
161+
162+ if (!cache.Cached (key))
163+ {
164+ replaced_key = key;
165+ }
166+ }
167+
168+ EXPECT_FALSE (cache.Cached (replaced_key));
169+ EXPECT_FALSE (cache.TryGet (replaced_key).second );
170+ EXPECT_THROW (cache.Get (replaced_key), std::range_error);
171+ EXPECT_EQ (*element1, 1 );
172+ EXPECT_EQ (*element2, 2 );
173+ EXPECT_EQ (*element3, 3 );
174+ }
175+
176+ TEST (FIFOCache, InvalidSize)
177+ {
178+ using test_type = fifo_cache_t <std::string, int >;
179+ EXPECT_THROW (test_type cache{0 }, std::invalid_argument);
180+ }
0 commit comments