pub struct LruCache<K: Eq + Hash, V, S: BuildHasher = DefaultHashBuilder, 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, DefaultHashBuilder, M>
impl<K: Eq + Hash, V, M: CountableMeter<K, V>> LruCache<K, V, DefaultHashBuilder, M>
Sourcepub fn with_meter(
capacity: u64,
meter: M,
) -> LruCache<K, V, DefaultHashBuilder, M>
pub fn with_meter( capacity: u64, meter: M, ) -> LruCache<K, V, DefaultHashBuilder, 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 ritecache::{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.put(1, vec![1, 2]);
assert_eq!(cache.size(), 2);
cache.put(2, vec![3, 4]);
cache.put(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.
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 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 ritecache::{Cache, LruCache};
let mut cache = LruCache::new(2);
cache.put(1, 10);
cache.put(2, 20);
cache.put(3, 30);
let kvs: Vec<_> = cache.iter().collect();
assert_eq!(kvs, [(&2, &20), (&3, &30)]);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 ritecache::{Cache, LruCache};
let mut cache = LruCache::new(2);
cache.put(1, 10);
cache.put(2, 20);
cache.put(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));Trait Implementations§
Source§impl<K: Eq + Hash, V, S: BuildHasher, M: CountableMeter<K, V>> Cache<K, V, S, M> for LruCache<K, V, S, M>
impl<K: Eq + Hash, V, S: BuildHasher, M: CountableMeter<K, V>> Cache<K, V, S, M> for LruCache<K, V, S, M>
Source§fn with_meter_and_hasher(capacity: u64, meter: M, hash_builder: S) -> Self
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.
Source§fn get<Q>(&mut self, k: &Q) -> Option<&V>
fn get<Q>(&mut self, k: &Q) -> Option<&V>
Returns a 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 ritecache::{Cache, LruCache};
let mut cache = LruCache::new(2);
cache.put(1, "a");
cache.put(2, "b");
cache.put(2, "c");
cache.put(3, "d");
assert_eq!(cache.get(&1), None);
assert_eq!(cache.get(&2), Some(&"c"));Source§fn get_mut<Q>(&mut self, k: &Q) -> Option<&mut V>
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 ritecache::{Cache, LruCache};
let mut cache = LruCache::new(2);
cache.put(1, "a");
cache.put(2, "b");
cache.put(2, "c");
cache.put(3, "d");
assert_eq!(cache.get_mut(&1), None);
assert_eq!(cache.get_mut(&2), Some(&mut "c"));Source§fn peek<'a, Q>(&'a self, k: &Q) -> Option<&'a V>
fn peek<'a, Q>(&'a self, k: &Q) -> Option<&'a V>
Returns a reference to the value corresponding to the key in the cache or None if it is
not present in the cache. Unlike get, peek does not update the LRU list so the key’s
position will be unchanged.
§Example
use ritecache::{Cache, LruCache};
let mut cache = LruCache::new(2);
cache.put(1, "a");
cache.put(2, "b");
assert_eq!(cache.peek(&1), Some(&"a"));
assert_eq!(cache.peek(&2), Some(&"b"));Source§fn peek_mut<'a, Q>(&'a mut self, k: &Q) -> Option<&'a mut V>
fn peek_mut<'a, Q>(&'a mut self, k: &Q) -> Option<&'a mut V>
Returns a mutable reference to the value corresponding to the key in the cache or None
if it is not present in the cache. Unlike get_mut, peek_mut does not update the LRU
list so the key’s position will be unchanged.
§Example
use ritecache::{Cache, LruCache};
let mut cache = LruCache::new(2);
cache.put(1, "a");
cache.put(2, "b");
assert_eq!(cache.peek_mut(&1), Some(&mut "a"));
assert_eq!(cache.peek_mut(&2), Some(&mut "b"));Source§fn peek_by_policy(&self) -> Option<(&K, &V)>
fn peek_by_policy(&self) -> Option<(&K, &V)>
Returns the value corresponding to the least recently used item or None if the
cache is empty. Like peek, peek_lru does not update the LRU list so the item’s
position will be unchanged.
§Example
use ritecache::{Cache, LruCache};
let mut cache = LruCache::new(2);
cache.put(1, "a");
cache.put(2, "b");
assert_eq!(cache.peek_by_policy(), Some((&1, &"a")));Source§fn put(&mut self, k: K, v: V) -> Option<V>
fn put(&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 ritecache::{Cache, LruCache};
let mut cache = LruCache::new(2);
cache.put(1, "a");
cache.put(2, "b");
assert_eq!(cache.get_mut(&1), Some(&mut "a"));
assert_eq!(cache.get_mut(&2), Some(&mut "b"));Source§fn pop<Q>(&mut self, k: &Q) -> Option<V>
fn pop<Q>(&mut self, k: &Q) -> Option<V>
Removes the given key from the cache and returns its corresponding value.
§Examples
use ritecache::{Cache, LruCache};
let mut cache = LruCache::new(2);
cache.put(2, "a");
assert_eq!(cache.pop(&1), None);
assert_eq!(cache.pop(&2), Some("a"));
assert_eq!(cache.pop(&2), None);
assert_eq!(cache.len(), 0);Source§fn pop_by_policy(&mut self) -> Option<(K, V)>
fn pop_by_policy(&mut self) -> Option<(K, V)>
Source§fn set_capacity(&mut self, capacity: u64)
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 ritecache::{Cache, LruCache};
let mut cache = LruCache::new(2);
cache.put(1, "a");
cache.put(2, "b");
cache.put(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.put(1, "a");
cache.put(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"));Source§fn size(&self) -> u64
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.
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)