const-lru 1.0.0

A simple no_std, non-hashing, constant-capacity, constant-memory-usage LRU cache.
Documentation
use const_lru::{ConstLru, InsertReplaced};

#[test]
fn one_cap_simple() {
    const ENTRY: (u8, u64) = (1, 2);
    const NON_KEY: u8 = 3;

    let mut c: ConstLru<u8, u64, 1, u8> = ConstLru::new();
    assert!(c.is_empty());
    assert!(c.len() == 0);

    assert!(c.insert(ENTRY.0, ENTRY.1).is_none());

    assert!(c.is_full());
    assert!(c.len() == 1);
    assert_eq!(c.get(&ENTRY.0).unwrap(), &ENTRY.1);
    assert!(c.get(&NON_KEY).is_none());
    assert!(c.remove(&NON_KEY).is_none());

    assert_eq!(c.remove(&ENTRY.0).unwrap(), ENTRY.1);
    assert!(c.get(&ENTRY.0).is_none());
    assert!(c.is_empty());
    assert!(c.len() == 0);
    assert!(c.remove(&ENTRY.0).is_none());
}

#[test]
fn one_cap_evict() {
    const ENTRIES: [(u32, u16); 3] = [(1, 2), (3, 4), (5, 6)];

    let mut c: ConstLru<u32, u16, 1, u8> = ConstLru::new();
    c.insert(ENTRIES[0].0, ENTRIES[0].1);
    for (prev, (k, v)) in ENTRIES.into_iter().skip(1).enumerate() {
        assert!(c.is_full());
        assert_eq!(
            c.insert(k, v).unwrap(),
            InsertReplaced::LruEvicted(ENTRIES[prev].0, ENTRIES[prev].1)
        );
        assert_eq!(c.get(&k).unwrap(), &v);
    }
}

#[test]
fn one_cap_replace_old_val() {
    const ENTRY_OLD: (u32, u64) = (1, 2);
    const VAL_REPLACE: u64 = 3;
    let mut c: ConstLru<u32, u64, 1, u8> = ConstLru::new();
    c.insert(ENTRY_OLD.0, ENTRY_OLD.1);
    assert_eq!(
        c.insert(ENTRY_OLD.0, VAL_REPLACE).unwrap(),
        InsertReplaced::OldValue(ENTRY_OLD.1)
    );
    assert_eq!(*c.get(&ENTRY_OLD.0).unwrap(), VAL_REPLACE);
}

#[test]
fn one_cap_remove_empty() {
    let mut c: ConstLru<u32, u64, 1, u8> = ConstLru::new();
    assert!(c.remove(&1).is_none());
}

#[test]
fn one_cap_remove() {
    const ENTRY: (u32, u64) = (1, 2);
    let mut c: ConstLru<u32, u64, 1, u8> = ConstLru::new();
    c.insert(ENTRY.0, ENTRY.1);
    assert_eq!(c.remove(&ENTRY.0).unwrap(), ENTRY.1);
    assert!(c.get(&ENTRY.0).is_none());
    assert!(c.is_empty());
}

#[test]
fn one_cap_write_mut() {
    const K: u16 = 1;
    const V_OLD: u64 = 2;
    const V_NEW: u64 = 3;

    let mut c: ConstLru<u16, u64, 1, u8> = ConstLru::new();
    c.insert(K, V_OLD);
    assert_eq!(c.get(&K).unwrap(), &V_OLD);
    *c.get_mut(&K).unwrap() = V_NEW;
    assert_eq!(c.get(&K).unwrap(), &V_NEW);
}