#[allow(unused)] use crate::matrices::Matrix;
use crate::matrices::views::{DataLayout, MatrixMut, MatrixRef, MatrixView, NoInteriorMutability};
use crate::matrices::{Column, Row};
#[derive(Debug)]
pub struct MatrixPart<'source, T> {
data: Vec<&'source mut [T]>,
rows: Row,
columns: Column,
}
impl<'a, T> MatrixPart<'a, T> {
pub(crate) fn new(data: Vec<&'a mut [T]>, rows: Row, columns: Column) -> MatrixPart<'a, T> {
MatrixPart {
data,
rows,
columns,
}
}
}
unsafe impl<'a, T> MatrixRef<T> for MatrixPart<'a, T> {
fn try_get_reference(&self, row: Row, column: Column) -> Option<&T> {
if row >= self.rows || column >= self.columns {
return None;
}
Some(&self.data[row][column])
}
fn view_rows(&self) -> Row {
self.rows
}
fn view_columns(&self) -> Column {
self.columns
}
unsafe fn get_reference_unchecked(&self, row: Row, column: Column) -> &T {
unsafe { self.data.get_unchecked(row).get_unchecked(column) }
}
fn data_layout(&self) -> DataLayout {
DataLayout::RowMajor
}
}
unsafe impl<'a, T> MatrixMut<T> for MatrixPart<'a, T> {
fn try_get_reference_mut(&mut self, row: Row, column: Column) -> Option<&mut T> {
if row >= self.rows || column >= self.columns {
return None;
}
Some(&mut self.data[row][column])
}
unsafe fn get_reference_unchecked_mut(&mut self, row: Row, column: Column) -> &mut T {
unsafe { self.data.get_unchecked_mut(row).get_unchecked_mut(column) }
}
}
unsafe impl<'a, T> NoInteriorMutability for MatrixPart<'a, T> {}
#[derive(Debug)]
pub struct MatrixQuadrants<'source, T> {
pub top_left: MatrixView<T, MatrixPart<'source, T>>,
pub top_right: MatrixView<T, MatrixPart<'source, T>>,
pub bottom_left: MatrixView<T, MatrixPart<'source, T>>,
pub bottom_right: MatrixView<T, MatrixPart<'source, T>>,
}
impl<'a, T> std::fmt::Display for MatrixQuadrants<'a, T>
where
T: std::fmt::Display,
{
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(
f,
"Top Left:\n{}\nTop Right:\n{}\nBottom Left:\n{}\nBottom Right:\n{}\n",
self.top_left, self.top_right, self.bottom_left, self.bottom_right
)
}
}