use crate::geometry::Geometry;
use crate::lattice::PaddedTileLattice;
impl<T: Clone + Default> PaddedTileLattice<T> {
pub fn transpose(&self) -> PaddedTileLattice<T> {
let mut out = PaddedTileLattice::zeroed(self.cols(), self.rows(), *self.geometry())
.expect("transposed geometry is valid because the source geometry is");
for row in 0..self.rows() {
for col in 0..self.cols() {
let value = self.get(row, col).unwrap().clone();
out.set(col, row, value)
.expect("transposed coordinate is in bounds");
}
}
out
}
pub fn relayout(&self, geom: Geometry) -> crate::error::Result<PaddedTileLattice<T>> {
let mut out = PaddedTileLattice::zeroed(self.rows(), self.cols(), geom)?;
for row in 0..self.rows() {
for col in 0..self.cols() {
let value = self.get(row, col).unwrap().clone();
out.set(row, col, value)?;
}
}
Ok(out)
}
pub fn is_transpose_involutive(&self) -> bool
where
T: PartialEq,
{
self.transpose().transpose().to_dense() == self.to_dense()
}
}