flatty_base/
emplacer.rs

1use crate::{
2    error::Error,
3    traits::{FlatSized, FlatUnsized},
4    utils::mem::check_align_and_min_size,
5};
6
7/// In-place initializer of flat type.
8pub unsafe trait Emplacer<T: FlatUnsized + ?Sized>: Sized {
9    unsafe fn emplace_unchecked(self, bytes: &mut [u8]) -> Result<(), Error>;
10
11    /// Apply initializer for uninitialized memory.
12    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
18/// Emplacer that cannot be instantiated and used as a placeholder for unused parameters.
19pub 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}