const-lru 1.0.0

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

const ENTRIES: [(u8, u64); 3] = [(5, 6), (1, 2), (3, 4)];

fn entries_sorted_by_key() -> [(u8, u64); 3] {
    let mut copy = ENTRIES.clone();
    copy.sort_unstable_by_key(|(k, _v)| *k);
    copy
}

fn create_const_lru() -> ConstLru<u8, u64, 3, u8> {
    let mut c: ConstLru<u8, u64, 3, u8> = ConstLru::new();
    for (k, v) in ENTRIES {
        assert!(c.insert(k, v).is_none());
    }
    c
}

#[test]
fn empty_iter() {
    let c: ConstLru<u8, u64, 1, u8> = ConstLru::new();
    let mut iter = c.iter();
    assert_eq!(iter.next(), None);
    assert_eq!(iter.next_back(), None);
}

#[test]
fn iter_fwd_only() {
    let c = create_const_lru();
    for (i, (k, v)) in c.iter().enumerate() {
        let rev_i = ENTRIES.len() - i - 1;
        assert_eq!(*k, ENTRIES[rev_i].0);
        assert_eq!(*v, ENTRIES[rev_i].1);
    }
}

#[test]
fn iter_rev_only() {
    let c = create_const_lru();
    for (i, (k, v)) in c.iter().rev().enumerate() {
        assert_eq!(*k, ENTRIES[i].0);
        assert_eq!(*v, ENTRIES[i].1);
    }
}

#[test]
fn iter_mitm() {
    let c = create_const_lru();
    let mut iter = c.iter();
    assert_eq!(iter.next().unwrap(), (&ENTRIES[2].0, &ENTRIES[2].1));
    assert_eq!(iter.next_back().unwrap(), (&ENTRIES[0].0, &ENTRIES[0].1));
    assert_eq!(iter.next().unwrap(), (&ENTRIES[1].0, &ENTRIES[1].1));
    assert!(iter.next().is_none());
    assert!(iter.next_back().is_none());
}

#[test]
fn empty_iter_mut() {
    let mut c: ConstLru<u8, u64, 1, u8> = ConstLru::new();
    let mut iter = c.iter_mut();
    assert_eq!(iter.next(), None);
    assert_eq!(iter.next_back(), None);
}

#[test]
fn iter_mut_fwd_only() {
    let mut c = create_const_lru();
    for (i, (k, v)) in c.iter_mut().enumerate() {
        let rev_i = ENTRIES.len() - i - 1;
        assert_eq!(*k, ENTRIES[rev_i].0);
        assert_eq!(*v, ENTRIES[rev_i].1);
        *v = *v + 1;
    }
    for (k, v) in ENTRIES {
        assert_eq!(*c.get_untouched(&k).unwrap(), v + 1);
    }
}

#[test]
fn iter_mut_rev_only() {
    let mut c = create_const_lru();
    for (i, (k, v)) in c.iter_mut().rev().enumerate() {
        assert_eq!(*k, ENTRIES[i].0);
        assert_eq!(*v, ENTRIES[i].1);
        *v = *v + 1;
    }
    for (k, v) in ENTRIES {
        assert_eq!(*c.get_untouched(&k).unwrap(), v + 1);
    }
}

#[test]
fn iter_mut_mitm() {
    let mut c = create_const_lru();
    let mut iter = c.iter_mut();
    let (k, v) = iter.next().unwrap();
    assert_eq!(k, &ENTRIES[2].0);
    assert_eq!(v, &ENTRIES[2].1);
    *v = *v + 1;
    let (k, v) = iter.next_back().unwrap();
    assert_eq!(k, &ENTRIES[0].0);
    assert_eq!(v, &ENTRIES[0].1);
    *v = *v + 1;
    let (k, v) = iter.next().unwrap();
    assert_eq!(k, &ENTRIES[1].0);
    assert_eq!(v, &ENTRIES[1].1);
    *v = *v + 1;
    assert!(iter.next().is_none());
    assert!(iter.next_back().is_none());
    for (k, v) in ENTRIES {
        assert_eq!(*c.get_untouched(&k).unwrap(), v + 1);
    }
}

