use crate::error::MemoryError;
pub trait AnyVec<T>
where
Self: Default + AsRef<[T]> + AsMut<[T]> + IntoIterator<Item = T>,
{
fn new(elements: &[T]) -> Result<Self, MemoryError>
where
T: Clone,
{
let mut this = Self::default();
this.extend(elements)?;
Ok(this)
}
fn extend(&mut self, elements: &[T]) -> Result<(), MemoryError>
where
T: Clone;
fn insert(&mut self, index: usize, element: T) -> Result<(), MemoryError>;
fn push(&mut self, element: T) -> Result<(), MemoryError> {
self.insert(self.as_ref().len(), element)
}
}
#[cfg(feature = "std")]
impl<T> AnyVec<T> for std::vec::Vec<T> {
fn insert(&mut self, index: usize, element: T) -> Result<(), MemoryError> {
use crate::err;
use crate::error::Memory;
use core::cmp;
let index = cmp::min(index, self.len());
self.try_reserve(1).map_err(|_| err!(Memory, "failed to allocate memory"))?;
self.insert(index, element);
Ok(())
}
fn extend(&mut self, elements: &[T]) -> Result<(), MemoryError>
where
T: Clone,
{
use crate::err;
use crate::error::Memory;
self.try_reserve(elements.len()).map_err(|_| err!(Memory, "failed to allocate memory"))?;
self.extend_from_slice(elements);
Ok(())
}
}
#[cfg(feature = "arrayvec")]
impl<T, const CAP: usize> AnyVec<T> for arrayvec::ArrayVec<T, CAP> {
fn insert(&mut self, index: usize, element: T) -> Result<(), MemoryError> {
use crate::err;
use crate::error::Memory;
use core::cmp;
let index = cmp::min(index, self.len());
self.try_insert(index, element).map_err(|_| err!(Memory, "not enough memory"))
}
fn extend(&mut self, elements: &[T]) -> Result<(), MemoryError>
where
T: Clone,
{
use crate::err;
use crate::error::Memory;
for element in elements.iter().cloned() {
self.try_push(element).map_err(|_| err!(Memory, "not enough memory"))?;
}
Ok(())
}
}
#[cfg(feature = "heapless")]
impl<T, const CAP: usize> AnyVec<T> for heapless::Vec<T, CAP> {
fn insert(&mut self, index: usize, element: T) -> Result<(), MemoryError> {
use crate::err;
use crate::error::Memory;
use core::cmp;
let index = cmp::min(index, self.len());
self.insert(index, element).map_err(|_| err!(Memory, "not enough memory"))
}
fn extend(&mut self, elements: &[T]) -> Result<(), MemoryError>
where
T: Clone,
{
use crate::err;
use crate::error::Memory;
for element in elements.iter().cloned() {
self.push(element).map_err(|_| err!(Memory, "not enough memory"))?;
}
Ok(())
}
}