use crate::prelude::*;
use crate::traits::BitVecOpsMut;
use arbitrary::Arbitrary;
use std::collections::BTreeSet;
#[derive(Arbitrary, Debug)]
pub struct Data {
ones: Vec<usize>,
len: usize,
}
pub fn harness(mut data: Data) {
data.len %= 1 << 20; data.len += 1; let ones = data
.ones
.iter()
.map(|value| value % data.len)
.collect::<BTreeSet<_>>();
let mut bitvec = BitVec::<Vec<usize>>::new(data.len);
if data.len != 0 {
ones.iter().for_each(|value| {
bitvec.set(*value, true); });
}
let number_of_ones = bitvec.count_ones();
let bitvec = unsafe { AddNumBits::from_raw_parts(bitvec, number_of_ones) };
macro_rules! test_struct {
($ty:ty) => {
let quantum = <$ty>::new(&bitvec);
for (i, v) in ones.iter().enumerate() {
assert_eq!(
*v,
quantum.select(i).unwrap(),
"Quantum select is wrong at idx {}",
i,
);
}
};
}
test_struct!(SelectAdaptConst<_, _, 6>);
test_struct!(SelectAdaptConst<_, _, 7>);
test_struct!(SelectAdaptConst<_, _, 8>);
test_struct!(SelectAdaptConst<_, _, 9>);
test_struct!(SelectAdaptConst<_, _, 10>);
test_struct!(SelectAdaptConst<_, _, 11>);
test_struct!(SelectAdaptConst<_, _, 12>);
test_struct!(SelectAdaptConst<_, _, 13>);
test_struct!(SelectAdaptConst<_, _, 14>);
}