| use managed::ManagedSlice; | |
| /// Error value indicating insufficient capacity. | |
| #[derive(Debug, Clone, Copy, Eq, Ord, PartialEq, PartialOrd)] | |
| pub struct CapacityError<Element>(pub Element); | |
| /// Wraps a ManagedSlice in a vec-like interface. | |
| pub struct ManagedVec<'a, 'b, T> { | |
| buf: &'b mut ManagedSlice<'a, T>, | |
| len: usize, | |
| } | |
| impl<'a, 'b, T> ManagedVec<'a, 'b, T> { | |
| pub fn new_with_idx(buf: &'b mut ManagedSlice<'a, T>, len: usize) -> Self { | |
| ManagedVec { buf, len } | |
| } | |
| pub fn push(&mut self, value: T) -> Result<(), CapacityError<T>> { | |
| if self.len < self.buf.len() { | |
| self.buf[self.len] = value; | |
| self.len += 1; | |
| Ok(()) | |
| } else { | |
| match &mut self.buf { | |
| ManagedSlice::Borrowed(_) => Err(CapacityError(value)), | |
| #[cfg(feature = "alloc")] | |
| ManagedSlice::Owned(buf) => { | |
| buf.push(value); | |
| Ok(()) | |
| } | |
| } | |
| } | |
| } | |
| #[cfg(feature = "trace-pkt")] | |
| pub fn as_slice<'c: 'b>(&'c self) -> &'b [T] { | |
| &self.buf[..self.len] | |
| } | |
| } |