@@ -20,7 +20,7 @@ use std::{
2020 ptr:: NonNull ,
2121} ;
2222
23- use crate :: { HashMap , HashSet , DefaultHasher } ;
23+ use crate :: { DefaultHasher , HashMap , LruCache } ;
2424use lazy_static:: lazy_static;
2525
2626use super :: { KeyRef , KeyWrapper } ;
@@ -118,7 +118,7 @@ impl<K, V> LfuEntry<K, V> {
118118/// ```
119119pub struct LfuCache < K , V , S > {
120120 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 > > ,
122122 cap : usize ,
123123 max_freq : u8 ,
124124 min_freq : u8 ,
@@ -402,7 +402,8 @@ impl<K: Hash + Eq, V, S: BuildHasher> LfuCache<K, V, S> {
402402 self . times_map
403403 . entry ( freq)
404404 . or_default ( )
405- . insert ( ( * entry) . key_ref ( ) ) ;
405+ . reserve ( 1 )
406+ . insert ( ( * entry) . key_ref ( ) , ( ) ) ;
406407
407408 self . check_reduce ( ) ;
408409 }
@@ -427,7 +428,8 @@ impl<K: Hash + Eq, V, S: BuildHasher> LfuCache<K, V, S> {
427428 self . times_map
428429 . entry ( next)
429430 . or_default ( )
430- . insert ( ( * node) . key_ref ( ) ) ;
431+ . reserve ( 1 )
432+ . insert ( ( * node) . key_ref ( ) , ( ) ) ;
431433 }
432434 }
433435 }
@@ -833,14 +835,15 @@ impl<K: Hash + Eq, V, S: BuildHasher> LfuCache<K, V, S> {
833835 }
834836 }
835837
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)
844847 }
845848}
846849
@@ -941,7 +944,7 @@ impl<'a, K: Hash + Eq, V, S: BuildHasher> Iterator for Iter<'a, K, V, S> {
941944 if let Some ( s) = self . base . times_map . get ( & i) {
942945 if s. len ( ) != 0 {
943946 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 ( ) ) ;
945948 break ;
946949 }
947950 }
@@ -980,7 +983,7 @@ impl<'a, K: Hash + Eq, V, S: BuildHasher> DoubleEndedIterator for Iter<'a, K, V,
980983 if let Some ( s) = self . base . times_map . get ( & i) {
981984 if s. len ( ) != 0 {
982985 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 ( ) ) ;
984987 break ;
985988 }
986989 }
@@ -1035,7 +1038,7 @@ impl<'a, K: Hash + Eq, V, S: BuildHasher> Iterator for IterMut<'a, K, V, S> {
10351038 if let Some ( s) = self . base . times_map . get ( & i) {
10361039 if s. len ( ) != 0 {
10371040 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 ( ) ) ;
10391042 break ;
10401043 }
10411044 }
@@ -1074,7 +1077,7 @@ impl<'a, K: Hash + Eq, V, S: BuildHasher> DoubleEndedIterator for IterMut<'a, K,
10741077 if let Some ( s) = self . base . times_map . get ( & i) {
10751078 if s. len ( ) != 0 {
10761079 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 ( ) ) ;
10781081 break ;
10791082 }
10801083 }
0 commit comments