use crate::{BytesRef, DynSizedStructure, Header};
use core::mem;
use core::slice;
use ptr_meta::Pointee;
pub trait MaybeDynSized: Pointee {
type Header: Header;
const BASE_SIZE: usize;
fn dst_len(header: &Self::Header) -> Self::Metadata;
fn header(&self) -> &Self::Header {
let ptr = core::ptr::addr_of!(*self);
unsafe { &*ptr.cast::<Self::Header>() }
}
fn payload(&self) -> &[u8] {
let from = mem::size_of::<Self::Header>();
&self.as_bytes()[from..]
}
fn as_bytes(&self) -> BytesRef<Self::Header> {
let ptr = core::ptr::addr_of!(*self);
let size = mem::size_of_val(self);
let slice = unsafe { slice::from_raw_parts(ptr.cast::<u8>(), size) };
BytesRef::try_from(slice).unwrap()
}
fn as_ptr(&self) -> *const Self::Header {
self.as_bytes().as_ptr().cast()
}
}
pub trait Tag: MaybeDynSized {
type IDType: PartialEq + Eq;
const ID: Self::IDType;
}
impl<H: Header> MaybeDynSized for DynSizedStructure<H> {
type Header = H;
const BASE_SIZE: usize = mem::size_of::<H>();
fn dst_len(header: &Self::Header) -> Self::Metadata {
header.payload_len()
}
}