esp_storage/
buffer.rs

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}