Skip to content

Commit 281410b

Browse files
committed
fix lfu to hash
1 parent 9e700fb commit 281410b

File tree

4 files changed

+39
-17
lines changed

4 files changed

+39
-17
lines changed

src/cache/arc.rs

+6
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@ pub struct ArcCache<K, V, S> {
5353
cap: usize,
5454
}
5555

56+
impl<K: Hash + Eq, V> Default for ArcCache<K, V, DefaultHasher> {
57+
fn default() -> Self {
58+
ArcCache::new(100 )
59+
}
60+
}
61+
5662
impl<K: Hash + Eq, V> ArcCache<K, V, DefaultHasher> {
5763
/// 因为存在四个数组, 所以实际的容量为这个的4倍
5864
pub fn new(cap: usize) -> Self {

src/cache/lfu.rs

+19-16
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use std::{
2020
ptr::NonNull,
2121
};
2222

23-
use crate::{HashMap, HashSet, DefaultHasher};
23+
use crate::{DefaultHasher, HashMap, LruCache};
2424
use lazy_static::lazy_static;
2525

2626
use super::{KeyRef, KeyWrapper};
@@ -118,7 +118,7 @@ impl<K, V> LfuEntry<K, V> {
118118
/// ```
119119
pub 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
}

src/cache/lru.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ pub struct LruCache<K, V, S> {
8080
tail: *mut LruEntry<K, V>,
8181
}
8282

83+
impl<K: Hash + Eq, V> Default for LruCache<K, V, DefaultHasher> {
84+
fn default() -> Self {
85+
LruCache::new(100 )
86+
}
87+
}
88+
8389
impl<K: Hash + Eq, V> LruCache<K, V, DefaultHasher> {
8490
pub fn new(cap: usize) -> Self {
8591
LruCache::with_hasher(cap, DefaultHasher::default())
@@ -167,8 +173,9 @@ impl<K, V, S> LruCache<K, V, S> {
167173
}
168174

169175
/// 扩展当前容量
170-
pub fn reserve(&mut self, additional: usize) {
176+
pub fn reserve(&mut self, additional: usize) -> &mut Self {
171177
self.cap += additional;
178+
self
172179
}
173180

174181
/// 遍历当前的所有值

src/cache/lruk.rs

+6
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ pub struct LruKCache<K, V, S> {
8888
lru_count: usize,
8989
}
9090

91+
impl<K: Hash + Eq, V> Default for LruKCache<K, V, DefaultHasher> {
92+
fn default() -> Self {
93+
LruKCache::new(100 )
94+
}
95+
}
96+
9197
impl<K: Hash + Eq, V> LruKCache<K, V, DefaultHasher> {
9298
pub fn new(cap: usize) -> Self {
9399
LruKCache::with_hasher(cap, DEFAULT_TIMESK, DefaultHasher::default())

0 commit comments

Comments
 (0)