signal_processing 0.3.0

A signal processing library.
Documentation
use ndarray::{Array1, Array2, ArrayView1, ArrayView2};

use crate::quantities::ListsOrSingle;

pub trait MatrixOrSingle<T>: ListsOrSingle<T>
{
    fn matrix_dim(&self) -> (usize, usize);

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone;
}

impl<T> MatrixOrSingle<T> for T
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (1, 1)
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_elem((1, 1), self.clone())
    }
}

impl<T> MatrixOrSingle<T> for Vec<T>
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (1, self.len())
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_shape_fn(MatrixOrSingle::<T>::matrix_dim(self), |(_, i)| self[i].clone())
    }
}
impl<T> MatrixOrSingle<T> for [T]
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (1, self.len())
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_shape_fn(MatrixOrSingle::<T>::matrix_dim(self), |(_, i)| self[i].clone())
    }
}
impl<T, const N: usize> MatrixOrSingle<T> for [T; N]
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (1, N)
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_shape_fn(MatrixOrSingle::<T>::matrix_dim(self), |(_, i)| self[i].clone())
    }
}
impl<T> MatrixOrSingle<T> for &[T]
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (1, self.len())
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_shape_fn(MatrixOrSingle::<T>::matrix_dim(self), |(_, i)| self[i].clone())
    }
}
impl<T, const N: usize> MatrixOrSingle<T> for &[T; N]
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (1, N)
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_shape_fn(MatrixOrSingle::<T>::matrix_dim(self), |(_, i)| self[i].clone())
    }
}

impl<T, const N: usize, const M: usize> MatrixOrSingle<T> for [[T; N]; M]
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (M, N)
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_shape_fn((M, N), |(i, j)| self[i][j].clone())
    }
}
impl<T, const N: usize, const M: usize> MatrixOrSingle<T> for &[[T; N]; M]
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (M, N)
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_shape_fn((M, N), |(i, j)| self[i][j].clone())
    }
}

impl<T, const N: usize, const M: usize> MatrixOrSingle<T> for [&[T; N]; M]
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (M, N)
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_shape_fn((M, N), |(i, j)| self[i][j].clone())
    }
}
impl<T, const N: usize, const M: usize> MatrixOrSingle<T> for &[&[T; N]; M]
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (M, N)
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_shape_fn((M, N), |(i, j)| self[i][j].clone())
    }
}

impl<T, const N: usize> MatrixOrSingle<T> for Vec<[T; N]>
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (self.len(), N)
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_shape_fn((self.len(), N), |(i, j)| self[i][j].clone())
    }
}
impl<T, const N: usize> MatrixOrSingle<T> for &[[T; N]]
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (self.len(), N)
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_shape_fn((self.len(), N), |(i, j)| self[i][j].clone())
    }
}
impl<T, const N: usize> MatrixOrSingle<T> for [[T; N]]
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (self.len(), N)
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_shape_fn((self.len(), N), |(i, j)| self[i][j].clone())
    }
}

impl<T, const N: usize> MatrixOrSingle<T> for Vec<&[T; N]>
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (self.len(), N)
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_shape_fn((self.len(), N), |(i, j)| self[i][j].clone())
    }
}
impl<T, const N: usize> MatrixOrSingle<T> for &[&[T; N]]
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (self.len(), N)
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_shape_fn((self.len(), N), |(i, j)| self[i][j].clone())
    }
}
impl<T, const N: usize> MatrixOrSingle<T> for [&[T; N]]
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (self.len(), N)
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        Array2::from_shape_fn((self.len(), N), |(i, j)| self[i][j].clone())
    }
}

impl<T> MatrixOrSingle<T> for Array1<T>
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (1, self.len())
    }

    fn to_array2(&self) -> Array2<T>
        where
            T: Clone
    {
        Array2::from_shape_fn(MatrixOrSingle::<T>::matrix_dim(self), |(_, j)| self[j].clone())
    }
}
impl<'b, T> MatrixOrSingle<T> for ArrayView1<'b, T>
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        (1, self.len())
    }

    fn to_array2(&self) -> Array2<T>
        where
            T: Clone
    {
        Array2::from_shape_fn(MatrixOrSingle::<T>::matrix_dim(self), |(_, j)| self[j].clone())
    }
}

impl<T> MatrixOrSingle<T> for Array2<T>
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        self.dim()
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        self.clone()
    }
}
impl<'b, T> MatrixOrSingle<T> for ArrayView2<'b, T>
{
    fn matrix_dim(&self) -> (usize, usize)
    {
        self.dim()
    }

    fn to_array2(&self) -> Array2<T>
    where
        T: Clone
    {
        self.to_owned()
    }
}