array__ops 1.0.3

A selection of useful array operations
Documentation
use core::pin::Pin;

use array_trait::Array;
use slice_ops::AsSlice;

use crate::private;

#[const_trait]
pub trait ArrayFromCollumn<T, const N: usize>: Array + AsSlice<Item = T>
{
    fn from_collumn(collumn: [[T; 1]; N]) -> Self;
    fn from_collumn_ref(collumn: &[[T; 1]; N]) -> &Self;
    fn from_collumn_mut(collumn: &mut [[T; 1]; N]) -> &mut Self;
    fn from_collumn_pin_ref(collumn: Pin<&[[T; 1]; N]>) -> Pin<&Self>;
    fn from_collumn_pin_mut(collumn: Pin<&mut [[T; 1]; N]>) -> Pin<&mut Self>;

    fn into_collumn(self) -> [[T; 1]; N];
    fn as_collumn(&self) -> &[[T; 1]; N];
    fn as_collumn_mut(&mut self) -> &mut [[T; 1]; N];
    fn as_collumn_pin(self: Pin<&Self>) -> Pin<&[[T; 1]; N]>;
    fn as_collumn_pin_mut(self: Pin<&mut Self>) -> Pin<&mut [[T; 1]; N]>;
}

impl<T, const N: usize> const ArrayFromCollumn<T, N> for [T; N]
{
    fn from_collumn(collumn: [[T; 1]; N]) -> Self
    {
        unsafe {
            private::transmute(collumn)
        }
    }
    fn from_collumn_ref(collumn: &[[T; 1]; N]) -> &Self
    {
        unsafe {
            collumn.as_ptr().cast::<Self>().as_ref_unchecked()
        }
    }
    fn from_collumn_mut(collumn: &mut [[T; 1]; N]) -> &mut Self
    {
        unsafe {
            collumn.as_mut_ptr().cast::<Self>().as_mut_unchecked()
        }
    }
    fn from_collumn_pin_ref(collumn: Pin<&[[T; 1]; N]>) -> Pin<&Self>
    {
        unsafe {
            Pin::new_unchecked(Self::from_collumn_ref(collumn.get_ref()))
        }
    }
    fn from_collumn_pin_mut(collumn: Pin<&mut [[T; 1]; N]>) -> Pin<&mut Self>
    {
        unsafe {
            Pin::new_unchecked(Self::from_collumn_mut(collumn.get_unchecked_mut()))
        }
    }

    fn into_collumn(self) -> [[T; 1]; N]
    {
        unsafe {
            private::transmute(self)
        }
    }
    fn as_collumn(&self) -> &[[T; 1]; N]
    {
        unsafe {
            self.as_ptr().cast::<[[T; 1]; N]>().as_ref_unchecked()
        }
    }
    fn as_collumn_mut(&mut self) -> &mut [[T; 1]; N]
    {
        unsafe {
            self.as_mut_ptr().cast::<[[T; 1]; N]>().as_mut_unchecked()
        }
    }
    fn as_collumn_pin(self: Pin<&Self>) -> Pin<&[[T; 1]; N]>
    {
        unsafe {
            Pin::new_unchecked(self.get_ref().as_collumn())
        }
    }
    fn as_collumn_pin_mut(self: Pin<&mut Self>) -> Pin<&mut [[T; 1]; N]>
    {
        unsafe {
            Pin::new_unchecked(self.get_unchecked_mut().as_collumn_mut())
        }
    }
}