#![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
);
}