prefix-trie 0.9.0

Prefix trie (tree) datastructure (both a set and a map) that provides exact and longest-prefix matches.
Documentation
use super::*;

qc!(trie_ref_root_iter, _trie_ref_root_iter);
fn _trie_ref_root_iter(entries: Entries) -> bool {
    let (map, reference) = build_map(entries);
    let want = entries_in_view(&reference, None);
    let got = map
        .view()
        .into_iter()
        .map(|(prefix, value)| (prefix, *value))
        .collect::<Vec<_>>();
    got == want
}

qc!(trie_ref_sub_iter, _trie_ref_sub_iter);
fn _trie_ref_sub_iter((entries, root): (Entries, TestPrefix)) -> bool {
    let (map, reference) = build_map(entries);
    let want = entries_in_view(&reference, Some(root));
    let got = map
        .view_at(&root)
        .map(|view| {
            view.into_iter()
                .map(|(prefix, value)| (prefix, *value))
                .collect::<Vec<_>>()
        })
        .unwrap_or_default();
    got == want
}

qc!(trie_ref_root_lpm, _trie_ref_root_lpm);
fn _trie_ref_root_lpm((entries, query): (Entries, TestPrefix)) -> bool {
    let (map, reference) = build_map(entries);
    let entries = entries_in_view(&reference, None);
    let want = lpm_in_view(&entries, &query);
    let got = map
        .view()
        .find_lpm_value(&query)
        .map(|(prefix, value)| (prefix, *value));
    got == want
}

qc!(trie_ref_sub_lpm, _trie_ref_sub_lpm);
fn _trie_ref_sub_lpm((entries, root, query): (Entries, TestPrefix, TestPrefix)) -> bool {
    let (map, reference) = build_map(entries);
    let entries = entries_in_view(&reference, Some(root));
    let want = lpm_in_view(&entries, &query);
    let got = map
        .view_at(&root)
        .and_then(|view| view.find_lpm_value(&query))
        .map(|(prefix, value)| (prefix, *value));
    got == want
}

qc!(trie_ref_mut_root_iter, _trie_ref_mut_root_iter);
fn _trie_ref_mut_root_iter(entries: Entries) -> bool {
    let (mut map, reference) = build_map(entries);
    let want = entries_in_view(&reference, None);
    let got = (&mut map)
        .view()
        .into_iter()
        .map(|(prefix, value)| (prefix, *value))
        .collect::<Vec<_>>();
    got == want
}

qc!(trie_ref_mut_sub_iter, _trie_ref_mut_sub_iter);
fn _trie_ref_mut_sub_iter((entries, root): (Entries, TestPrefix)) -> bool {
    let (mut map, reference) = build_map(entries);
    let want = entries_in_view(&reference, Some(root));
    let got = (&mut map)
        .view_at(&root)
        .map(|view| {
            view.into_iter()
                .map(|(prefix, value)| (prefix, *value))
                .collect::<Vec<_>>()
        })
        .unwrap_or_default();
    got == want
}

qc!(trie_ref_mut_root_lpm, _trie_ref_mut_root_lpm);
fn _trie_ref_mut_root_lpm((entries, query): (Entries, TestPrefix)) -> bool {
    let (mut map, reference) = build_map(entries);
    let entries = entries_in_view(&reference, None);
    let want = lpm_in_view(&entries, &query);
    let got = (&mut map)
        .view()
        .find_lpm_value(&query)
        .map(|(prefix, value)| (prefix, *value));
    got == want
}

qc!(trie_ref_mut_sub_lpm, _trie_ref_mut_sub_lpm);
fn _trie_ref_mut_sub_lpm((entries, root, query): (Entries, TestPrefix, TestPrefix)) -> bool {
    let (mut map, reference) = build_map(entries);
    let entries = entries_in_view(&reference, Some(root));
    let want = lpm_in_view(&entries, &query);
    let got = (&mut map)
        .view_at(&root)
        .and_then(|view| view.find_lpm_value(&query))
        .map(|(prefix, value)| (prefix, *value));
    got == want
}