musli/alloc/
slice_buffer.rs1use core::mem::MaybeUninit;
2use core::slice::from_raw_parts_mut;
3
4use super::ArrayBuffer;
5
6mod sealed {
7 use core::mem::MaybeUninit;
8
9 use super::super::ArrayBuffer;
10
11 pub trait Sealed {}
12 impl Sealed for [MaybeUninit<u8>] {}
13 impl Sealed for [MaybeUninit<u16>] {}
14 impl Sealed for [MaybeUninit<u32>] {}
15 impl Sealed for [MaybeUninit<u64>] {}
16 impl Sealed for [MaybeUninit<u128>] {}
17 impl<const N: usize> Sealed for [MaybeUninit<u8>; N] {}
18 impl<const N: usize> Sealed for [MaybeUninit<u16>; N] {}
19 impl<const N: usize> Sealed for [MaybeUninit<u32>; N] {}
20 impl<const N: usize> Sealed for [MaybeUninit<u64>; N] {}
21 impl<const N: usize> Sealed for [MaybeUninit<u128>; N] {}
22 impl Sealed for [u8] {}
23 impl Sealed for [u16] {}
24 impl Sealed for [u32] {}
25 impl Sealed for [u64] {}
26 impl Sealed for [u128] {}
27 impl<const N: usize> Sealed for [u8; N] {}
28 impl<const N: usize> Sealed for [u16; N] {}
29 impl<const N: usize> Sealed for [u32; N] {}
30 impl<const N: usize> Sealed for [u64; N] {}
31 impl<const N: usize> Sealed for [u128; N] {}
32 impl<const N: usize> Sealed for ArrayBuffer<N> {}
33}
34
35pub trait SliceBuffer: self::sealed::Sealed {
40 #[doc(hidden)]
41 fn as_uninit_bytes(&mut self) -> &mut [MaybeUninit<u8>];
42}
43
44impl SliceBuffer for [u8] {
55 #[inline]
56 fn as_uninit_bytes(&mut self) -> &mut [MaybeUninit<u8>] {
57 unsafe { from_raw_parts_mut(self.as_mut_ptr().cast(), self.len()) }
59 }
60}
61
62impl<const N: usize> SliceBuffer for [u8; N] {
73 #[inline]
74 fn as_uninit_bytes(&mut self) -> &mut [MaybeUninit<u8>] {
75 self.as_mut_slice().as_uninit_bytes()
76 }
77}
78
79impl SliceBuffer for [MaybeUninit<u8>] {
92 #[inline]
93 fn as_uninit_bytes(&mut self) -> &mut [MaybeUninit<u8>] {
94 self
95 }
96}
97
98impl<const N: usize> SliceBuffer for [MaybeUninit<u8>; N] {
113 #[inline]
114 fn as_uninit_bytes(&mut self) -> &mut [MaybeUninit<u8>] {
115 self
116 }
117}
118
119impl<const N: usize> SliceBuffer for ArrayBuffer<N> {
132 #[inline]
133 fn as_uninit_bytes(&mut self) -> &mut [MaybeUninit<u8>] {
134 self
135 }
136}
137
138macro_rules! primitive {
139 ($($ty:ty, $len:expr),* $(,)?) => {
140 $(
141 #[doc = concat!(" The [`SliceBuffer`] implementation for `[", stringify!($ty), "]`.")]
142 #[doc = concat!(" let mut bytes = [0", stringify!($ty), "; 128];")]
150 #[doc = concat!(" # assert_eq!(bytes.as_uninit_bytes().len(), ", stringify!($len), ");")]
151 impl SliceBuffer for [$ty] {
154 #[inline]
155 fn as_uninit_bytes(&mut self) -> &mut [MaybeUninit<u8>] {
156 unsafe {
158 let len = <[_]>::len(self) * (<$ty>::BITS / 8u32) as usize;
159 from_raw_parts_mut(self.as_mut_ptr().cast(), len)
160 }
161 }
162 }
163
164 #[doc = concat!(" The [`SliceBuffer`] implementation for `[MaybeUninit<", stringify!($ty), ">]`.")]
165 #[doc = concat!(" let mut bytes: [MaybeUninit<", stringify!($ty), ">; 128] = [const { MaybeUninit::uninit() }; 128];")]
175 #[doc = concat!(" # assert_eq!(bytes.as_uninit_bytes().len(), ", stringify!($len), ");")]
176 impl SliceBuffer for [MaybeUninit<$ty>] {
179 #[inline]
180 fn as_uninit_bytes(&mut self) -> &mut [MaybeUninit<u8>] {
181 unsafe {
183 let len = <[_]>::len(self) * (<$ty>::BITS / 8u32) as usize;
184 from_raw_parts_mut(self.as_mut_ptr().cast(), len)
185 }
186 }
187 }
188
189 #[doc = concat!(" The [`SliceBuffer`] implementation for `[", stringify!($ty), "]`.")]
190 #[doc = concat!(" let mut bytes = [0", stringify!($ty), "; 128];")]
200 #[doc = concat!(" # assert_eq!(bytes.as_uninit_bytes().len(), ", stringify!($len), ");")]
201 impl<const N: usize> SliceBuffer for [$ty; N] {
204 #[inline]
205 fn as_uninit_bytes(&mut self) -> &mut [MaybeUninit<u8>] {
206 self.as_mut_slice().as_uninit_bytes()
207 }
208 }
209
210 #[doc = concat!(" The [`SliceBuffer`] implementation for `[MaybeUninit<", stringify!($ty), ">; N]`.")]
211 #[doc = concat!(" let mut bytes = [0", stringify!($ty), "; 128];")]
219 #[doc = concat!(" # assert_eq!(bytes.as_uninit_bytes().len(), ", stringify!($len), ");")]
220 impl<const N: usize> SliceBuffer for [MaybeUninit<$ty>; N] {
223 #[inline]
224 fn as_uninit_bytes(&mut self) -> &mut [MaybeUninit<u8>] {
225 self.as_mut_slice().as_uninit_bytes()
226 }
227 }
228 )*
229 }
230}
231
232primitive! {
233 u16, 128 * 2,
234 u32, 128 * 4,
235 u64, 128 * 8,
236 u128, 128 * 16,
237}