pub struct LRUCache<V, ID: Hash, const USER_CAPACITY: usize = 2> {
pub users: FxHashMap<ID, SmallVec<[u64; 2]>>,
/* private fields */
}Expand description
Reuse costly results across users, such as text measurements shared by several labels.
Each user keeps its last USER_CAPACITY results. Saved results leave when no user needs them.
Fields§
§users: FxHashMap<ID, SmallVec<[u64; 2]>>Tracks which saved results each user still needs.
Implementations§
Source§impl<V, ID: Hash + Eq, const USER_CAPACITY: usize> LRUCache<V, ID, USER_CAPACITY>
impl<V, ID: Hash + Eq, const USER_CAPACITY: usize> LRUCache<V, ID, USER_CAPACITY>
Sourcepub fn utilize<H: Hash>(&mut self, id: ID, hash_value: &H) -> Option<Rc<V>>
pub fn utilize<H: Hash>(&mut self, id: ID, hash_value: &H) -> Option<Rc<V>>
Reuses a saved result for this user and makes room by letting go of their oldest results.
If it returns None, create the result and save it with insert.
Examples found in repository?
8fn main() {
9 let mut fifo = FifoCache::new(2);
10 for key in 0..2 {
11 fifo.insert(key, format!("Value {key}"));
12 }
13 fifo.insert(2, "Newest value".to_owned());
14 assert!(fifo.get(&0).is_none());
15 assert_eq!(fifo.len(), 2);
16 fifo.set_capacity(1);
17 assert_eq!(fifo.get(&1), None);
18 assert_eq!(fifo.len(), 1);
19
20 let mut shared = LRUCache::<String, u64>::default();
21 let first = shared
22 .utilize(1, &"greeting")
23 .unwrap_or_else(|| shared.insert(1, &"greeting", "Hello".to_owned()));
24 let second = shared
25 .utilize(2, &"greeting")
26 .unwrap_or_else(|| shared.insert(2, &"greeting", "Hello".to_owned()));
27 assert!(Rc::ptr_eq(&first, &second));
28
29 shared.remove(&1);
30 assert_eq!(shared.len(), 1);
31 shared.remove(&2);
32 assert!(shared.is_empty());
33 assert_eq!(first.as_str(), "Hello");
34}Sourcepub fn insert<H: Hash>(&mut self, id: ID, hash_value: &H, value: V) -> Rc<V>
pub fn insert<H: Hash>(&mut self, id: ID, hash_value: &H, value: V) -> Rc<V>
Saves a newly created result for this user so others can reuse it without repeating the work.
Call utilize first to check for a saved result and make room for this one.
Examples found in repository?
8fn main() {
9 let mut fifo = FifoCache::new(2);
10 for key in 0..2 {
11 fifo.insert(key, format!("Value {key}"));
12 }
13 fifo.insert(2, "Newest value".to_owned());
14 assert!(fifo.get(&0).is_none());
15 assert_eq!(fifo.len(), 2);
16 fifo.set_capacity(1);
17 assert_eq!(fifo.get(&1), None);
18 assert_eq!(fifo.len(), 1);
19
20 let mut shared = LRUCache::<String, u64>::default();
21 let first = shared
22 .utilize(1, &"greeting")
23 .unwrap_or_else(|| shared.insert(1, &"greeting", "Hello".to_owned()));
24 let second = shared
25 .utilize(2, &"greeting")
26 .unwrap_or_else(|| shared.insert(2, &"greeting", "Hello".to_owned()));
27 assert!(Rc::ptr_eq(&first, &second));
28
29 shared.remove(&1);
30 assert_eq!(shared.len(), 1);
31 shared.remove(&2);
32 assert!(shared.is_empty());
33 assert_eq!(first.as_str(), "Hello");
34}Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Counts saved results, counting a result shared by several users only once.
Examples found in repository?
8fn main() {
9 let mut fifo = FifoCache::new(2);
10 for key in 0..2 {
11 fifo.insert(key, format!("Value {key}"));
12 }
13 fifo.insert(2, "Newest value".to_owned());
14 assert!(fifo.get(&0).is_none());
15 assert_eq!(fifo.len(), 2);
16 fifo.set_capacity(1);
17 assert_eq!(fifo.get(&1), None);
18 assert_eq!(fifo.len(), 1);
19
20 let mut shared = LRUCache::<String, u64>::default();
21 let first = shared
22 .utilize(1, &"greeting")
23 .unwrap_or_else(|| shared.insert(1, &"greeting", "Hello".to_owned()));
24 let second = shared
25 .utilize(2, &"greeting")
26 .unwrap_or_else(|| shared.insert(2, &"greeting", "Hello".to_owned()));
27 assert!(Rc::ptr_eq(&first, &second));
28
29 shared.remove(&1);
30 assert_eq!(shared.len(), 1);
31 shared.remove(&2);
32 assert!(shared.is_empty());
33 assert_eq!(first.as_str(), "Hello");
34}Sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Examples found in repository?
8fn main() {
9 let mut fifo = FifoCache::new(2);
10 for key in 0..2 {
11 fifo.insert(key, format!("Value {key}"));
12 }
13 fifo.insert(2, "Newest value".to_owned());
14 assert!(fifo.get(&0).is_none());
15 assert_eq!(fifo.len(), 2);
16 fifo.set_capacity(1);
17 assert_eq!(fifo.get(&1), None);
18 assert_eq!(fifo.len(), 1);
19
20 let mut shared = LRUCache::<String, u64>::default();
21 let first = shared
22 .utilize(1, &"greeting")
23 .unwrap_or_else(|| shared.insert(1, &"greeting", "Hello".to_owned()));
24 let second = shared
25 .utilize(2, &"greeting")
26 .unwrap_or_else(|| shared.insert(2, &"greeting", "Hello".to_owned()));
27 assert!(Rc::ptr_eq(&first, &second));
28
29 shared.remove(&1);
30 assert_eq!(shared.len(), 1);
31 shared.remove(&2);
32 assert!(shared.is_empty());
33 assert_eq!(first.as_str(), "Hello");
34}Sourcepub fn users_len(&self) -> usize
pub fn users_len(&self) -> usize
Counts users being tracked, including those with no saved results yet.
Sourcepub fn remove(&mut self, id: &ID)
pub fn remove(&mut self, id: &ID)
Stops keeping results for a user that has gone away, such as a label removed from the screen. Results still needed by other users stay saved, and copies already handed out remain usable.
Examples found in repository?
8fn main() {
9 let mut fifo = FifoCache::new(2);
10 for key in 0..2 {
11 fifo.insert(key, format!("Value {key}"));
12 }
13 fifo.insert(2, "Newest value".to_owned());
14 assert!(fifo.get(&0).is_none());
15 assert_eq!(fifo.len(), 2);
16 fifo.set_capacity(1);
17 assert_eq!(fifo.get(&1), None);
18 assert_eq!(fifo.len(), 1);
19
20 let mut shared = LRUCache::<String, u64>::default();
21 let first = shared
22 .utilize(1, &"greeting")
23 .unwrap_or_else(|| shared.insert(1, &"greeting", "Hello".to_owned()));
24 let second = shared
25 .utilize(2, &"greeting")
26 .unwrap_or_else(|| shared.insert(2, &"greeting", "Hello".to_owned()));
27 assert!(Rc::ptr_eq(&first, &second));
28
29 shared.remove(&1);
30 assert_eq!(shared.len(), 1);
31 shared.remove(&2);
32 assert!(shared.is_empty());
33 assert_eq!(first.as_str(), "Hello");
34}