use crate::hash::Hash;
#[derive(Clone, Copy)]
pub struct Lanes<const ROTATE: u32>(u64, u64);
impl<const ROTATE: u32> Default for Lanes<ROTATE> {
fn default() -> Lanes<ROTATE> {
Lanes(0xcbf2_9ce4_8422_2325, 0x9e37_79b9_7f4a_7c15)
}
}
impl<const ROTATE: u32> Lanes<ROTATE> {
pub fn from(seed: Hash) -> Lanes<ROTATE> {
Lanes(seed.0, seed.1)
}
pub fn word(&mut self, part: u64) {
self.0 = (self.0 ^ part).wrapping_mul(0x0000_0100_0000_01b3);
self.1 = (self.1 ^ part.rotate_left(ROTATE)).wrapping_mul(0x8803_55f2_1e6d_1965);
}
pub fn finish(self) -> Hash {
Hash(self.0, self.1)
}
}