use bitslice::arithmetic::{comparator, pad, popcnt128};
use bitslice::{BitMatrix, Transpose, B128, B512, B8};
use rand::{Rng, SeedableRng};
use rand_pcg::Pcg64;
use std::mem;
fn main() {
let mut rng = Pcg64::seed_from_u64(42);
let input_words: [u128; 512] = [(); 512].map(|_| rng.gen());
let aligned_words: BitMatrix<B128, 512> = BitMatrix(unsafe { mem::transmute(input_words) });
let bits: BitMatrix<B512, 128> = <B128 as Transpose<B512>>::transpose(aligned_words);
let popcnts: [B512; 8] = popcnt128(&bits.0);
let input_ints: [u8; 512] = [(); 512].map(|_| rng.gen::<u8>() >> 1);
let aligned_ints: BitMatrix<B8, 512> = BitMatrix(unsafe { mem::transmute(input_ints) });
let ints: BitMatrix<B512, 8> = <B8 as Transpose<B512>>::transpose(aligned_ints);
let (_, _, gt) = comparator(&popcnts, &ints.0);
let padded = pad::<_, 1, 8>(&[gt]);
let bools: BitMatrix<B8, 512> = <B512 as Transpose<B8>>::transpose(BitMatrix(padded));
let bools: [bool; 512] = unsafe { mem::transmute(bools) };
let normal_bools: [bool; 512] = input_words
.into_iter()
.zip(input_ints.into_iter())
.map(|(w, i)| w.count_ones() as u8 > i)
.collect::<Vec<_>>()
.try_into()
.unwrap();
assert_eq!(bools, normal_bools);
}