1use crate::{emplacer::Emplacer, error::Error, utils::mem::check_align_and_min_size};
2use core::{
3 mem::{align_of, size_of},
4 ptr,
5};
6
7pub unsafe trait FlatBase: Send + Sync {
9 const ALIGN: usize;
11 const MIN_SIZE: usize;
13
14 fn size(&self) -> usize;
16}
17
18pub unsafe trait FlatUnsized: FlatBase {
22 type AlignAs: Sized + Send + Sync;
24
25 unsafe fn ptr_from_bytes(bytes: *mut [u8]) -> *mut Self;
26 unsafe fn ptr_to_bytes(this: *mut Self) -> *mut [u8];
27
28 unsafe fn from_bytes_unchecked(bytes: &[u8]) -> &Self {
29 &*Self::ptr_from_bytes(bytes as *const _ as *mut _)
30 }
31 unsafe fn from_mut_bytes_unchecked(bytes: &mut [u8]) -> &mut Self {
32 &mut *Self::ptr_from_bytes(bytes)
33 }
34 fn as_bytes(&self) -> &[u8] {
35 unsafe { &*Self::ptr_to_bytes(self as *const _ as *mut _) }
36 }
37 unsafe fn as_mut_bytes(&mut self) -> &mut [u8] {
41 unsafe { &mut *Self::ptr_to_bytes(self as *mut _) }
42 }
43
44 fn new_in_place<I: Emplacer<Self>>(bytes: &mut [u8], emplacer: I) -> Result<&mut Self, Error> {
46 emplacer.emplace(bytes)?;
47 Ok(unsafe { Self::from_mut_bytes_unchecked(bytes) })
48 }
49 fn assign_in_place<I: Emplacer<Self>>(&mut self, emplacer: I) -> Result<&mut Self, Error> {
50 unsafe {
51 let bytes = self.as_mut_bytes();
52 emplacer.emplace_unchecked(bytes)?;
53 Ok(Self::from_mut_bytes_unchecked(bytes))
54 }
55 }
56}
57
58pub unsafe trait FlatValidate: FlatUnsized {
60 unsafe fn validate_unchecked(bytes: &[u8]) -> Result<(), Error>;
61
62 unsafe fn validate_ptr(this: *const Self) -> Result<(), Error> {
63 unsafe { Self::validate_unchecked(&*Self::ptr_to_bytes(this as *mut _)) }
64 }
65
66 fn validate(bytes: &[u8]) -> Result<(), Error> {
68 check_align_and_min_size::<Self>(bytes)?;
69 unsafe { Self::validate_unchecked(bytes) }
70 }
71
72 fn from_bytes(bytes: &[u8]) -> Result<&Self, Error> {
73 Self::validate(bytes)?;
74 Ok(unsafe { Self::from_bytes_unchecked(bytes) })
75 }
76 fn from_mut_bytes(bytes: &mut [u8]) -> Result<&mut Self, Error> {
77 Self::validate(bytes)?;
78 Ok(unsafe { Self::from_mut_bytes_unchecked(bytes) })
79 }
80}
81
82pub unsafe trait Flat: FlatBase + FlatUnsized + FlatValidate {}
96
97pub unsafe trait FlatSized: FlatUnsized + Sized {
103 const SIZE: usize = size_of::<Self>();
105}
106
107unsafe impl<T: Flat> FlatSized for T {}
108
109unsafe impl<T: FlatSized> FlatBase for T {
110 const ALIGN: usize = align_of::<Self>();
111
112 const MIN_SIZE: usize = Self::SIZE;
113
114 fn size(&self) -> usize {
115 Self::SIZE
116 }
117}
118
119unsafe impl<T: FlatSized> FlatUnsized for T {
120 type AlignAs = T;
121
122 unsafe fn ptr_from_bytes(bytes: *mut [u8]) -> *mut Self {
123 bytes as *mut Self
124 }
125 unsafe fn ptr_to_bytes(this: *mut Self) -> *mut [u8] {
126 ptr::slice_from_raw_parts_mut(this as *mut u8, Self::SIZE)
127 }
128}
129
130pub trait FlatDefault: Flat {
136 type DefaultEmplacer: Emplacer<Self>;
137
138 fn default_emplacer() -> Self::DefaultEmplacer;
142
143 fn default_in_place(bytes: &mut [u8]) -> Result<&mut Self, Error> {
145 Self::new_in_place(bytes, Self::default_emplacer())
146 }
147}
148
149impl<T: Flat + Default> FlatDefault for T {
150 type DefaultEmplacer = Self;
151
152 fn default_emplacer() -> Self::DefaultEmplacer {
153 Self::default()
154 }
155}