#generational-arena #lru-cache #cache #no-std

no-std generational-cache

Generational Arena based cache impls. in 100% safe, [no_std] compatible Rust.

6 releases

0.2.2 Feb 8, 2024
0.2.1 Feb 7, 2024
0.2.0 Sep 10, 2023
0.1.2 Sep 10, 2023
0.1.1 Aug 22, 2023

#80 in Caching


Used in laminarmq

MIT license

63KB
1.5K SLoC

generational-cache

Generational Arena based cache impls. in 100% safe, [no_std] compatible Rust.

Usage

generational-cache is a library crate. You may include it in your Cargo.toml as follows:

[dependencies]
generational-cache = "0.2.2"

Refer to latest git API Documentation or Crate Documentation for more details.

Examples

  1. LRU Cache (generational_cache::cache::LRUCache)

    A generational arena based LRU cache implementation.

    #[no_std]
    
    use generational_cache::prelude::*;
    
    const CAPACITY: usize = 3;
    
    // users can choose between different map and vector implementations
    let mut cache = LRUCache::<_, i32, u64, AllocBTreeMap<_, _>>::with_backing_vector(Array::<_, CAPACITY>::new());
    
    cache.insert(-1, 1).unwrap();
    cache.insert(-2, 2).unwrap();
    cache.insert(-3, 3).unwrap();
    
    assert_eq!(cache.least_recent().unwrap(), (&-1, &1));
    assert_eq!(cache.most_recent().unwrap(), (&-3, &3));
    
    assert_eq!(cache.insert(-4, 4).unwrap(), Eviction::Block { key: -1, value: 1});
    
    assert_eq!(cache.least_recent().unwrap(), (&-2, &2));
    assert_eq!(cache.most_recent().unwrap(), (&-4, &4));
    
    assert_eq!(cache.insert(-2, 42).unwrap(), Eviction::Value(2));
    
    assert_eq!(cache.least_recent().unwrap(), (&-3, &3));
    assert_eq!(cache.most_recent().unwrap(), (&-2, &42));
    
    assert_eq!(cache.remove(&-42).unwrap(), Lookup::Miss);
    assert_eq!(cache.query(&-42).unwrap(), Lookup::Miss);
    
    assert_eq!(cache.query(&-3).unwrap(), Lookup::Hit(&3));
    
    assert_eq!(cache.least_recent().unwrap(), (&-4, &4));
    assert_eq!(cache.most_recent().unwrap(), (&-3, &3));
    
    assert_eq!(cache.remove(&-2).unwrap(), Lookup::Hit(42));
    
    assert_eq!(cache.query(&-2).unwrap(), Lookup::Miss);
    
    // zero capacity LRUCache is unusable
    let mut cache = LRUCache::<_, i32, u64, AllocBTreeMap<_, _>>::with_backing_vector(Array::<_, 0_usize>::new());
    
    match cache.insert(0, 0) {
        Err(LRUCacheError::ListUnderflow) => {}
        _ => unreachable!("Wrong error on list underflow."),
    };
    
    

(… we plan on adding more cache implementations in the future).

License

This repository is licensed under the MIT License. See License for more details.

No runtime deps