use dudect_bencher::{ctbench_main_with_seeds, BenchRng, Class, CtRunner};
use rand::{Rng, RngExt};
fn rand_vec(len: usize, rng: &mut BenchRng) -> Vec<u8> {
let mut arr = vec![0u8; len];
rng.fill_bytes(arr.as_mut_slice());
arr
}
fn arith(runner: &mut CtRunner, rng: &mut BenchRng) {
let mut inputs = Vec::new();
let mut classes = Vec::new();
for _ in 0..100_000 {
inputs.push(rng.random::<u32>());
if rng.random::<bool>() {
classes.push(Class::Left);
} else {
classes.push(Class::Right);
}
}
for (u, class) in inputs.into_iter().zip(classes.into_iter()) {
runner.run_one(class, || ((u + 10) / 6) << 5);
}
}
fn vec_eq(runner: &mut CtRunner, rng: &mut BenchRng) {
let vlen = 100;
let mut inputs: Vec<(Vec<u8>, Vec<u8>)> = Vec::new();
let mut classes = Vec::new();
for _ in 0..100_000 {
if rng.random::<bool>() {
let v1 = rand_vec(vlen, rng);
let v2 = v1.clone();
inputs.push((v1, v2));
classes.push(Class::Left);
}
else {
let v1 = rand_vec(vlen, rng);
let mut v2 = v1.clone();
v2[5] = 7;
inputs.push((v1, v2));
classes.push(Class::Right);
}
}
for (class, (u, v)) in classes.into_iter().zip(inputs.into_iter()) {
runner.run_one(class, || u == v);
}
}
ctbench_main_with_seeds!((arith, Some(0x6b6c816d)), (vec_eq, None));