use bitslice::arithmetic::{bit_add, fix_endianness, pad};
use bitslice::{BitMatrix, Transpose, B16, B32, B512};
use rand::{Rng, SeedableRng};
use rand_pcg::Pcg64;
use std::mem;
fn main() {
let mut rng = Pcg64::seed_from_u64(42);
let ints_a = [(); 512].map(|_| rng.gen::<u16>());
let ints_b = [(); 512].map(|_| rng.gen::<u16>());
let bits_a = {
let aligned_words: BitMatrix<B16, 512> = BitMatrix(unsafe { mem::transmute(ints_a) });
let mut bits: BitMatrix<B512, 16> = <B16 as Transpose<B512>>::transpose(aligned_words);
fix_endianness::<B512, 2>(&mut bits.0);
bits.0
};
let bits_b = {
let mut bits: BitMatrix<B512, 16> =
<B16 as Transpose<B512>>::transpose(BitMatrix(unsafe { mem::transmute(ints_b) }));
fix_endianness::<B512, 2>(&mut bits.0);
bits.0
};
let sum: [B512; 17] = bit_add::<B512, 16>(&bits_a, &bits_b);
let mut padded = pad::<_, 17, 32>(&sum);
fix_endianness::<B512, 4>(&mut padded);
let bits: BitMatrix<B32, 512> = <B512 as Transpose<B32>>::transpose(BitMatrix(padded));
let ints_sum: [u32; 512] = unsafe { mem::transmute(bits) };
ints_a
.into_iter()
.zip(ints_b.into_iter())
.map(|(a, b)| a as u32 + b as u32)
.zip(ints_sum)
.for_each(|(x, y)| {
assert_eq!(x, y);
})
}