use std::io::{
Result,
Write,
};
pub trait Output {
type Item;
unsafe fn write_unchecked(
&mut self,
input: &[Self::Item],
index: usize,
count: usize,
) -> Result<usize>;
fn flush(&mut self) -> Result<()>;
}
impl<W> Output for W
where
W: Write + ?Sized,
{
type Item = u8;
#[inline(always)]
unsafe fn write_unchecked(
&mut self,
input: &[u8],
index: usize,
count: usize,
) -> Result<usize> {
debug_assert!(
index
.checked_add(count)
.is_some_and(|end| end <= input.len()),
"unchecked write range exceeds input buffer"
);
let source = unsafe {
core::slice::from_raw_parts(input.as_ptr().add(index), count)
};
self.write(source)
}
#[inline(always)]
fn flush(&mut self) -> Result<()> {
Write::flush(self)
}
}