1 use managed::ManagedSlice; 2 3 /// Error value indicating insufficient capacity. 4 #[derive(Debug, Clone, Copy, Eq, Ord, PartialEq, PartialOrd)] 5 pub struct CapacityError<Element>(pub Element); 6 7 /// Wraps a ManagedSlice in a vec-like interface. 8 pub struct ManagedVec<'a, 'b, T> { 9 buf: &'b mut ManagedSlice<'a, T>, 10 len: usize, 11 } 12 13 impl<'a, 'b, T> ManagedVec<'a, 'b, T> { new_with_idx(buf: &'b mut ManagedSlice<'a, T>, len: usize) -> Self14 pub fn new_with_idx(buf: &'b mut ManagedSlice<'a, T>, len: usize) -> Self { 15 ManagedVec { buf, len } 16 } 17 push(&mut self, value: T) -> Result<(), CapacityError<T>>18 pub fn push(&mut self, value: T) -> Result<(), CapacityError<T>> { 19 if self.len < self.buf.len() { 20 self.buf[self.len] = value; 21 self.len += 1; 22 Ok(()) 23 } else { 24 match &mut self.buf { 25 ManagedSlice::Borrowed(_) => Err(CapacityError(value)), 26 #[cfg(feature = "alloc")] 27 ManagedSlice::Owned(buf) => { 28 buf.push(value); 29 Ok(()) 30 } 31 } 32 } 33 } 34 35 #[cfg(feature = "trace-pkt")] as_slice<'c: 'b>(&'c self) -> &'b [T]36 pub fn as_slice<'c: 'b>(&'c self) -> &'b [T] { 37 &self.buf[..self.len] 38 } 39 } 40