Least-recently-used cache with a queue
Rust
use std::collections::{HashMap, VecDeque};
/// Bounded map that evicts the least recently used key when it is full.
struct LruCache<K, V> {
entries: HashMap<K, V>,
order: VecDeque<K>,
capacity: usize,
}
impl<K: Eq + std::hash::Hash + Clone, V> LruCache<K, V> {
fn new(capacity: usize) -> Self {
Self { entries: HashMap::new(), order: VecDeque::new(), capacity: capacity.max(1) }
}
fn get(&mut self, key: &K) -> Option<&V> {
if !self.entries.contains_key(key) {
return None;
}
self.touch(key);
self.entries.get(key)
}
fn put(&mut self, key: K, value: V) {
self.entries.insert(key.clone(), value);
self.touch(&key);
while self.entries.len() > self.capacity {
if let Some(oldest) = self.order.pop_front() {
self.entries.remove(&oldest);
}
}
}
fn touch(&mut self, key: &K) {
self.order.retain(|known| known != key);
self.order.push_back(key.clone());
}
}
// Usage: let mut cache = LruCache::new(2); cache.put("a", 1); cache.get(&"a");