1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
use crate::{emplacer::Emplacer, error::Error, mem::MaybeUninitUnsized};
pub unsafe trait FlatBase {
const ALIGN: usize;
const MIN_SIZE: usize;
fn size(&self) -> usize;
}
pub unsafe trait FlatUnsized: FlatBase {
type AlignAs: Sized;
fn ptr_metadata(this: &MaybeUninitUnsized<Self>) -> usize;
fn bytes_len(this: &Self) -> usize;
fn new_in_place<I: Emplacer<Self>>(this: &mut MaybeUninitUnsized<Self>, emplacer: I) -> Result<&mut Self, Error> {
emplacer.emplace(this)
}
fn assign_in_place<I: Emplacer<Self>>(&mut self, emplacer: I) -> Result<&mut Self, Error> {
Self::new_in_place(unsafe { self.as_mut_uninit() }, emplacer)
}
unsafe fn from_uninit_unchecked(this: &MaybeUninitUnsized<Self>) -> &Self;
unsafe fn from_mut_uninit_unchecked(this: &mut MaybeUninitUnsized<Self>) -> &mut Self;
fn as_uninit(&self) -> &MaybeUninitUnsized<Self>;
unsafe fn as_mut_uninit(&mut self) -> &mut MaybeUninitUnsized<Self>;
fn from_bytes(bytes: &[u8]) -> Result<&MaybeUninitUnsized<Self>, Error> {
MaybeUninitUnsized::from_bytes(bytes)
}
fn from_mut_bytes(bytes: &mut [u8]) -> Result<&mut MaybeUninitUnsized<Self>, Error> {
MaybeUninitUnsized::from_mut_bytes(bytes)
}
}
#[macro_export]
macro_rules! impl_unsized_uninit_cast {
() => {
unsafe fn from_uninit_unchecked(this: &$crate::mem::MaybeUninitUnsized<Self>) -> &Self {
let slice = ::core::ptr::slice_from_raw_parts(this.as_bytes().as_ptr(), Self::ptr_metadata(this));
&*(slice as *const [_] as *const Self)
}
unsafe fn from_mut_uninit_unchecked(this: &mut $crate::mem::MaybeUninitUnsized<Self>) -> &mut Self {
let slice = ::core::ptr::slice_from_raw_parts_mut(this.as_mut_bytes().as_mut_ptr(), Self::ptr_metadata(this));
&mut *(slice as *mut [_] as *mut Self)
}
fn as_uninit(&self) -> &$crate::mem::MaybeUninitUnsized<Self> {
unsafe {
$crate::mem::MaybeUninitUnsized::from_bytes_unchecked(::core::slice::from_raw_parts(
self as *const _ as *const u8,
Self::bytes_len(self),
))
}
}
unsafe fn as_mut_uninit(&mut self) -> &mut $crate::mem::MaybeUninitUnsized<Self> {
$crate::mem::MaybeUninitUnsized::from_mut_bytes_unchecked(::core::slice::from_raw_parts_mut(
self as *mut _ as *mut u8,
Self::bytes_len(self),
))
}
};
}
pub trait FlatCheck: FlatUnsized {
fn validate(this: &MaybeUninitUnsized<Self>) -> Result<&Self, Error>;
fn validate_mut(this: &mut MaybeUninitUnsized<Self>) -> Result<&mut Self, Error> {
Self::validate(this)?;
unsafe { Ok(this.assume_init_mut()) }
}
}
pub unsafe trait Flat: FlatBase + FlatUnsized + FlatCheck {}