iptrie 0.11.1

IPv4/v6 prefixes lookup structures (based on tries)
Documentation
use iptrie::Ipv4Prefix;
use iptrie::Ipv4RTrieSet;
use std::net::Ipv4Addr;

fn main() {
    let prefixes = ["1.1.0.0/24", "1.1.1.0/24", "1.1.0.0/20", "1.2.2.0/24"];

    let iter = prefixes.iter().map(|x| x.parse().unwrap());

    // a set based on Patricia trie
    let trie = Ipv4RTrieSet::from_iter(iter);

    // lpm lookup for Ipv4 address
    assert_eq!(
        trie.lookup(&"1.1.1.2".parse::<Ipv4Addr>().unwrap())
            .to_string(),
        "1.1.1.0/24"
    );
    assert_eq!(
        trie.lookup(&"1.1.2.2".parse::<Ipv4Addr>().unwrap())
            .to_string(),
        "1.1.0.0/20"
    );

    // lpm lookup for Ipv4 prefix also works
    assert_eq!(
        trie.lookup(&"1.1.0.0/25".parse::<Ipv4Prefix>().unwrap())
            .to_string(),
        "1.1.0.0/24"
    );
    assert_eq!(
        trie.lookup(&"1.1.0.0/21".parse::<Ipv4Prefix>().unwrap())
            .to_string(),
        "1.1.0.0/20"
    );

    // now, compute the set based on LC-trie
    let lctrie = trie.compress();

    // lpm lookup for Ipv4 address
    assert_eq!(
        lctrie
            .lookup(&"1.1.1.2".parse::<Ipv4Addr>().unwrap())
            .to_string(),
        "1.1.1.0/24"
    );
    assert_eq!(
        lctrie
            .lookup(&"1.1.2.2".parse::<Ipv4Addr>().unwrap())
            .to_string(),
        "1.1.0.0/20"
    );

    // lpm lookup for Ipv4 prefix also works
    assert_eq!(
        lctrie
            .lookup(&"1.1.0.0/25".parse::<Ipv4Prefix>().unwrap())
            .to_string(),
        "1.1.0.0/24"
    );
    assert_eq!(
        lctrie
            .lookup(&"1.1.0.0/21".parse::<Ipv4Prefix>().unwrap())
            .to_string(),
        "1.1.0.0/20"
    );
}