micro_ndarray 0.6.1

Very small multi-dimensional-array implementation
Documentation
use vec_split::{
    accessors::{Accessor, AccessorMut},
    RawVector, SizedVectorArray, Vector, VectorArray,
};

use crate::Array;

impl<T, const D: usize, V: Vector<T, D>> VectorArray<T, D, V, [usize; D]> for Array<V, D> {
    fn get<'a>(&'a self, index: [usize; D]) -> Option<&'a V> {
        Array::get(self, index)
    }

    fn get_mut<'a>(&'a mut self, index: [usize; D]) -> Option<&'a mut V> {
        Array::get_mut(self, index)
    }
}

impl<T, const D: usize, V: RawVector<T, D>> SizedVectorArray<T, D, V, [usize; D]> for Array<V, D> {
    fn ptr(&self) -> *const V {
        self.data.as_ptr()
    }

    fn ptr_mut(&mut self) -> *mut V {
        self.data.as_mut_ptr()
    }

    fn len(&self) -> usize {
        self.data.len()
    }

    #[inline]
    fn convert_index(&self, index: [usize; D]) -> usize {
        let mut real_loc = 0;
        for (i, dim) in index.iter().enumerate() {
            let mut dim = *dim;
            if i == 0 {
                real_loc += dim;
                continue;
            }
            dim *= self.stride[i];
            real_loc += dim;
        }
        real_loc
    }
}

impl<'a, T, const D: usize> Accessor<T, [usize; D]> for Array<T, D> {
    fn get<'b>(&'b self, index: [usize; D]) -> Option<&'b T> {
        <Array<T, D>>::get(self, index)
    }
}
impl<'a, T, const D: usize> AccessorMut<T, [usize; D]> for Array<T, D> {
    fn get_mut<'b>(&'b mut self, index: [usize; D]) -> Option<&'b mut T> {
        <Array<T, D>>::get_mut(self, index)
    }
}