@@ -69,7 +69,7 @@ use crate::meter::count_meter::CountableMeter;
69
69
/// An LRU cache.
70
70
#[ derive( Clone ) ]
71
71
pub struct LruCache <
72
- K : Eq + Hash ,
72
+ K : Eq + Hash + Clone ,
73
73
V ,
74
74
S : BuildHasher = DefaultHashBuilder ,
75
75
M : CountableMeter < K , V > = Count ,
@@ -81,7 +81,7 @@ pub struct LruCache<
81
81
meter : M ,
82
82
}
83
83
84
- impl < K : Eq + Hash , V > LruCache < K , V > {
84
+ impl < K : Eq + Hash + Clone , V > LruCache < K , V > {
85
85
/// Creates an empty cache that can hold at most `capacity` items.
86
86
///
87
87
/// # Examples
@@ -101,7 +101,7 @@ impl<K: Eq + Hash, V> LruCache<K, V> {
101
101
}
102
102
}
103
103
104
- impl < K : Eq + Hash , V , M : CountableMeter < K , V > > LruCache < K , V , DefaultHashBuilder , M > {
104
+ impl < K : Eq + Hash + Clone , V , M : CountableMeter < K , V > > LruCache < K , V , DefaultHashBuilder , M > {
105
105
/// Creates an empty cache that can hold at most `capacity` as measured by `meter`.
106
106
///
107
107
/// You can implement the [`Meter`][meter] trait to allow custom metrics.
@@ -146,7 +146,7 @@ impl<K: Eq + Hash, V, M: CountableMeter<K, V>> LruCache<K, V, DefaultHashBuilder
146
146
}
147
147
}
148
148
149
- impl < K : Eq + Hash , V , S : BuildHasher > LruCache < K , V , S , Count > {
149
+ impl < K : Eq + Hash + Clone , V , S : BuildHasher > LruCache < K , V , S , Count > {
150
150
/// Creates an empty cache that can hold at most `capacity` items with the given hash builder.
151
151
pub fn with_hasher ( capacity : u64 , hash_builder : S ) -> LruCache < K , V , S , Count > {
152
152
LruCache {
@@ -159,13 +159,12 @@ impl<K: Eq + Hash, V, S: BuildHasher> LruCache<K, V, S, Count> {
159
159
}
160
160
}
161
161
162
- impl < K : Eq + Hash , V , S : BuildHasher , M : CountableMeter < K , V > > LruCache < K , V , S , M > {
162
+ impl < K : Eq + Hash + Clone , V , S : BuildHasher , M : CountableMeter < K , V > > LruCache < K , V , S , M > {
163
163
fn find_evict_candidate ( & mut self ) -> Option < K > {
164
- let iter = self . visited . iter_mut ( ) ;
165
164
let mut p: Option < K > = None ;
166
- for ( key, value) in iter {
165
+ for ( key, value) in self . visited . iter_mut ( ) {
167
166
if !( * value) && p. is_none ( ) {
168
- p = Some ( unsafe { std :: ptr :: read ( key) } )
167
+ p = Some ( key. clone ( ) )
169
168
}
170
169
if * value {
171
170
* value = false ;
@@ -175,18 +174,17 @@ impl<K: Eq + Hash, V, S: BuildHasher, M: CountableMeter<K, V>> LruCache<K, V, S,
175
174
}
176
175
177
176
fn peek_evict_candidate ( & self ) -> Option < K > {
178
- let iter = self . visited . iter ( ) ;
179
177
let mut p: Option < K > = None ;
180
- for ( key, value) in iter {
178
+ for ( key, value) in self . visited . iter ( ) {
181
179
if !( * value) && p. is_none ( ) {
182
- p = Some ( unsafe { std :: ptr :: read ( key) } )
180
+ p = Some ( key. clone ( ) )
183
181
}
184
182
}
185
183
p
186
184
}
187
185
}
188
186
189
- impl < K : Eq + Hash , V , S : BuildHasher , M : CountableMeter < K , V > > Cache < K , V , S , M >
187
+ impl < K : Eq + Hash + Clone , V , S : BuildHasher , M : CountableMeter < K , V > > Cache < K , V , S , M >
190
188
for LruCache < K , V , S , M >
191
189
{
192
190
/// Creates an empty cache that can hold at most `capacity` as measured by `meter` with the
@@ -339,8 +337,7 @@ impl<K: Eq + Hash, V, S: BuildHasher, M: CountableMeter<K, V>> Cache<K, V, S, M>
339
337
. meter
340
338
. sub ( self . current_measure , self . meter . measure ( & k, old) ) ;
341
339
} else {
342
- let clone_k = unsafe { std:: ptr:: read ( & k) } ;
343
- self . visited . replace ( clone_k, false ) ;
340
+ self . visited . replace ( k. clone ( ) , false ) ;
344
341
}
345
342
let old_val = self . map . replace ( k, v) ;
346
343
while self . size ( ) > self . capacity ( ) {
@@ -496,7 +493,7 @@ impl<K: Eq + Hash, V, S: BuildHasher, M: CountableMeter<K, V>> Cache<K, V, S, M>
496
493
}
497
494
}
498
495
499
- impl < K : Eq + Hash , V , S : BuildHasher , M : CountableMeter < K , V > > LruCache < K , V , S , M > {
496
+ impl < K : Eq + Hash + Clone , V , S : BuildHasher , M : CountableMeter < K , V > > LruCache < K , V , S , M > {
500
497
/// Returns an iterator over the cache's key-value pairs in least- to most-recently-used order.
501
498
///
502
499
/// Accessing the cache through the iterator does _not_ affect the cache's LRU state.
@@ -555,7 +552,7 @@ impl<K: Eq + Hash, V, S: BuildHasher, M: CountableMeter<K, V>> LruCache<K, V, S,
555
552
}
556
553
}
557
554
558
- impl < K : Eq + Hash , V , S : BuildHasher , M : CountableMeter < K , V > > Extend < ( K , V ) >
555
+ impl < K : Eq + Hash + Clone + Clone , V , S : BuildHasher , M : CountableMeter < K , V > > Extend < ( K , V ) >
559
556
for LruCache < K , V , S , M >
560
557
{
561
558
fn extend < I : IntoIterator < Item = ( K , V ) > > ( & mut self , iter : I ) {
@@ -565,15 +562,15 @@ impl<K: Eq + Hash, V, S: BuildHasher, M: CountableMeter<K, V>> Extend<(K, V)>
565
562
}
566
563
}
567
564
568
- impl < K : fmt:: Debug + Eq + Hash , V : fmt:: Debug , S : BuildHasher , M : CountableMeter < K , V > > fmt:: Debug
565
+ impl < K : fmt:: Debug + Eq + Hash + Clone , V : fmt:: Debug , S : BuildHasher , M : CountableMeter < K , V > > fmt:: Debug
569
566
for LruCache < K , V , S , M >
570
567
{
571
568
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
572
569
f. debug_map ( ) . entries ( self . iter ( ) . rev ( ) ) . finish ( )
573
570
}
574
571
}
575
572
576
- impl < K : Eq + Hash , V , S : BuildHasher , M : CountableMeter < K , V > > IntoIterator
573
+ impl < K : Eq + Hash + Clone , V , S : BuildHasher , M : CountableMeter < K , V > > IntoIterator
577
574
for LruCache < K , V , S , M >
578
575
{
579
576
type Item = ( K , V ) ;
@@ -584,7 +581,7 @@ impl<K: Eq + Hash, V, S: BuildHasher, M: CountableMeter<K, V>> IntoIterator
584
581
}
585
582
}
586
583
587
- impl < ' a , K : Eq + Hash , V , S : BuildHasher , M : CountableMeter < K , V > > IntoIterator
584
+ impl < ' a , K : Eq + Hash + Clone , V , S : BuildHasher , M : CountableMeter < K , V > > IntoIterator
588
585
for & ' a LruCache < K , V , S , M >
589
586
{
590
587
type Item = ( & ' a K , & ' a V ) ;
@@ -594,7 +591,7 @@ impl<'a, K: Eq + Hash, V, S: BuildHasher, M: CountableMeter<K, V>> IntoIterator
594
591
}
595
592
}
596
593
597
- impl < ' a , K : Eq + Hash , V , S : BuildHasher , M : CountableMeter < K , V > > IntoIterator
594
+ impl < ' a , K : Eq + Hash + Clone , V , S : BuildHasher , M : CountableMeter < K , V > > IntoIterator
598
595
for & ' a mut LruCache < K , V , S , M >
599
596
{
600
597
type Item = ( & ' a K , & ' a mut V ) ;
0 commit comments