use_prelude!();
pub trait Transpose {
type Transposed: Transpose<Transposed = Self>;
fn transpose(self) -> Self::Transposed;
fn transpose_ref<'a>(&'a self) -> &'a Self::Transposed
where
&'a Self: Transpose<Transposed = &'a Self::Transposed>,
{
self.transpose()
}
fn transpose_mut<'a>(&'a mut self) -> &'a mut Self::Transposed
where
&'a mut Self: Transpose<Transposed = &'a mut Self::Transposed>,
{
self.transpose()
}
}
impl<T, const N: usize> Transpose for [MaybeUninit<T>; N] {
type Transposed = MaybeUninit<[T; N]>;
fn transpose(self) -> Self::Transposed {
unsafe { core::mem::transmute_copy(&self) }
}
}
impl<T, const N: usize> Transpose for MaybeUninit<[T; N]> {
type Transposed = [MaybeUninit<T>; N];
fn transpose(self) -> Self::Transposed {
unsafe { core::mem::transmute_copy(&self) }
}
}
impl<'a, T: 'a, const N: usize> Transpose for &'a [MaybeUninit<T>; N] {
type Transposed = &'a MaybeUninit<[T; N]>;
fn transpose(self) -> Self::Transposed {
unsafe { &*(self as *const [MaybeUninit<T>; N] as *const MaybeUninit<[T; N]>) }
}
}
impl<'a, T: 'a, const N: usize> Transpose for &'a MaybeUninit<[T; N]> {
type Transposed = &'a [MaybeUninit<T>; N];
fn transpose(self) -> Self::Transposed {
unsafe { &*(self as *const MaybeUninit<[T; N]> as *const [MaybeUninit<T>; N]) }
}
}
impl<'a, T: 'a, const N: usize> Transpose for &'a mut [MaybeUninit<T>; N] {
type Transposed = &'a mut MaybeUninit<[T; N]>;
fn transpose(self) -> Self::Transposed {
unsafe { &mut *(self as *mut [MaybeUninit<T>; N] as *mut MaybeUninit<[T; N]>) }
}
}
impl<'a, T: 'a, const N: usize> Transpose for &'a mut MaybeUninit<[T; N]> {
type Transposed = &'a mut [MaybeUninit<T>; N];
fn transpose(self) -> Self::Transposed {
unsafe { &mut *(self as *mut MaybeUninit<[T; N]> as *mut [MaybeUninit<T>; N]) }
}
}