iptrie 0.11.1

IPv4/v6 prefixes lookup structures (based on tries)
Documentation
#![feature(test)]
extern crate test;

use ip_network_table_deps_treebitmap::IpLookupTable;
use iptrie::set::RTrieSet;
use iptrie::{IpPrefix, Ipv4Prefix, Ipv6Prefix};
use std::fs::File;
use std::io::{BufRead, BufReader};
use std::net::{Ipv4Addr, Ipv6Addr};
use std::str::FromStr;

fn read_ip<P: FromStr>() -> impl Iterator<Item = P> {
    let file = File::open("benches/bgpas.lpm").expect("can’t open LPM file");
    BufReader::new(file)
        .lines()
        .map_while(Result::ok)
        .filter_map(|l| {
            let prefix = l.split(' ').next().expect("bad formatted file");
            prefix.parse::<P>().ok()
        })
}

fn main() {
    let ip = read_ip::<Ipv4Prefix>();
    let trie = RTrieSet::from_iter(ip);
    trie.info();
    let trie = trie.compress();
    trie.info();

    let trie = read_ip::<Ipv4Prefix>().fold(IpLookupTable::<Ipv4Addr, ()>::new(), |mut trie, p| {
        trie.insert(p.network(), p.len() as u32, ());
        trie
    });
    let (a, b) = trie.mem_usage();
    println!(
        "treebitmap: {}k + {}k = {}k",
        a / 1000,
        b / 1000,
        a / 1000 + b / 1000
    );

    let ip = read_ip::<Ipv6Prefix>();
    let trie = RTrieSet::from_iter(ip);
    trie.info();
    let trie = trie.compress();
    trie.info();

    let trie = read_ip::<Ipv6Prefix>().fold(IpLookupTable::<Ipv6Addr, ()>::new(), |mut trie, p| {
        trie.insert(p.network(), p.len() as u32, ());
        trie
    });
    let (a, b) = trie.mem_usage();
    println!(
        "treebitmap: {}k + {}k = {}k",
        a / 1000,
        b / 1000,
        a / 1000 + b / 1000
    );
}