Struct sccache::lru_disk_cache::lru_cache::LruCache
source · pub struct LruCache<K: Eq + Hash, V, S: BuildHasher = RandomState, M: CountableMeter<K, V> = Count> { /* private fields */ }
Expand description
An LRU cache.
Implementations§
source§impl<K: Eq + Hash, V, M: CountableMeter<K, V>> LruCache<K, V, RandomState, M>
impl<K: Eq + Hash, V, M: CountableMeter<K, V>> LruCache<K, V, RandomState, M>
sourcepub fn with_meter(capacity: u64, meter: M) -> LruCache<K, V, RandomState, M>
pub fn with_meter(capacity: u64, meter: M) -> LruCache<K, V, RandomState, M>
Creates an empty cache that can hold at most capacity
as measured by meter
.
You can implement the Meter
trait to allow custom metrics.
§Examples
use lru_cache::{LruCache, Meter};
use std::borrow::Borrow;
/// Measure Vec items by their length
struct VecLen;
impl<K, T> Meter<K, Vec<T>> for VecLen {
// Use `Measure = usize` or implement `CountableMeter` as well.
type Measure = usize;
fn measure<Q: ?Sized>(&self, _: &Q, v: &Vec<T>) -> usize
where K: Borrow<Q>
{
v.len()
}
}
let mut cache = LruCache::with_meter(5, VecLen);
cache.insert(1, vec![1, 2]);
assert_eq!(cache.size(), 2);
cache.insert(2, vec![3, 4]);
cache.insert(3, vec![5, 6]);
assert_eq!(cache.size(), 4);
assert_eq!(cache.len(), 2);
source§impl<K: Eq + Hash, V, S: BuildHasher> LruCache<K, V, S, Count>
impl<K: Eq + Hash, V, S: BuildHasher> LruCache<K, V, S, Count>
sourcepub fn with_hasher(capacity: u64, hash_builder: S) -> LruCache<K, V, S, Count>
pub fn with_hasher(capacity: u64, hash_builder: S) -> LruCache<K, V, S, Count>
Creates an empty cache that can hold at most capacity
items with the given hash builder.
sourcepub fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut V>
pub fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut V>
Returns a mutable reference to the value corresponding to the given key in the cache, if any.
Note that this method is not available for cache objects using Meter
implementations
other than Count
.
§Examples
use lru_cache::LruCache;
let mut cache = LruCache::new(2);
cache.insert(1, "a");
cache.insert(2, "b");
cache.insert(2, "c");
cache.insert(3, "d");
assert_eq!(cache.get_mut(&1), None);
assert_eq!(cache.get_mut(&2), Some(&mut "c"));
sourcepub fn iter_mut(&mut self) -> IterMut<'_, K, V> ⓘ
pub fn iter_mut(&mut self) -> IterMut<'_, K, V> ⓘ
Returns an iterator over the cache’s key-value pairs in least- to most-recently-used order, with mutable references to the values.
Accessing the cache through the iterator does not affect the cache’s LRU state.
Note that this method is not available for cache objects using Meter
implementations.
other than Count
.
§Examples
use lru_cache::LruCache;
let mut cache = LruCache::new(2);
cache.insert(1, 10);
cache.insert(2, 20);
cache.insert(3, 30);
let mut n = 2;
for (k, v) in cache.iter_mut() {
assert_eq!(*k, n);
assert_eq!(*v, n * 10);
*v *= 10;
n += 1;
}
assert_eq!(n, 4);
assert_eq!(cache.get_mut(&2), Some(&mut 200));
assert_eq!(cache.get_mut(&3), Some(&mut 300));
source§impl<K: Eq + Hash, V, S: BuildHasher, M: CountableMeter<K, V>> LruCache<K, V, S, M>
impl<K: Eq + Hash, V, S: BuildHasher, M: CountableMeter<K, V>> LruCache<K, V, S, M>
sourcepub fn with_meter_and_hasher(capacity: u64, meter: M, hash_builder: S) -> Self
pub fn with_meter_and_hasher(capacity: u64, meter: M, hash_builder: S) -> Self
Creates an empty cache that can hold at most capacity
as measured by meter
with the
given hash builder.
sourcepub fn contains_key<Q>(&self, key: &Q) -> bool
pub fn contains_key<Q>(&self, key: &Q) -> bool
pub fn get<Q>(&mut self, k: &Q) -> Option<&V>
sourcepub fn insert(&mut self, k: K, v: V) -> Option<V>
pub fn insert(&mut self, k: K, v: V) -> Option<V>
Inserts a key-value pair into the cache. If the key already existed, the old value is returned.
§Examples
use lru_cache::LruCache;
let mut cache = LruCache::new(2);
cache.insert(1, "a");
cache.insert(2, "b");
assert_eq!(cache.get_mut(&1), Some(&mut "a"));
assert_eq!(cache.get_mut(&2), Some(&mut "b"));
sourcepub fn remove<Q>(&mut self, k: &Q) -> Option<V>
pub fn remove<Q>(&mut self, k: &Q) -> Option<V>
Removes the given key from the cache and returns its corresponding value.
§Examples
use lru_cache::LruCache;
let mut cache = LruCache::new(2);
cache.insert(2, "a");
assert_eq!(cache.remove(&1), None);
assert_eq!(cache.remove(&2), Some("a"));
assert_eq!(cache.remove(&2), None);
assert_eq!(cache.len(), 0);
sourcepub fn set_capacity(&mut self, capacity: u64)
pub fn set_capacity(&mut self, capacity: u64)
Sets the size of the key-value pairs the cache can hold, as measured by the Meter
used by
the cache.
Removes least-recently-used key-value pairs if necessary.
§Examples
use lru_cache::LruCache;
let mut cache = LruCache::new(2);
cache.insert(1, "a");
cache.insert(2, "b");
cache.insert(3, "c");
assert_eq!(cache.get_mut(&1), None);
assert_eq!(cache.get_mut(&2), Some(&mut "b"));
assert_eq!(cache.get_mut(&3), Some(&mut "c"));
cache.set_capacity(3);
cache.insert(1, "a");
cache.insert(2, "b");
assert_eq!(cache.get_mut(&1), Some(&mut "a"));
assert_eq!(cache.get_mut(&2), Some(&mut "b"));
assert_eq!(cache.get_mut(&3), Some(&mut "c"));
cache.set_capacity(1);
assert_eq!(cache.get_mut(&1), None);
assert_eq!(cache.get_mut(&2), None);
assert_eq!(cache.get_mut(&3), Some(&mut "c"));
sourcepub fn remove_lru(&mut self) -> Option<(K, V)>
pub fn remove_lru(&mut self) -> Option<(K, V)>
sourcepub fn size(&self) -> u64
pub fn size(&self) -> u64
Returns the size of all the key-value pairs in the cache, as measured by the Meter
used
by the cache.
sourcepub fn iter(&self) -> Iter<'_, K, V> ⓘ
pub fn iter(&self) -> Iter<'_, K, V> ⓘ
Returns an iterator over the cache’s key-value pairs in least- to most-recently-used order.
Accessing the cache through the iterator does not affect the cache’s LRU state.
§Examples
use lru_cache::LruCache;
let mut cache = LruCache::new(2);
cache.insert(1, 10);
cache.insert(2, 20);
cache.insert(3, 30);
let kvs: Vec<_> = cache.iter().collect();
assert_eq!(kvs, [(&2, &20), (&3, &30)]);
Trait Implementations§
source§impl<K: Clone + Eq + Hash, V: Clone, S: Clone + BuildHasher, M: Clone + CountableMeter<K, V>> Clone for LruCache<K, V, S, M>
impl<K: Clone + Eq + Hash, V: Clone, S: Clone + BuildHasher, M: Clone + CountableMeter<K, V>> Clone for LruCache<K, V, S, M>
source§impl<K: Debug + Eq + Hash, V: Debug, S: BuildHasher, M: CountableMeter<K, V>> Debug for LruCache<K, V, S, M>
impl<K: Debug + Eq + Hash, V: Debug, S: BuildHasher, M: CountableMeter<K, V>> Debug for LruCache<K, V, S, M>
source§impl<K: Eq + Hash, V, S: BuildHasher, M: CountableMeter<K, V>> Extend<(K, V)> for LruCache<K, V, S, M>
impl<K: Eq + Hash, V, S: BuildHasher, M: CountableMeter<K, V>> Extend<(K, V)> for LruCache<K, V, S, M>
source§fn extend<I: IntoIterator<Item = (K, V)>>(&mut self, iter: I)
fn extend<I: IntoIterator<Item = (K, V)>>(&mut self, iter: I)
source§fn extend_one(&mut self, item: A)
fn extend_one(&mut self, item: A)
extend_one
)source§fn extend_reserve(&mut self, additional: usize)
fn extend_reserve(&mut self, additional: usize)
extend_one
)