1use core::{mem::MaybeUninit, slice};
2
3pub fn uninit_slice(bytes: &[u8]) -> &[MaybeUninit<u8>] {
4 unsafe { core::slice::from_raw_parts(bytes.as_ptr() as *const _, bytes.len()) }
5}
6
7pub fn uninit_slice_mut(bytes: &mut [u8]) -> &mut [MaybeUninit<u8>] {
8 unsafe { core::slice::from_raw_parts_mut(bytes.as_mut_ptr() as *mut _, bytes.len()) }
9}
10
11pub type FlashWordBuffer = FlashBuffer<4>;
12
13pub type FlashSectorBuffer = FlashBuffer<4096>;
14
15#[repr(C, align(4))]
16pub union FlashBuffer<const N: usize> {
17 bytes: [MaybeUninit<u8>; N],
18}
19
20impl<const N: usize> FlashBuffer<N> {
21 pub const fn uninit() -> Self {
22 Self {
23 bytes: [MaybeUninit::uninit(); N],
24 }
25 }
26
27 pub fn as_bytes_mut(&mut self) -> &mut [MaybeUninit<u8>] {
28 unsafe { self.bytes.as_mut() }
29 }
30
31 pub unsafe fn assume_init_bytes(&self) -> &[u8] {
32 unsafe { slice::from_raw_parts(self.bytes.as_ptr() as *const _, self.bytes.len()) }
33 }
34
35 pub unsafe fn assume_init_bytes_mut(&mut self) -> &mut [u8] {
36 unsafe { slice::from_raw_parts_mut(self.bytes.as_mut_ptr() as *mut _, self.bytes.len()) }
37 }
38}