romap 0.4.0

A trait for read-only-maps
Documentation
use crate::RoMap;
use std::collections::HashSet;
use std::fmt::Debug;
use std::hash::Hash;

pub fn test_map<
    'a,
    K: Hash + Eq + Copy + Debug + Ord + 'a,
    V: Eq + Debug + 'a,
    M: RoMap<'a, K, V>,
>(
    m: M,
    not_contained: &K,
) {
    assert_eq!(m.is_empty(), m.len() == 0);
    let assert_contained = |k, should: Option<&V>| {
        assert_eq!(m.contains_key(k), should.is_some());
        assert_eq!(m.get(k), should);
        assert_eq!(m.get_key(k).is_some(), should.is_some());
        assert_eq!(m.get_key_value(k).map(|x| x.1), should);
    };

    let mut max_seen = None;
    let mut seen = HashSet::new();
    let mut keys = m.keys();
    let mut vals = m.values();
    for (k, v) in m.iter() {
        if M::ITER_ORDER_SORTED {
            assert!(Some(k) > max_seen);
            max_seen = Some(k);
        }
        assert_contained(k, Some(v));
        assert!(seen.insert(*k));
        assert_eq!(keys.next(), Some(k));
        assert_eq!(vals.next(), Some(v));
    }
    assert_eq!(keys.next(), None);
    assert_eq!(vals.next(), None);
    assert_contained(not_contained, None);
}

pub fn test_iter_eq<
    'a,
    K: Eq + Ord + Debug + 'a,
    V: Eq + Debug + 'a,
    M1: RoMap<'a, K, V>,
    M2: RoMap<'a, K, V>,
>(
    m1: M1,
    m2: M2,
    mut enforce_order: bool,
) {
    enforce_order |= M1::ITER_ORDER_SORTED && M2::ITER_ORDER_SORTED;
    let mut v1 = m1.iter().collect::<Vec<_>>();
    let mut v2 = m2.iter().collect::<Vec<_>>();
    if !enforce_order {
        v1.sort_unstable_by_key(|x| x.0);
        v2.sort_unstable_by_key(|x| x.0);
    }
    assert_eq!(v1, v2);
}