gen_map 0.1.0

This crate provides customizable generational maps.
Documentation
use crate::GenMap;

#[test]
fn retain_can_keep_everything_and_mutate() {
    let mut map = GenMap::new();
    let k1 = map.insert(10);
    let k2 = map.insert(20);

    map.retain(|_, v| {
        *v += 1;
        true
    });

    assert_eq!(map[k1], 11);
    assert_eq!(map[k2], 21);
    assert_eq!(map.len(), 2);
}

#[test]
fn retain_removes_rejected_values() {
    let mut map = GenMap::new();
    let k1 = map.insert(1);
    let k2 = map.insert(2);
    let k3 = map.insert(3);

    map.retain(|_, v| *v % 2 == 0);

    assert!(map.get(k1).is_none());
    assert!(map.get(k3).is_none());
    assert_eq!(map[k2], 2);
    assert_eq!(map.len(), 1);
}

#[test]
fn retain_passes_the_right_key() {
    let mut map = GenMap::new();
    let k1 = map.insert("a");
    let k2 = map.insert("b");

    map.retain(|key, v| {
        if key == k1 {
            assert_eq!(*v, "a");
        } else {
            assert_eq!(key, k2);
            assert_eq!(*v, "b");
        }
        key != k1
    });

    assert!(map.get(k1).is_none());
    assert_eq!(map[k2], "b");
}

#[test]
fn retain_frees_slots_for_reuse_with_bumped_generation() {
    let mut map = GenMap::new();
    let k1 = map.insert(42);

    map.retain(|key, _| key != k1);
    assert_eq!(map.len(), 0);

    let k2 = map.insert(99);
    assert_eq!(k2.idx, k1.idx);
    assert_ne!(k2.generation.get(), k1.generation.get());
    assert_eq!(map[k2], 99);
}

#[test]
fn retain_drops_removed_values_exactly_once() {
    let tracker = super::DropTracker::new();
    let mut map = GenMap::new();
    let keys: std::vec::Vec<_> = (0..6).map(|_| map.insert(tracker.make_item())).collect();

    map.retain(|key, _| key != keys[1] && key != keys[4]);

    assert_eq!(tracker.total_dropped(), 2);
    assert_eq!(map.len(), 4);
    drop(map);
    tracker.assert_all_dropped_exactly_once(6);
}