Struct LfuCache

Source
pub struct LfuCache<K, V, S = DefaultHashBuilder> { /* private fields */ }
Expand description

An implementation of a Least Frequently Used (LFU) cache.

The cache tracks the frequency of access for each item and evicts the least frequently used items when the cache reaches capacity. In case of a tie in frequency, the least recently used item among those with the same frequency is evicted.

§Examples

use cache_rs::lfu::LfuCache;
use core::num::NonZeroUsize;

// Create an LFU cache with capacity 3
let mut cache = LfuCache::new(NonZeroUsize::new(3).unwrap());

// Add some items
cache.put("a", 1);
cache.put("b", 2);
cache.put("c", 3);

// Access "a" multiple times to increase its frequency
assert_eq!(cache.get(&"a"), Some(&1));
assert_eq!(cache.get(&"a"), Some(&1));

// Add a new item, which will evict the least frequently used item
cache.put("d", 4);
assert_eq!(cache.get(&"b"), None); // "b" was evicted as it had frequency 0

Implementations§

Source§

impl<K: Hash + Eq, V: Clone, S: BuildHasher> LfuCache<K, V, S>

Source

pub fn with_hasher(cap: NonZeroUsize, hash_builder: S) -> Self

Creates a new LFU cache with the specified capacity and hash builder.

§Examples
use cache_rs::lfu::LfuCache;
use core::num::NonZeroUsize;
use std::collections::hash_map::RandomState;

let cache: LfuCache<&str, u32, _> = LfuCache::with_hasher(
    NonZeroUsize::new(10).unwrap(),
    RandomState::new()
);
Source

pub fn cap(&self) -> NonZeroUsize

Returns the maximum number of key-value pairs the cache can hold.

Source

pub fn len(&self) -> usize

Returns the current number of key-value pairs in the cache.

Source

pub fn is_empty(&self) -> bool

Returns true if the cache contains no key-value pairs.

Source

pub fn get<Q>(&mut self, key: &Q) -> Option<&V>
where K: Borrow<Q> + Clone, Q: ?Sized + Hash + Eq,

Returns a reference to the value corresponding to the key.

The key may be any borrowed form of the cache’s key type, but Hash and Eq on the borrowed form must match those for the key type.

Accessing an item increases its frequency count.

Source

pub fn get_mut<Q>(&mut self, key: &Q) -> Option<&mut V>
where K: Borrow<Q> + Clone, Q: ?Sized + Hash + Eq,

Returns a mutable reference to the value corresponding to the key.

The key may be any borrowed form of the cache’s key type, but Hash and Eq on the borrowed form must match those for the key type.

Accessing an item increases its frequency count.

Source

pub fn put(&mut self, key: K, value: V) -> Option<(K, V)>
where K: Clone,

Inserts a key-value pair into the cache.

If the cache already contained this key, the old value is replaced and returned. Otherwise, if the cache is at capacity, the least frequently used item is evicted. In case of a tie in frequency, the least recently used item among those with the same frequency is evicted.

New items are inserted with a frequency of 1.

Source

pub fn remove<Q>(&mut self, key: &Q) -> Option<V>
where K: Borrow<Q>, Q: ?Sized + Hash + Eq, V: Clone,

Removes a key from the cache, returning the value at the key if the key was previously in the cache.

The key may be any borrowed form of the cache’s key type, but Hash and Eq on the borrowed form must match those for the key type.

Source

pub fn clear(&mut self)

Clears the cache, removing all key-value pairs.

Source

pub fn record_miss(&mut self, object_size: u64)

Records a cache miss for metrics tracking (to be called by simulation system)

Source§

impl<K: Hash + Eq, V> LfuCache<K, V>
where V: Clone,

Source

pub fn new(cap: NonZeroUsize) -> LfuCache<K, V, DefaultHashBuilder>

Creates a new LFU cache with the specified capacity.

§Examples
use cache_rs::lfu::LfuCache;
use core::num::NonZeroUsize;

let cache: LfuCache<&str, u32> = LfuCache::new(NonZeroUsize::new(10).unwrap());

Trait Implementations§

Source§

impl<K: Hash + Eq, V, S: BuildHasher> CacheMetrics for LfuCache<K, V, S>

Source§

fn metrics(&self) -> BTreeMap<String, f64>

Returns all metrics as key-value pairs in deterministic order Read more
Source§

fn algorithm_name(&self) -> &'static str

Algorithm name for identification Read more
Source§

impl<K: Debug, V: Debug, S: Debug> Debug for LfuCache<K, V, S>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<K, V, S> Freeze for LfuCache<K, V, S>
where S: Freeze,

§

impl<K, V, S> RefUnwindSafe for LfuCache<K, V, S>

§

impl<K, V, S = BuildHasherDefault<AHasher>> !Send for LfuCache<K, V, S>

§

impl<K, V, S = BuildHasherDefault<AHasher>> !Sync for LfuCache<K, V, S>

§

impl<K, V, S> Unpin for LfuCache<K, V, S>
where S: Unpin, K: Unpin,

§

impl<K, V, S> UnwindSafe for LfuCache<K, V, S>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.