use epserde::prelude::*;
use ptr_hash::{PtrHash, PtrHashParams};
type PtrHashXxh3 =
PtrHash<u64, ptr_hash::bucket_fn::Linear, Vec<u32>, ptr_hash::hash::Xxh3Int, Vec<u8>>;
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 = PtrHashXxh3::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}..");
unsafe { 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 full, without epserde..");
let _mphf2 =
unsafe { PtrHashXxh3::deserialize_full(&mut std::fs::File::open(path).unwrap()).unwrap() };
eprintln!("Load into memory, with epserde..");
let _mphf2 = unsafe { PtrHashXxh3::load_mem(path).unwrap().uncase() };
eprintln!("Load into mmap, with epserde..");
let mem_case = unsafe {
PtrHashXxh3::load_mmap(path, Flags::RANDOM_ACCESS | Flags::TRANSPARENT_HUGE_PAGES).unwrap()
};
let mphf2 = mem_case.uncase();
let b = std::fs::read(path).unwrap();
let _mphf2 = unsafe { PtrHashXxh3::deserialize_eps(b.as_ref()).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_maybe_remap::<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");
}