use crate::{
error::Error,
traits::{FlatSized, FlatUnsized},
utils::mem::check_align_and_min_size,
};
pub unsafe trait Emplacer<T: FlatUnsized + ?Sized>: Sized {
unsafe fn emplace_unchecked(self, bytes: &mut [u8]) -> Result<(), Error>;
fn emplace(self, bytes: &mut [u8]) -> Result<(), Error> {
check_align_and_min_size::<T>(bytes)?;
unsafe { self.emplace_unchecked(bytes) }
}
}
pub enum NeverEmplacer {}
unsafe impl<T: FlatUnsized + ?Sized> Emplacer<T> for NeverEmplacer {
unsafe fn emplace_unchecked(self, _: &mut [u8]) -> Result<(), Error> {
unreachable!()
}
}
unsafe impl<T: FlatSized> Emplacer<T> for T {
unsafe fn emplace_unchecked(self, bytes: &mut [u8]) -> Result<(), Error> {
unsafe { (Self::ptr_from_bytes(bytes) as *mut Self).write(self) };
Ok(())
}
}