use std::any::Any;
use std::marker::PhantomData;
use std::borrow::Borrow;
use criterion::{black_box, Criterion, criterion_group, criterion_main};
use rand::{Rng, SeedableRng};
use hi_sparse_array::{CompactSparseArray, config, Iter, multi_intersection, SparseHierarchy};
use hi_sparse_array::utils::LendingIterator;
#[derive(Default)]
struct DataBlock(u64);
type CompactArray = CompactSparseArray<DataBlock, 4>;
fn bench_multi_intersection(list: &[CompactArray]) -> u64 {
let intersection = multi_intersection(list.iter());
let mut sum = 0;
let mut intersection = intersection.iter();
while let Some((index, ds)) = intersection.next(){
sum += ds.fold(0, |acc, d| acc+d.0)
}
sum
}
pub fn bench_iter(c: &mut Criterion) {
const COUNT: usize = 10000;
const MAX_RANGE: usize = 1000;
let mut compact_array1 = CompactArray::default();
let mut compact_array2 = CompactArray::default();
let mut compact_array3 = CompactArray::default();
let mut compact_array4 = CompactArray::default();
let mut rng = rand::rngs::StdRng::seed_from_u64(0xe15bb9db3dee3a0f);
for _ in 0..COUNT{
let i1 = rng.gen_range(0..MAX_RANGE);
let i2 = rng.gen_range(0..MAX_RANGE);
let i3 = rng.gen_range(0..MAX_RANGE);
let i4 = rng.gen_range(0..MAX_RANGE);
*compact_array1.get_or_insert(i1*20) = DataBlock(i1 as u64);
*compact_array2.get_or_insert(i2*20) = DataBlock(i2 as u64);
*compact_array1.get_or_insert(i3*20) = DataBlock(i1 as u64);
*compact_array2.get_or_insert(i4*20) = DataBlock(i2 as u64);
}
let compact_arrays = [compact_array1, compact_array2, compact_array3, compact_array4];
c.bench_function("bench_multi_intersection", |b| b.iter(|| bench_multi_intersection(black_box(&compact_arrays))));
}
criterion_group!(benches_iter, bench_iter);
criterion_main!(benches_iter);