use crate::matrices::views::{DataLayout, MatrixMut, MatrixRef, NoInteriorMutability};
use crate::matrices::{Column, Matrix, Row};
unsafe impl<T, S> MatrixRef<T> for &S
where
S: MatrixRef<T>,
{
fn try_get_reference(&self, row: Row, column: Column) -> Option<&T> {
MatrixRef::try_get_reference(*self, row, column)
}
fn view_rows(&self) -> Row {
MatrixRef::view_rows(*self)
}
fn view_columns(&self) -> Column {
MatrixRef::view_columns(*self)
}
unsafe fn get_reference_unchecked(&self, row: Row, column: Column) -> &T {
unsafe { MatrixRef::get_reference_unchecked(*self, row, column) }
}
fn data_layout(&self) -> DataLayout {
DataLayout::RowMajor
}
}
unsafe impl<S> NoInteriorMutability for &S where S: NoInteriorMutability {}
unsafe impl<T, S> MatrixRef<T> for &mut S
where
S: MatrixRef<T>,
{
fn try_get_reference(&self, row: Row, column: Column) -> Option<&T> {
MatrixRef::try_get_reference(*self, row, column)
}
fn view_rows(&self) -> Row {
MatrixRef::view_rows(*self)
}
fn view_columns(&self) -> Column {
MatrixRef::view_columns(*self)
}
unsafe fn get_reference_unchecked(&self, row: Row, column: Column) -> &T {
unsafe { MatrixRef::get_reference_unchecked(*self, row, column) }
}
fn data_layout(&self) -> DataLayout {
DataLayout::RowMajor
}
}
unsafe impl<T, S> MatrixMut<T> for &mut S
where
S: MatrixMut<T>,
{
fn try_get_reference_mut(&mut self, row: Row, column: Column) -> Option<&mut T> {
MatrixMut::try_get_reference_mut(*self, row, column)
}
unsafe fn get_reference_unchecked_mut(&mut self, row: Row, column: Column) -> &mut T {
unsafe { MatrixMut::get_reference_unchecked_mut(*self, row, column) }
}
}
unsafe impl<S> NoInteriorMutability for &mut S {}
unsafe impl<T> MatrixRef<T> for Matrix<T> {
fn try_get_reference(&self, row: Row, column: Column) -> Option<&T> {
Matrix::_try_get_reference(self, row, column)
}
fn view_rows(&self) -> Row {
Matrix::rows(self)
}
fn view_columns(&self) -> Column {
Matrix::columns(self)
}
unsafe fn get_reference_unchecked(&self, row: Row, column: Column) -> &T {
unsafe { Matrix::_get_reference_unchecked(self, row, column) }
}
fn data_layout(&self) -> DataLayout {
DataLayout::RowMajor
}
}
unsafe impl<T> MatrixMut<T> for Matrix<T> {
fn try_get_reference_mut(&mut self, row: Row, column: Column) -> Option<&mut T> {
Matrix::_try_get_reference_mut(self, row, column)
}
unsafe fn get_reference_unchecked_mut(&mut self, row: Row, column: Column) -> &mut T {
unsafe { Matrix::_get_reference_unchecked_mut(self, row, column) }
}
}
unsafe impl<T> NoInteriorMutability for Matrix<T> {}
unsafe impl<T, S> MatrixRef<T> for Box<S>
where
S: MatrixRef<T>,
{
fn try_get_reference(&self, row: Row, column: Column) -> Option<&T> {
self.as_ref().try_get_reference(row, column)
}
fn view_rows(&self) -> Row {
self.as_ref().view_rows()
}
fn view_columns(&self) -> Column {
self.as_ref().view_columns()
}
unsafe fn get_reference_unchecked(&self, row: Row, column: Column) -> &T {
unsafe { self.as_ref().get_reference_unchecked(row, column) }
}
fn data_layout(&self) -> DataLayout {
self.as_ref().data_layout()
}
}
unsafe impl<T, S> MatrixMut<T> for Box<S>
where
S: MatrixMut<T>,
{
fn try_get_reference_mut(&mut self, row: Row, column: Column) -> Option<&mut T> {
self.as_mut().try_get_reference_mut(row, column)
}
unsafe fn get_reference_unchecked_mut(&mut self, row: Row, column: Column) -> &mut T {
unsafe { self.as_mut().get_reference_unchecked_mut(row, column) }
}
}
unsafe impl<S> NoInteriorMutability for Box<S> where S: NoInteriorMutability {}
unsafe impl<T> MatrixRef<T> for Box<dyn MatrixRef<T>> {
fn try_get_reference(&self, row: Row, column: Column) -> Option<&T> {
self.as_ref().try_get_reference(row, column)
}
fn view_rows(&self) -> Row {
self.as_ref().view_rows()
}
fn view_columns(&self) -> Column {
self.as_ref().view_columns()
}
unsafe fn get_reference_unchecked(&self, row: Row, column: Column) -> &T {
unsafe { self.as_ref().get_reference_unchecked(row, column) }
}
fn data_layout(&self) -> DataLayout {
self.as_ref().data_layout()
}
}
unsafe impl<T> MatrixRef<T> for Box<dyn MatrixMut<T>> {
fn try_get_reference(&self, row: Row, column: Column) -> Option<&T> {
self.as_ref().try_get_reference(row, column)
}
fn view_rows(&self) -> Row {
self.as_ref().view_rows()
}
fn view_columns(&self) -> Column {
self.as_ref().view_columns()
}
unsafe fn get_reference_unchecked(&self, row: Row, column: Column) -> &T {
unsafe { self.as_ref().get_reference_unchecked(row, column) }
}
fn data_layout(&self) -> DataLayout {
self.as_ref().data_layout()
}
}
unsafe impl<T> MatrixMut<T> for Box<dyn MatrixMut<T>> {
fn try_get_reference_mut(&mut self, row: Row, column: Column) -> Option<&mut T> {
self.as_mut().try_get_reference_mut(row, column)
}
unsafe fn get_reference_unchecked_mut(&mut self, row: Row, column: Column) -> &mut T {
unsafe { self.as_mut().get_reference_unchecked_mut(row, column) }
}
}
unsafe impl NoInteriorMutability for Box<dyn NoInteriorMutability> {}
unsafe impl<T> NoInteriorMutability for Box<dyn MatrixRef<T>> {}
unsafe impl<T> NoInteriorMutability for Box<dyn MatrixMut<T>> {}