#[test]
fn empty_iter_key_order() {
    let c: ConstLru<u8, u64, 1, u8> = ConstLru::new();
    let mut iter = c.iter_key_order();
    assert_eq!(iter.next(), None);
    assert_eq!(iter.next_back(), None);
}

#[test]
fn iter_key_order_fwd_only() {
    let c = create_const_lru();
    let sorted = entries_sorted_by_key();
    for (i, (k, v)) in c.iter_key_order().enumerate() {
        assert_eq!(*k, sorted[i].0);
        assert_eq!(*v, sorted[i].1);
    }
}

#[test]
fn iter_key_order_rev_only() {
    let c = create_const_lru();
    let sorted = entries_sorted_by_key();
    for (i, (k, v)) in c.iter_key_order().rev().enumerate() {
        let rev_i = sorted.len() - i - 1;
        assert_eq!(*k, sorted[rev_i].0);
        assert_eq!(*v, sorted[rev_i].1);
    }
}

#[test]
fn iter_key_order_mitm() {
    let c = create_const_lru();
    let sorted = entries_sorted_by_key();
    let mut iter = c.iter_key_order();
    assert_eq!(iter.next().unwrap(), (&sorted[0].0, &sorted[0].1));
    assert_eq!(iter.next_back().unwrap(), (&sorted[2].0, &sorted[2].1));
    assert_eq!(iter.next().unwrap(), (&sorted[1].0, &sorted[1].1));
    assert!(iter.next().is_none());
    assert!(iter.next_back().is_none());
}

#[test]
fn empty_iter_key_order_mut() {
    let mut c: ConstLru<u8, u64, 1, u8> = ConstLru::new();
    let mut iter = c.iter_key_order_mut();
    assert_eq!(iter.next(), None);
    assert_eq!(iter.next_back(), None);
}

#[test]
fn iter_key_order_mut_fwd_only() {
    let mut c = create_const_lru();
    let sorted = entries_sorted_by_key();
    for (i, (k, v)) in c.iter_key_order_mut().enumerate() {
        assert_eq!(*k, sorted[i].0);
        assert_eq!(*v, sorted[i].1);
        *v = *v + 1;
    }
    for (k, v) in ENTRIES {
        assert_eq!(*c.get_untouched(&k).unwrap(), v + 1);
    }
}

#[test]
fn iter_key_order_mut_rev_only() {
    let mut c = create_const_lru();
    let sorted = entries_sorted_by_key();
    for (i, (k, v)) in c.iter_key_order_mut().rev().enumerate() {
        let rev_i = sorted.len() - i - 1;
        assert_eq!(*k, sorted[rev_i].0);
        assert_eq!(*v, sorted[rev_i].1);
        *v = *v + 1;
    }
    for (k, v) in ENTRIES {
        assert_eq!(*c.get_untouched(&k).unwrap(), v + 1);
    }
}

#[test]
fn iter_key_order_mut_mitm() {
    let mut c = create_const_lru();
    let sorted = entries_sorted_by_key();
    let mut iter = c.iter_key_order_mut();
    let (k, v) = iter.next().unwrap();
    assert_eq!(k, &sorted[0].0);
    assert_eq!(v, &sorted[0].1);
    *v = *v + 1;
    let (k, v) = iter.next_back().unwrap();
    assert_eq!(k, &sorted[2].0);
    assert_eq!(v, &sorted[2].1);
    *v = *v + 1;
    let (k, v) = iter.next().unwrap();
    assert_eq!(k, &sorted[1].0);
    assert_eq!(v, &sorted[1].1);
    *v = *v + 1;
    assert!(iter.next().is_none());
    assert!(iter.next_back().is_none());
    for (k, v) in ENTRIES {
        assert_eq!(*c.get_untouched(&k).unwrap(), v + 1);
    }
}