mod leaf_hash;
pub use leaf_hash::*;
mod path_hash;
pub use path_hash::*;
use snarkvm_console_types::prelude::*;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct BooleanHash<const VARIANT: usize>(pub [bool; VARIANT]);
impl<const VARIANT: usize> BooleanHash<VARIANT> {
pub const fn new() -> Self {
Self([false; VARIANT])
}
}
impl<const VARIANT: usize> Default for BooleanHash<VARIANT> {
fn default() -> Self {
Self::new()
}
}
impl<const VARIANT: usize> Distribution<BooleanHash<VARIANT>> for Standard {
#[inline]
fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> BooleanHash<VARIANT> {
let mut array = [false; VARIANT];
for entry in array.iter_mut() {
*entry = rng.r#gen();
}
BooleanHash(array)
}
}
impl<const VARIANT: usize> FromBytes for BooleanHash<VARIANT> {
fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
let mut array = [false; VARIANT];
for bit in array.iter_mut() {
*bit = bool::read_le(&mut reader)?;
}
Ok(Self(array))
}
}
impl<const VARIANT: usize> ToBytes for BooleanHash<VARIANT> {
fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
self.0.as_slice().write_le(&mut writer)
}
}
impl<const VARIANT: usize> Deref for BooleanHash<VARIANT> {
type Target = [bool; VARIANT];
fn deref(&self) -> &Self::Target {
&self.0
}
}