use crate::Reset;
#[cfg(feature = "alloc")]
use alloc::boxed::Box;
pub trait XofReader {
fn read(&mut self, buffer: &mut [u8]);
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
fn read_boxed(&mut self, n: usize) -> Box<[u8]> {
let mut buf = vec![0u8; n].into_boxed_slice();
self.read(&mut buf);
buf
}
}
pub trait ExtendableOutput: Sized {
type Reader: XofReader;
fn finalize_xof(self) -> Self::Reader;
fn finalize_xof_reset(&mut self) -> Self::Reader;
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
fn finalize_boxed(self, n: usize) -> Box<[u8]> {
let mut buf = vec![0u8; n].into_boxed_slice();
self.finalize_xof().read(&mut buf);
buf
}
#[cfg(feature = "alloc")]
#[cfg_attr(docsrs, doc(cfg(feature = "alloc")))]
fn finalize_boxed_reset(&mut self, n: usize) -> Box<[u8]> {
let mut buf = vec![0u8; n].into_boxed_slice();
self.finalize_xof_reset().read(&mut buf);
buf
}
}
pub trait ExtendableOutputDirty: Sized {
type Reader: XofReader;
fn finalize_xof_dirty(&mut self) -> Self::Reader;
}
impl<X: ExtendableOutputDirty + Reset> ExtendableOutput for X {
type Reader = X::Reader;
#[inline]
fn finalize_xof(mut self) -> Self::Reader {
self.finalize_xof_dirty()
}
#[inline]
fn finalize_xof_reset(&mut self) -> Self::Reader {
let reader = self.finalize_xof_dirty();
self.reset();
reader
}
}