@@ -37,17 +37,13 @@ impl<K: Clone + Eq + Hash, V> LruTimeCache<K, V> {
37
37
}
38
38
39
39
/// Retrieves a reference to the value stored under `key`, or `None` if the key doesn't exist.
40
- /// Also removes expired elements and updates the time.
41
- #[ allow( dead_code) ]
42
40
pub fn get ( & mut self , key : & K ) -> Option < & V > {
43
41
self . get_mut ( key) . map ( |value| & * value)
44
42
}
45
43
46
44
/// Retrieves a mutable reference to the value stored under `key`, or `None` if the key doesn't exist.
47
- /// Also removes expired elements and updates the time.
48
45
pub fn get_mut ( & mut self , key : & K ) -> Option < & mut V > {
49
46
let now = Instant :: now ( ) ;
50
- self . remove_expired_values ( now) ;
51
47
52
48
match self . map . raw_entry_mut ( ) . from_key ( key) {
53
49
hashlink:: linked_hash_map:: RawEntryMut :: Occupied ( mut occupied) => {
@@ -76,7 +72,6 @@ impl<K: Clone + Eq + Hash, V> LruTimeCache<K, V> {
76
72
77
73
/// Returns the size of the cache, i.e. the number of cached non-expired key-value pairs.
78
74
pub fn len ( & mut self ) -> usize {
79
- self . remove_expired_values ( Instant :: now ( ) ) ;
80
75
self . map . len ( )
81
76
}
82
77
@@ -87,13 +82,19 @@ impl<K: Clone + Eq + Hash, V> LruTimeCache<K, V> {
87
82
}
88
83
89
84
/// Removes expired items from the cache.
90
- fn remove_expired_values ( & mut self , now : Instant ) {
85
+ pub fn remove_expired_values ( & mut self ) -> Vec < K > {
86
+ let mut expired_elements = Vec :: new ( ) ;
87
+ let now = Instant :: now ( ) ;
91
88
while let Some ( ( _front, ( _value, time) ) ) = self . map . front ( ) {
92
89
if * time + self . ttl >= now {
93
90
break ;
94
91
}
95
- self . map . pop_front ( ) ;
92
+ // Store the expired key
93
+ if let Some ( ( k, _v) ) = self . map . pop_front ( ) {
94
+ expired_elements. push ( k) ;
95
+ }
96
96
}
97
+ expired_elements
97
98
}
98
99
}
99
100
@@ -204,6 +205,7 @@ mod tests {
204
205
assert_eq ! ( Some ( & 10 ) , cache. get( & 1 ) ) ;
205
206
206
207
sleep ( TTL ) ;
208
+ cache. remove_expired_values ( ) ;
207
209
assert_eq ! ( None , cache. get( & 1 ) ) ;
208
210
}
209
211
@@ -214,6 +216,7 @@ mod tests {
214
216
assert_eq ! ( Some ( & 10 ) , cache. peek( & 1 ) ) ;
215
217
216
218
sleep ( TTL ) ;
219
+ cache. remove_expired_values ( ) ;
217
220
assert_eq ! ( None , cache. peek( & 1 ) ) ;
218
221
}
219
222
@@ -224,6 +227,7 @@ mod tests {
224
227
assert_eq ! ( 1 , cache. len( ) ) ;
225
228
226
229
sleep ( TTL ) ;
230
+ cache. remove_expired_values ( ) ;
227
231
assert_eq ! ( 0 , cache. len( ) ) ;
228
232
}
229
233
@@ -232,12 +236,16 @@ mod tests {
232
236
let mut cache = LruTimeCache :: new ( TTL , None ) ;
233
237
cache. insert ( 1 , 10 ) ;
234
238
sleep ( TTL / 4 ) ;
239
+ cache. remove_expired_values ( ) ;
235
240
cache. insert ( 2 , 20 ) ;
236
241
sleep ( TTL / 4 ) ;
242
+ cache. remove_expired_values ( ) ;
237
243
cache. insert ( 3 , 30 ) ;
238
244
sleep ( TTL / 4 ) ;
245
+ cache. remove_expired_values ( ) ;
239
246
cache. insert ( 4 , 40 ) ;
240
247
sleep ( TTL / 4 ) ;
248
+ cache. remove_expired_values ( ) ;
241
249
242
250
assert_eq ! ( 3 , cache. len( ) ) ;
243
251
assert_eq ! ( None , cache. get( & 1 ) ) ;
0 commit comments