jaggedarray 0.2.11

Multidimensional jagged array
Documentation
use std::ops::{Deref, DerefMut, Index, IndexMut, Range, RangeBounds, RangeFrom, RangeFull};

use tinyvec::{Array, ArrayVec};
pub trait VecLike:
    Deref<Target = [Self::TI]>
    + DerefMut
    + Index<usize, Output = Self::TI>
    + Index<RangeFull, Output = [Self::TI]>
    + Index<Range<usize>, Output = [Self::TI]>
    +Index<RangeFrom<usize>, Output = [Self::TI]>
    +IndexMut<RangeFrom<usize>, Output = [Self::TI]>
    + IndexMut<usize>
    + IndexMut<RangeFull, Output = [Self::TI]>
    + IndexMut<Range<usize>, Output = [Self::TI]>
    + IntoIterator<Item = Self::TI>
    + AsRef<[Self::TI]>
    + AsMut<[Self::TI]>
    + Default
    + FromIterator<Self::TI>
    + Extend<Self::TI>
{
    type TI;
    fn len(&self) -> usize;
    fn is_empty(&self) -> bool {
        self.len() == 0
    }
    fn reserve(&mut self, additional: usize);
    fn push(&mut self, item: Self::Item);
    fn pop(&mut self) -> Option<Self::Item>;
    fn remove(&mut self, index: usize) -> Self::Item;
    fn insert(&mut self, index: usize, item: Self::Item);
    fn clear(&mut self);
    fn truncate(&mut self, len: usize);
    fn remove_range<R>(&mut self, range: R)
    where
        R: RangeBounds<usize>;
}

impl<T> VecLike for Vec<T> {
    type TI = T;
    #[inline]
    fn len(&self) -> usize {
        Vec::len(self)
    }
    #[inline]
    fn push(&mut self, item: T) {
        Vec::push(self, item)
    }
    #[inline]
    fn pop(&mut self) -> Option<T> {
        Vec::pop(self)
    }
    #[inline]
    fn remove(&mut self, index: usize) -> T {
        Vec::remove(self, index)
    }
    #[inline]
    fn insert(&mut self, index: usize, item: T) {
        Vec::insert(self, index, item)
    }
    #[inline]
    fn clear(&mut self) {
        Vec::clear(self)
    }
    #[inline]
    fn reserve(&mut self, additional: usize) {
        Vec::reserve(self, additional)
    }
    #[inline]
    fn truncate(&mut self, len: usize) {
        Vec::truncate(self, len)
    }
    #[inline]
    fn remove_range<R>(&mut self, range: R)
    where
        R: RangeBounds<usize>,
    {
        Vec::drain(self, range).for_each(drop);
    }
}

impl<A: Array + Clone> VecLike for ArrayVec<A> {
    type TI = A::Item;
    #[inline]
    fn len(&self) -> usize {
        ArrayVec::len(self)
    }
    #[inline]
    fn push(&mut self, item: A::Item) {
        ArrayVec::push(self, item)
    }
    #[inline]
    fn pop(&mut self) -> Option<A::Item> {
        ArrayVec::pop(self)
    }
    #[inline]
    fn remove(&mut self, index: usize) -> A::Item {
        ArrayVec::remove(self, index)
    }
    #[inline]
    fn insert(&mut self, index: usize, item: A::Item) {
        ArrayVec::insert(self, index, item)
    }
    #[inline]
    fn clear(&mut self) {
        ArrayVec::clear(self)
    }
    #[inline]
    fn reserve(&mut self, _: usize) {}
    #[inline]
    fn truncate(&mut self, len: usize) {
        ArrayVec::truncate(self, len)
    }
    #[inline]
    fn remove_range<R>(&mut self, range: R)
    where
        R: RangeBounds<usize>,
    {
        ArrayVec::splice(self, range, std::iter::empty());
    }
}