A RPi Pico powered Lightning Detector
at main 39 lines 1.0 kB view raw
1use alloc::{boxed::Box, vec::Vec}; 2 3use crate::errors::PicoError; 4 5pub fn static_alloc<T>(value: T) -> &'static mut T { 6 Box::leak(Box::new(value)) 7} 8 9pub fn try_buffer<T: Default>(capacity: usize) -> Result<Vec<T>, PicoError> { 10 try_buffer_with(capacity, Default::default) 11} 12 13fn try_buffer_with<T>(capacity: usize, f: impl FnMut() -> T) -> Result<Vec<T>, PicoError> { 14 let mut buffer = Vec::new(); 15 16 buffer.try_reserve_exact(capacity)?; 17 18 buffer.resize_with(capacity, f); 19 20 Ok(buffer) 21} 22 23pub fn try_static_buffer_with<T>( 24 capacity: usize, 25 f: impl FnMut() -> T, 26) -> Result<&'static mut [T], PicoError> { 27 Ok(try_buffer_with(capacity, f)?.leak()) 28} 29 30pub fn try_static_timestamped_block_vecs<const CAP: usize, T: Default + Copy>( 31 block_num: usize, 32) -> Result<&'static mut [(i64, [T; CAP])], PicoError> { 33 let mut blocks = Vec::new(); 34 35 blocks.try_reserve_exact(block_num)?; 36 blocks.resize_with(block_num, || (0, [T::default(); CAP])); 37 38 Ok(blocks.leak()) 39}