#[derive(Debug, Copy, Clone, Hash, PartialEq)]
pub struct WithOffset<T> {
pub offset: usize,
pub value: T,
}
impl<T> WithOffset<T> {
pub fn new(offset: usize, value: T) -> Self {
Self { offset, value }
}
pub fn new_head(value: T) -> Self {
Self::new(0, value)
}
pub fn shift(mut self, n: usize) -> Self {
self.offset += n;
self
}
pub fn map_value<U, F: FnOnce(T) -> U>(self, f: F) -> WithOffset<U> {
let Self { offset, value } = self;
WithOffset {
offset,
value: f(value),
}
}
}
#[derive(Debug, Copy, Clone, Hash, PartialEq)]
pub struct WithSize<T> {
pub size: usize,
pub value: T,
}
impl<T> WithSize<T> {
pub fn new(size: usize, value: T) -> Self {
Self { size, value }
}
pub fn add(&mut self, n: usize) {
self.size += n;
}
pub fn map_value<U, F: FnOnce(T) -> U>(self, f: F) -> WithSize<U> {
let Self { size, value } = self;
WithSize {
size,
value: f(value),
}
}
}
#[derive(Debug, Copy, Clone, Hash, PartialEq)]
pub enum StdError {
MissingBytes(usize),
}
pub trait Codec: core::marker::Sized {
type Error;
fn encoded_size(&self) -> usize;
unsafe fn encode_in(&self, out: &mut [u8]) -> usize;
fn decode(out: &[u8]) -> Result<WithSize<Self>, WithOffset<Self::Error>>;
fn encode(&self) -> Box<[u8]> {
let mut data = vec![0; self.encoded_size()].into_boxed_slice();
unsafe { self.encode_in(&mut data) };
data
}
}