1use crate::{
2 error::Error,
3 traits::{FlatSized, FlatUnsized},
4 utils::mem::check_align_and_min_size,
5};
6
7pub unsafe trait Emplacer<T: FlatUnsized + ?Sized>: Sized {
9 unsafe fn emplace_unchecked(self, bytes: &mut [u8]) -> Result<(), Error>;
10
11 fn emplace(self, bytes: &mut [u8]) -> Result<(), Error> {
13 check_align_and_min_size::<T>(bytes)?;
14 unsafe { self.emplace_unchecked(bytes) }
15 }
16}
17
18pub enum NeverEmplacer {}
20
21unsafe impl<T: FlatUnsized + ?Sized> Emplacer<T> for NeverEmplacer {
22 unsafe fn emplace_unchecked(self, _: &mut [u8]) -> Result<(), Error> {
23 unreachable!()
24 }
25}
26
27unsafe impl<T: FlatSized> Emplacer<T> for T {
28 unsafe fn emplace_unchecked(self, bytes: &mut [u8]) -> Result<(), Error> {
29 unsafe { Self::ptr_from_bytes(bytes).write(self) };
30 Ok(())
31 }
32}