use crate::*;
impl<T: Default + Copy, const ROWS: usize, const COLUMNS: usize> MatrixSxS<T, ROWS, COLUMNS>
where
[(); ROWS * COLUMNS]:,
[(); COLUMNS * ROWS]:,
{
pub fn transpose(&self) -> MatrixSxS<T, COLUMNS, ROWS> {
let mut data = [Default::default(); COLUMNS * ROWS];
for i in 0..ROWS {
for j in 0..COLUMNS {
data[j * ROWS + i] = self.data[i * COLUMNS + j].clone();
}
}
MatrixSxS { data }
}
}
impl<T, const ROWS: usize, const COLUMNS: usize> MatrixSxS<T, ROWS, COLUMNS>
where
[(); ROWS * COLUMNS]:,
{
pub fn transpose_ref<'a>(&'a self) -> TransposeSxS<'a, T, ROWS, COLUMNS> {
TransposeSxS(&self)
}
}
#[derive(Debug)]
pub struct TransposeSxS<'a, T, const ROWS: usize, const COLUMNS: usize>(
&'a MatrixSxS<T, ROWS, COLUMNS>,
)
where
[(); ROWS * COLUMNS]:;
impl<'a, T, const ROWS: usize, const COLUMNS: usize> TransposeSxS<'a, T, ROWS, COLUMNS>
where
[(); ROWS * COLUMNS]:,
{
pub fn iter(&'a self) -> impl Iterator<Item = &'a T> {
(0..COLUMNS)
.map(move |j| (0..ROWS).map(move |i| &self.0.data[i * COLUMNS + j]))
.flatten()
}
}
impl<T: Default + Clone, const ROWS: usize> MatrixSxD<T, ROWS> {
pub fn transpose(&self) -> MatrixDxS<T, ROWS> {
let mut data = vec![Default::default(); ROWS * self.columns];
for i in 0..ROWS {
for j in 0..self.columns {
data[j * ROWS + i] = self.data[i * self.columns + j].clone();
}
}
MatrixDxS {
data,
rows: self.columns,
}
}
}
impl<T, const ROWS: usize> MatrixSxD<T, ROWS> {
pub fn transpose_ref<'a>(&'a self) -> TransposeSxD<'a, T, ROWS> {
TransposeSxD(&self)
}
}
#[derive(Debug)]
pub struct TransposeSxD<'a, T, const ROWS: usize>(&'a MatrixSxD<T, ROWS>);
impl<'a, T, const ROWS: usize> TransposeSxD<'a, T, ROWS> {
pub fn iter(&'a self) -> impl Iterator<Item = &'a T> {
(0..self.0.columns)
.map(move |j| (0..ROWS).map(move |i| &self.0.data[i * self.0.columns + j]))
.flatten()
}
pub fn rows(&self) -> usize {
self.0.columns
}
}
impl<T: Default + Clone, const COLUMNS: usize> MatrixDxS<T, COLUMNS> {
pub fn transpose(&self) -> MatrixSxD<T, COLUMNS> {
let mut data = vec![Default::default(); self.rows * COLUMNS];
for i in 0..self.rows {
for j in 0..COLUMNS {
data[j * self.rows + i] = self.data[i * COLUMNS + j].clone();
}
}
MatrixSxD {
data,
columns: self.rows,
}
}
}
impl<T, const COLUMNS: usize> MatrixDxS<T, COLUMNS> {
pub fn transpose_ref<'a>(&'a self) -> TransposeDxS<'a, T, COLUMNS> {
TransposeDxS(&self)
}
}
#[derive(Debug)]
pub struct TransposeDxS<'a, T, const COLUMNS: usize>(&'a MatrixDxS<T, COLUMNS>);
impl<'a, T, const COLUMNS: usize> TransposeDxS<'a, T, COLUMNS> {
pub fn iter(&'a self) -> impl Iterator<Item = &'a T> {
(0..COLUMNS)
.map(move |j| (0..self.0.rows).map(move |i| &self.0.data[i * COLUMNS + j]))
.flatten()
}
pub fn columns(&self) -> usize {
self.0.rows
}
}
impl<T: Default + Clone> MatrixDxD<T> {
pub fn transpose(&self) -> MatrixDxD<T> {
let mut data = vec![Default::default(); self.rows * self.columns];
for i in 0..self.rows {
for j in 0..self.columns {
data[j * self.rows + i] = self.data[i * self.columns + j].clone();
}
}
MatrixDxD {
data,
rows: self.columns,
columns: self.rows,
}
}
}
impl<T> MatrixDxD<T> {
pub fn transpose_ref<'a>(&'a self) -> TransposeDxD<'a, T> {
TransposeDxD(&self)
}
}
#[derive(Debug)]
pub struct TransposeDxD<'a, T>(&'a MatrixDxD<T>);
impl<'a, T> TransposeDxD<'a, T> {
pub fn iter(&'a self) -> impl Iterator<Item = &'a T> {
(0..self.0.columns)
.map(move |j| (0..self.0.rows).map(move |i| &self.0.data[i * self.0.columns + j]))
.flatten()
}
pub fn rows(&self) -> usize {
self.0.columns
}
pub fn columns(&self) -> usize {
self.0.rows
}
}