Skip to content

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

License

Notifications You must be signed in to change notification settings

arindas/generational-cache

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

62 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.

About

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

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages