use crate::read_write::{Read, Write};
use void::Void;
pub struct SliceReader<'a> {
data: &'a [u8],
}
impl<'a> SliceReader<'a> {
#[inline(always)]
#[must_use]
pub fn new(data: &'a [u8]) -> SliceReader<'a> {
Self { data }
}
}
impl<'a> Read for SliceReader<'a> {
type Error = Void;
#[inline(always)]
fn read(&mut self) -> Result<Option<u8>, Self::Error> {
if let Some((&first, rest)) = self.data.split_first() {
self.data = rest;
Ok(Some(first))
} else {
Ok(None)
}
}
}
#[derive(Debug, Eq, PartialEq)]
pub struct SliceWriteError;
impl core::fmt::Display for SliceWriteError {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
f.write_str("Over- or underflow happened")
}
}
#[cfg(any(test, feature = "std"))]
impl std::error::Error for SliceWriteError {}
pub struct SliceWriter<'a> {
count: usize,
data: &'a mut [u8],
}
impl<'a> SliceWriter<'a> {
#[inline(always)]
#[must_use]
pub fn new(data: &'a mut [u8]) -> SliceWriter<'a> {
Self { count: 0, data }
}
}
impl<'a> Write for SliceWriter<'a> {
type Output = usize;
type Error = SliceWriteError;
#[inline(always)]
fn write(&mut self, data: u8) -> Result<(), Self::Error> {
let d = core::mem::take(&mut self.data);
let (first, rest) = d.split_first_mut().ok_or(SliceWriteError)?;
*first = data;
self.data = rest;
self.count += 1;
Ok(())
}
#[inline(always)]
fn finish(self) -> Result<Self::Output, Self::Error> {
Ok(self.count)
}
}
pub struct SliceWriterExact<'a> {
data: &'a mut [u8],
}
impl<'a> SliceWriterExact<'a> {
#[inline(always)]
#[must_use]
pub fn new(data: &'a mut [u8]) -> SliceWriterExact<'a> {
Self { data }
}
}
impl<'a> Write for SliceWriterExact<'a> {
type Output = ();
type Error = SliceWriteError;
#[inline(always)]
fn write(&mut self, data: u8) -> Result<(), Self::Error> {
let d = core::mem::take(&mut self.data);
let (first, rest) = d.split_first_mut().ok_or(SliceWriteError)?;
*first = data;
self.data = rest;
Ok(())
}
#[inline(always)]
fn finish(self) -> Result<Self::Output, Self::Error> {
if self.data.is_empty() {
Ok(())
} else {
Err(SliceWriteError)
}
}
}