use epserde::prelude::*;
use ptr_hash::{PtrHash, PtrHashParams};
fn main() {
env_logger::init();
let n = 10_000_000;
eprintln!("Generating keys..");
let keys = ptr_hash::util::generate_keys(n);
eprintln!("Building mphf..");
let start = std::time::Instant::now();
let mphf = <PtrHash>::new(&keys, PtrHashParams::default());
eprintln!("construction took: {:?}", start.elapsed());
let path = "/tmp/test.mphf";
let mut file = std::fs::File::create(path).unwrap();
eprintln!("\nSerializing to {path}..");
mphf.serialize(&mut file).unwrap();
let len = file.metadata().unwrap().len();
eprintln!("Size: {len}, bits/key: {}\n", len as f32 * 8. / n as f32);
eprintln!("Load into mmap, with epserde..");
let mphf2 =
<PtrHash>::load_mmap(path, Flags::RANDOM_ACCESS | Flags::TRANSPARENT_HUGE_PAGES).unwrap();
eprintln!("Testing..");
let key = 0;
let idx = mphf2.index(&key);
assert!(idx < n);
let _idx = mphf2.index_no_remap(&key);
eprintln!("Check sum..");
let indices = mphf2.index_stream::<32, true, _>(&keys);
assert_eq!(indices.sum::<usize>(), (n * (n - 1)) / 2);
eprintln!("Check taken..");
let mut taken = vec![false; n];
for key in keys {
let idx = mphf2.index(&key);
assert!(!taken[idx]);
taken[idx] = true;
}
eprintln!("\n\nDO NOT FORGET TO CLEAN UP {path} !!!\n\n");
}