use std::mem::MaybeUninit; use std::ops::{Deref, DerefMut}; pub struct StackVec { values: [MaybeUninit; CAPACITY], len: usize, } impl Deref for StackVec { type Target = [T]; fn deref(&self) -> &Self::Target { self.as_slice() } } impl DerefMut for StackVec { fn deref_mut(&mut self) -> &mut Self::Target { self.as_mut_slice() } } impl FromIterator for StackVec { fn from_iter>(iter: I) -> Self { let mut this = Self::new(); for item in iter { this.push(item); } this } } impl StackVec { pub fn new() -> Self { Self { values: MaybeUninit::uninit_array(), len: 0, } } pub fn len(&self) -> usize { self.len } pub fn is_empty(&self) -> bool { self.len == 0 } pub fn as_slice(&self) -> &[T] { // safety: the first `len` elements are guaranteed to be initialized unsafe { MaybeUninit::slice_assume_init_ref(&self.values[..self.len]) } } pub fn as_mut_slice(&mut self) -> &mut [T] { // safety: the first `len` elements are guaranteed to be initialized unsafe { MaybeUninit::slice_assume_init_mut(&mut self.values[..self.len]) } } pub fn push(&mut self, value: T) { self.values[self.len].write(value); self.len += 1; } }