use super::*;
impl<K, V> LruCache<K, V>
where
K: Clone + Eq + Hash,
{
pub fn len(&self) -> usize {
self.map.len()
}
pub fn is_empty(&self) -> bool {
self.map.is_empty()
}
pub fn is_full(&self) -> bool {
self.map.len() >= self.capacity
}
pub fn contains(&self, key: &K) -> bool {
self.map.contains_key(key)
}
pub fn get(&mut self, key: &K) -> Option<&V> {
if self.map.contains_key(key) {
self.order.retain(|k: &K| k != key);
self.order.push_front(key.clone());
self.map.get(key)
} else {
None
}
}
pub fn peek(&self, key: &K) -> Option<&V> {
self.map.get(key)
}
pub fn put(&mut self, key: K, value: V) -> Option<(K, V)> {
if self.capacity == 0 {
return None;
}
if self.map.contains_key(&key) {
self.map.insert(key.clone(), value);
self.order.retain(|k: &K| k != &key);
self.order.push_front(key);
return None;
}
let evicted: Option<(K, V)> = if self.map.len() >= self.capacity {
let victim_key: K = self.order.pop_back()?;
let victim_value: V = self.map.remove(&victim_key)?;
Some((victim_key, victim_value))
} else {
None
};
self.map.insert(key.clone(), value);
self.order.push_front(key);
evicted
}
pub fn remove(&mut self, key: &K) -> Option<V> {
self.order.retain(|k: &K| k != key);
self.map.remove(key)
}
pub fn clear(&mut self) {
self.map.clear();
self.order.clear();
}
pub fn iter(&self) -> impl Iterator<Item = (&K, &V)> {
self.order
.iter()
.filter_map(|k: &K| self.map.get_key_value(k))
}
pub fn keys(&self) -> impl Iterator<Item = &K> {
self.order.iter()
}
pub fn values(&self) -> impl Iterator<Item = &V> {
self.order.iter().filter_map(|k: &K| self.map.get(k))
}
pub fn resize(&mut self, new_capacity: usize) {
self.capacity = new_capacity;
while self.map.len() > self.capacity {
if let Some(victim_key) = self.order.pop_back() {
self.map.remove(&victim_key);
} else {
break;
}
}
}
}