use core::ops::{Deref, DerefMut};
#[derive(Debug)]
pub struct TryReserveError;
pub trait Vec<T>:
AsMut<[T]>
+ AsRef<[T]>
+ Default
+ Deref<Target = [T]>
+ DerefMut<Target = [T]>
+ Extend<T>
+ FromIterator<T>
{
fn clear(&mut self);
fn capacity(&self) -> usize;
fn reserve(&mut self, capacity: usize);
fn try_resize(&mut self, new_len: usize, value: T) -> Result<(), TryReserveError>
where
T: Clone;
fn try_push(&mut self, value: T) -> Result<(), TryReserveError>;
fn pop(&mut self) -> Option<T>;
fn remove(&mut self, index: usize) -> T;
fn retain_mut<F>(&mut self, f: F)
where
F: FnMut(&mut T) -> bool;
fn try_extend_from_slice(&mut self, slice: &[T]) -> Result<(), TryReserveError>
where
T: Clone;
}
#[cfg(feature = "alloc")]
impl<T> Vec<T> for alloc::vec::Vec<T> {
fn clear(&mut self) {
alloc::vec::Vec::clear(self)
}
fn capacity(&self) -> usize {
alloc::vec::Vec::capacity(self)
}
fn reserve(&mut self, capacity: usize) {
alloc::vec::Vec::reserve(self, capacity)
}
fn try_resize(&mut self, new_len: usize, value: T) -> Result<(), TryReserveError>
where
T: Clone,
{
if new_len > self.len() {
let additional = new_len - self.len();
if alloc::vec::Vec::try_reserve(self, additional).is_err() {
return Err(TryReserveError);
}
}
alloc::vec::Vec::resize(self, new_len, value);
Ok(())
}
fn try_push(&mut self, value: T) -> Result<(), TryReserveError> {
alloc::vec::Vec::push(self, value);
Ok(())
}
fn pop(&mut self) -> Option<T> {
alloc::vec::Vec::pop(self)
}
fn remove(&mut self, index: usize) -> T {
alloc::vec::Vec::remove(self, index)
}
fn retain_mut<F>(&mut self, f: F)
where
F: FnMut(&mut T) -> bool,
{
alloc::vec::Vec::retain_mut(self, f)
}
fn try_extend_from_slice(&mut self, slice: &[T]) -> Result<(), TryReserveError>
where
T: Clone,
{
if alloc::vec::Vec::try_reserve(self, slice.len()).is_err() {
return Err(TryReserveError);
}
alloc::vec::Vec::extend_from_slice(self, slice);
Ok(())
}
}
impl<T, const N: usize> Vec<T> for heapless::Vec<T, N> {
fn clear(&mut self) {
heapless::Vec::clear(self)
}
fn capacity(&self) -> usize {
heapless::Vec::capacity(self)
}
fn reserve(&mut self, capacity: usize) {
let remaining_capacity = heapless::Vec::capacity(self) - (self as &[_]).len();
if remaining_capacity < capacity {
panic!(
"can't reserve more capacity, remaining {} and need {}",
remaining_capacity,
capacity - remaining_capacity
);
}
}
fn try_resize(&mut self, new_len: usize, value: T) -> Result<(), TryReserveError>
where
T: Clone,
{
heapless::Vec::resize(self, new_len, value).map_err(|_| TryReserveError)
}
fn try_push(&mut self, value: T) -> Result<(), TryReserveError> {
heapless::Vec::push(self, value).map_err(|_| TryReserveError)
}
fn pop(&mut self) -> Option<T> {
heapless::Vec::pop(self)
}
fn remove(&mut self, index: usize) -> T {
heapless::Vec::remove(self, index)
}
fn retain_mut<F>(&mut self, f: F)
where
F: FnMut(&mut T) -> bool,
{
heapless::Vec::retain_mut(self, f)
}
fn try_extend_from_slice(&mut self, slice: &[T]) -> Result<(), TryReserveError>
where
T: Clone,
{
heapless::Vec::extend_from_slice(self, slice).map_err(|_| TryReserveError)
}
}