use aligned_vec::ABox;
use bitm::{RankSelect101111, BinaryRankSearch, BitAccess, BitVec, CombinedSampling, Rank, Select, Select0};
use dyn_size_of::GetSize;
use crate::{Conf, Tester};
pub fn build_bit_vec(conf: &Conf) -> (ABox<[u64]>, Tester) {
let mut content = ABox::with_zeroed_bits(conf.universe);
let tester = conf.fill_data(|bit_nr, value| if value {content.init_bit(bit_nr, value)});
(content, tester)
}
pub fn benchmark_rank_select(conf: &super::Conf) {
println!("bitm RankSelect101111:");
let (content, tester) = build_bit_vec(conf);
let (rs, _) = RankSelect101111::<BinaryRankSearch, BinaryRankSearch, _>::build(content);
tester.raport_rank("bitm RankSelect101111", rs.size_bytes(),
|index| unsafe{rs.rank_unchecked(index)});
println!(" select by binary search over ranks (no extra space overhead):");
tester.raport_select1("bitm RankSelect101111 binary search over ranks",
0, |index| unsafe{rs.select_unchecked(index)});
tester.raport_select0("bitm RankSelect101111 binary search over ranks",
0, |index| unsafe{rs.select0_unchecked(index)});
let (rs, _) = RankSelect101111::<CombinedSampling, CombinedSampling, _>::build(rs.content);
println!(" select by combined sampling:");
tester.raport_select1("bitm RankSelect101111 combined sampling",
rs.select_support().size_bytes(),
|index| unsafe{rs.select_unchecked(index)});
tester.raport_select0("bitm RankSelect101111 combined sampling",
rs.select0_support().size_bytes(),
|index| unsafe{rs.select0_unchecked(index)});
}