use crate::BlueWorkType;
use kaspa_hashes::HasherBase;
pub mod header;
pub mod sighash;
pub mod sighash_type;
pub mod tx;
#[cfg(feature = "wasm32-sdk")]
pub mod wasm;
pub trait HasherExtensions {
fn write_len(&mut self, len: usize) -> &mut Self;
fn write_bool(&mut self, element: bool) -> &mut Self;
fn write_u8(&mut self, element: u8) -> &mut Self;
fn write_u16(&mut self, element: u16) -> &mut Self;
fn write_u32(&mut self, element: u32) -> &mut Self;
fn write_u64(&mut self, element: u64) -> &mut Self;
fn write_blue_work(&mut self, work: BlueWorkType) -> &mut Self;
fn write_var_bytes(&mut self, bytes: &[u8]) -> &mut Self;
fn write_var_array<D: AsRef<[u8]>>(&mut self, arr: &[D]) -> &mut Self;
}
const _: usize = u64::MAX as usize - usize::MAX;
impl<T: HasherBase> HasherExtensions for T {
#[inline(always)]
fn write_len(&mut self, len: usize) -> &mut Self {
self.update((len as u64).to_le_bytes())
}
#[inline(always)]
fn write_bool(&mut self, element: bool) -> &mut Self {
self.update(if element { [1u8] } else { [0u8] })
}
fn write_u8(&mut self, element: u8) -> &mut Self {
self.update(element.to_le_bytes())
}
fn write_u16(&mut self, element: u16) -> &mut Self {
self.update(element.to_le_bytes())
}
#[inline(always)]
fn write_u32(&mut self, element: u32) -> &mut Self {
self.update(element.to_le_bytes())
}
#[inline(always)]
fn write_u64(&mut self, element: u64) -> &mut Self {
self.update(element.to_le_bytes())
}
#[inline(always)]
fn write_blue_work(&mut self, work: BlueWorkType) -> &mut Self {
let be_bytes = work.to_be_bytes();
let start = be_bytes.iter().copied().position(|byte| byte != 0).unwrap_or(be_bytes.len());
self.write_var_bytes(&be_bytes[start..])
}
#[inline(always)]
fn write_var_bytes(&mut self, bytes: &[u8]) -> &mut Self {
self.write_len(bytes.len()).update(bytes)
}
#[inline(always)]
fn write_var_array<D: AsRef<[u8]>>(&mut self, arr: &[D]) -> &mut Self {
self.write_len(arr.len());
for d in arr {
self.update(d);
}
self
}
}