fera-array 0.1.0

Arrays traits and implementations (prefixed, copy on write, nested, etc)
Documentation
use {Array, DynamicArray};

use std::ops::{Index, IndexMut};

#[derive(Clone)]
pub struct VecArray<T>(Vec<T>);

impl<T> Index<usize> for VecArray<T> {
    type Output = T;

    #[inline]
    fn index(&self, index: usize) -> &T {
        self.0.index(index)
    }
}

impl<T> IndexMut<usize> for VecArray<T> {
    #[inline]
    fn index_mut(&mut self, index: usize) -> &mut T {
        self.0.index_mut(index)
    }
}

impl<T> Array<T> for VecArray<T> {
    #[inline]
    fn with_value(value: T, n: usize) -> Self
        where Self: Sized,
              T: Clone
    {
        VecArray(vec![value; n])
    }

    #[inline]
    fn len(&self) -> usize {
        self.0.len()
    }

    #[inline]
    fn is_empty(&self) -> bool {
        self.0.is_empty()
    }

    #[inline]
    fn get(&self, index: usize) -> Option<&T> {
        self.0.get(index)
    }

    #[inline]
    fn get_mut(&mut self, index: usize) -> Option<&mut T> {
        self.0.get_mut(index)
    }

    #[inline]
    unsafe fn get_unchecked(&self, index: usize) -> &T {
        self.0.get_unchecked(index)
    }

    #[inline]
    unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
        self.0.get_unchecked_mut(index)
    }
}

impl<T> DynamicArray<T> for VecArray<T> {
    #[inline]
    fn with_capacity(capacity: usize) -> Self
        where Self: Sized
    {
        VecArray(Vec::with_capacity(capacity))
    }

    #[inline]
    fn capacity(&self) -> usize {
        self.0.capacity()
    }

    #[inline]
    unsafe fn set_len(&mut self, len: usize) {
        self.0.set_len(len);
    }

    #[inline]
    fn reserve(&mut self, additional: usize) {
        self.0.reserve(additional);
    }

    #[inline]
    fn push(&mut self, value: T) {
        self.0.push(value);
    }

    #[inline]
    fn extend<I>(&mut self, iter: I)
        where I: IntoIterator<Item = T>
    {
        Extend::extend(&mut self.0, iter);
    }

    #[inline]
    fn extend_from_slice(&mut self, other: &[T])
        where T: Clone
    {
        self.0.extend_from_slice(other);
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    use {ArrayTests, DynamicArrayTests};

    struct T;

    impl ArrayTests for T {
        type A = VecArray<usize>;
    }

    delegate_tests!{
        T,
        basic_0,
        basic_001k,
        basic_100k,
        clone_001k,
        clone_100k
    }

    impl DynamicArrayTests for T {}

    delegate_tests!{
        T,
        capacity,
        push_1k,
        clone_push
    }

    #[cfg(all(feature = "nightly", test))]
    mod benchs {
        use super::T;
        use test::Bencher;
        use ArrayBenchs;

        impl ArrayBenchs for T {}

        delegate_benchs!{
            T,
            fold_xor_0001k,
            fold_xor_0010k,
            fold_xor_0100k,
            fold_xor_1000k,
            clone_change_0001k,
            clone_change_0010k,
            clone_change_0100k,
            clone_change_1000k
        }
    }
}