@@ -20,7 +20,7 @@ use std::{
20
20
ptr:: NonNull ,
21
21
} ;
22
22
23
- use crate :: { HashMap , HashSet , DefaultHasher } ;
23
+ use crate :: { DefaultHasher , HashMap , LruCache } ;
24
24
use lazy_static:: lazy_static;
25
25
26
26
use super :: { KeyRef , KeyWrapper } ;
@@ -118,7 +118,7 @@ impl<K, V> LfuEntry<K, V> {
118
118
/// ```
119
119
pub struct LfuCache < K , V , S > {
120
120
map : HashMap < KeyRef < K > , NonNull < LfuEntry < K , V > > , S > ,
121
- times_map : HashMap < u8 , HashSet < KeyRef < K > > > ,
121
+ times_map : HashMap < u8 , LruCache < KeyRef < K > , ( ) , DefaultHasher > > ,
122
122
cap : usize ,
123
123
max_freq : u8 ,
124
124
min_freq : u8 ,
@@ -402,7 +402,8 @@ impl<K: Hash + Eq, V, S: BuildHasher> LfuCache<K, V, S> {
402
402
self . times_map
403
403
. entry ( freq)
404
404
. or_default ( )
405
- . insert ( ( * entry) . key_ref ( ) ) ;
405
+ . reserve ( 1 )
406
+ . insert ( ( * entry) . key_ref ( ) , ( ) ) ;
406
407
407
408
self . check_reduce ( ) ;
408
409
}
@@ -427,7 +428,8 @@ impl<K: Hash + Eq, V, S: BuildHasher> LfuCache<K, V, S> {
427
428
self . times_map
428
429
. entry ( next)
429
430
. or_default ( )
430
- . insert ( ( * node) . key_ref ( ) ) ;
431
+ . reserve ( 1 )
432
+ . insert ( ( * node) . key_ref ( ) , ( ) ) ;
431
433
}
432
434
}
433
435
}
@@ -833,14 +835,15 @@ impl<K: Hash + Eq, V, S: BuildHasher> LfuCache<K, V, S> {
833
835
}
834
836
}
835
837
836
- fn _pop_one ( keys : & mut HashSet < KeyRef < K > > ) -> Option < KeyRef < K > > {
837
- let k = if let Some ( k) = keys. iter ( ) . next ( ) {
838
- KeyRef { k : k. k }
839
- } else {
840
- return None ;
841
- } ;
842
- keys. remove ( & k) ;
843
- Some ( k)
838
+ fn _pop_one ( keys : & mut LruCache < KeyRef < K > , ( ) , DefaultHasher > ) -> Option < KeyRef < K > > {
839
+ keys. pop ( ) . map ( |( k, _) | k)
840
+ // let k = if let Some(k) = keys.iter().next() {
841
+ // KeyRef { k: k.k }
842
+ // } else {
843
+ // return None;
844
+ // };
845
+ // keys.remove(&k);
846
+ // Some(k)
844
847
}
845
848
}
846
849
@@ -941,7 +944,7 @@ impl<'a, K: Hash + Eq, V, S: BuildHasher> Iterator for Iter<'a, K, V, S> {
941
944
if let Some ( s) = self . base . times_map . get ( & i) {
942
945
if s. len ( ) != 0 {
943
946
self . now_freq = i. saturating_sub ( 1 ) ;
944
- self . now_keys = Some ( s. iter ( ) . map ( |s| KeyRef { k : s. k } ) . collect ( ) ) ;
947
+ self . now_keys = Some ( s. iter ( ) . map ( |s| KeyRef { k : s. 0 . k } ) . collect ( ) ) ;
945
948
break ;
946
949
}
947
950
}
@@ -980,7 +983,7 @@ impl<'a, K: Hash + Eq, V, S: BuildHasher> DoubleEndedIterator for Iter<'a, K, V,
980
983
if let Some ( s) = self . base . times_map . get ( & i) {
981
984
if s. len ( ) != 0 {
982
985
self . now_freq = i. saturating_sub ( 1 ) ;
983
- self . now_keys = Some ( s. iter ( ) . map ( |s| KeyRef { k : s. k } ) . collect ( ) ) ;
986
+ self . now_keys = Some ( s. iter ( ) . map ( |s| KeyRef { k : s. 0 . k } ) . collect ( ) ) ;
984
987
break ;
985
988
}
986
989
}
@@ -1035,7 +1038,7 @@ impl<'a, K: Hash + Eq, V, S: BuildHasher> Iterator for IterMut<'a, K, V, S> {
1035
1038
if let Some ( s) = self . base . times_map . get ( & i) {
1036
1039
if s. len ( ) != 0 {
1037
1040
self . now_freq = i. saturating_sub ( 1 ) ;
1038
- self . now_keys = Some ( s. iter ( ) . map ( |s| KeyRef { k : s. k } ) . collect ( ) ) ;
1041
+ self . now_keys = Some ( s. iter ( ) . map ( |s| KeyRef { k : s. 0 . k } ) . collect ( ) ) ;
1039
1042
break ;
1040
1043
}
1041
1044
}
@@ -1074,7 +1077,7 @@ impl<'a, K: Hash + Eq, V, S: BuildHasher> DoubleEndedIterator for IterMut<'a, K,
1074
1077
if let Some ( s) = self . base . times_map . get ( & i) {
1075
1078
if s. len ( ) != 0 {
1076
1079
self . now_freq = i. saturating_sub ( 1 ) ;
1077
- self . now_keys = Some ( s. iter ( ) . map ( |s| KeyRef { k : s. k } ) . collect ( ) ) ;
1080
+ self . now_keys = Some ( s. iter ( ) . map ( |s| KeyRef { k : s. 0 . k } ) . collect ( ) ) ;
1078
1081
break ;
1079
1082
}
1080
1083
}
0 commit comments