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

no-std generational-cache

基于代际竞技场的缓存实现,100% 安全,[no_std] 兼容 Rust。

6 个版本

0.2.2 2024 年 2 月 8 日
0.2.1 2024 年 2 月 7 日
0.2.0 2023 年 9 月 10 日
0.1.2 2023 年 9 月 10 日
0.1.1 2023 年 8 月 22 日

#72 in 缓存

Download history 4/week @ 2024-03-15 33/week @ 2024-03-29 9/week @ 2024-04-05 6/week @ 2024-05-17 10/week @ 2024-05-24

69 每月下载量
laminarmq 中使用

MIT 许可证

63KB
1.5K SLoC

generational-cache

基于代际竞技场的缓存实现,100% 安全,[no_std] 兼容 Rust。

使用方法

generational-cache 是一个库 Crates。您可以在 Cargo.toml 中如下包含它

[dependencies]
generational-cache = "0.2.2"

有关详细信息,请参阅最新的 git API 文档Crates 文档

示例

  1. LRU 缓存 (generational_cache::cache::LRUCache)

    基于代际竞技场的 LRU 缓存实现。

    #[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."),
    };
    
    

(… 我们计划在将来添加更多缓存实现)。

许可证

本仓库使用 MIT 许可证。有关详细信息,请参阅 许可证

无运行时依赖