use std::iter::{ExactSizeIterator, FusedIterator};
use std::marker::PhantomData;
use std::ops::Range;
use crate::matrices::views::{MatrixMut, MatrixRef, NoInteriorMutability};
use crate::matrices::{Column, Matrix, Row};
trait MatrixRefExtension<T>: MatrixRef<T> {
fn index_is_valid(&self, row: Row, column: Column) -> bool {
row < self.view_rows() && column < self.view_columns()
}
}
impl<R, T> MatrixRefExtension<T> for R where R: MatrixRef<T> {}
#[derive(Debug)]
pub struct WithIndex<I> {
iterator: I,
}
impl<I> WithIndex<I> {
pub fn source(self) -> I {
self.iterator
}
}
#[derive(Debug)]
pub struct ColumnIterator<'a, T: Clone, S: MatrixRef<T> = Matrix<T>> {
matrix: &'a S,
column: Column,
range: Range<Row>,
_type: PhantomData<&'a T>,
}
impl<'a, T: Clone> ColumnIterator<'a, T> {
#[track_caller]
pub fn new(matrix: &Matrix<T>, column: Column) -> ColumnIterator<T> {
ColumnIterator::from(matrix, column)
}
}
impl<'a, T: Clone, S: MatrixRef<T>> ColumnIterator<'a, T, S> {
#[track_caller]
pub fn from(source: &S, column: Column) -> ColumnIterator<T, S> {
assert!(
source.index_is_valid(0, column),
"Expected ({},{}) to be in range",
0,
column
);
ColumnIterator {
matrix: source,
column,
range: 0..source.view_rows(),
_type: PhantomData,
}
}
}
impl<'a, T: Clone, S: MatrixRef<T>> Iterator for ColumnIterator<'a, T, S> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
match self.range.next() {
None => None,
Some(row) => unsafe {
Some(
self.matrix
.get_reference_unchecked(row, self.column)
.clone(),
)
},
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.range.size_hint()
}
}
impl<'a, T: Clone, S: MatrixRef<T>> FusedIterator for ColumnIterator<'a, T, S> {}
impl<'a, T: Clone, S: MatrixRef<T>> ExactSizeIterator for ColumnIterator<'a, T, S> {}
#[derive(Debug)]
pub struct RowIterator<'a, T: Clone, S: MatrixRef<T> = Matrix<T>> {
matrix: &'a S,
row: Row,
range: Range<Column>,
_type: PhantomData<&'a T>,
}
impl<'a, T: Clone> RowIterator<'a, T> {
#[track_caller]
pub fn new(matrix: &Matrix<T>, row: Row) -> RowIterator<T> {
RowIterator::from(matrix, row)
}
}
impl<'a, T: Clone, S: MatrixRef<T>> RowIterator<'a, T, S> {
#[track_caller]
pub fn from(source: &S, row: Row) -> RowIterator<T, S> {
assert!(
source.index_is_valid(row, 0),
"Expected ({},{}) to be in range",
row,
0
);
RowIterator {
matrix: source,
row,
range: 0..source.view_columns(),
_type: PhantomData,
}
}
}
impl<'a, T: Clone, S: MatrixRef<T>> Iterator for RowIterator<'a, T, S> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
match self.range.next() {
None => None,
Some(column) => unsafe {
Some(
self.matrix
.get_reference_unchecked(self.row, column)
.clone(),
)
},
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.range.size_hint()
}
}
impl<'a, T: Clone, S: MatrixRef<T>> FusedIterator for RowIterator<'a, T, S> {}
impl<'a, T: Clone, S: MatrixRef<T>> ExactSizeIterator for RowIterator<'a, T, S> {}
fn column_major_iter(
finished: &mut bool,
rows: Row,
columns: Column,
row_counter: &mut Row,
column_counter: &mut Column,
) -> Option<(Row, Column)> {
if *finished {
return None;
}
let value = Some((*row_counter, *column_counter));
if *row_counter == rows - 1 && *column_counter == columns - 1 {
*finished = true;
}
if *row_counter == rows - 1 {
*row_counter = 0;
*column_counter += 1;
} else {
*row_counter += 1;
}
value
}
fn column_major_size_hint(
rows: Row,
columns: Column,
row_counter: Row,
column_counter: Column,
) -> (usize, Option<usize>) {
let remaining_columns = columns - column_counter;
match remaining_columns {
0 => (0, Some(0)),
1 => {
let remaining_rows = rows - row_counter;
(remaining_rows, Some(remaining_rows))
}
x => {
let remaining_rows = rows - row_counter;
let remaining_full_columns = (x - 1) * rows;
let remaining = remaining_rows + remaining_full_columns;
(remaining, Some(remaining))
}
}
}
#[derive(Debug)]
pub struct ColumnMajorIterator<'a, T: Clone, S: MatrixRef<T> = Matrix<T>> {
matrix: &'a S,
column_counter: Column,
columns: Column,
row_counter: Row,
rows: Row,
finished: bool,
_type: PhantomData<&'a T>,
}
impl<'a, T: Clone> ColumnMajorIterator<'a, T> {
pub fn new(matrix: &Matrix<T>) -> ColumnMajorIterator<T> {
ColumnMajorIterator::from(matrix)
}
}
impl<'a, T: Clone, S: MatrixRef<T>> ColumnMajorIterator<'a, T, S> {
pub fn from(source: &S) -> ColumnMajorIterator<T, S> {
ColumnMajorIterator {
matrix: source,
column_counter: 0,
columns: source.view_columns(),
row_counter: 0,
rows: source.view_rows(),
finished: !source.index_is_valid(0, 0),
_type: PhantomData,
}
}
pub fn with_index(self) -> WithIndex<Self> {
WithIndex { iterator: self }
}
}
impl<'a, T: Clone, S: MatrixRef<T>> Iterator for ColumnMajorIterator<'a, T, S> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
column_major_iter(
&mut self.finished,
self.rows,
self.columns,
&mut self.row_counter,
&mut self.column_counter,
)
.map(|(row, column)| unsafe {
self.matrix.get_reference_unchecked(row, column).clone()
})
}
fn size_hint(&self) -> (usize, Option<usize>) {
column_major_size_hint(
self.rows,
self.columns,
self.row_counter,
self.column_counter,
)
}
}
impl<'a, T: Clone, S: MatrixRef<T>> FusedIterator for ColumnMajorIterator<'a, T, S> {}
impl<'a, T: Clone, S: MatrixRef<T>> ExactSizeIterator for ColumnMajorIterator<'a, T, S> {}
impl<'a, T: Clone, S: MatrixRef<T>> Iterator for WithIndex<ColumnMajorIterator<'a, T, S>> {
type Item = ((Row, Column), T);
fn next(&mut self) -> Option<Self::Item> {
let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
self.iterator.next().map(|x| ((row, column), x))
}
}
impl<'a, T: Clone, S: MatrixRef<T>> FusedIterator for WithIndex<ColumnMajorIterator<'a, T, S>> {}
impl<'a, T: Clone, S: MatrixRef<T>> ExactSizeIterator for WithIndex<ColumnMajorIterator<'a, T, S>> {}
fn row_major_iter(
finished: &mut bool,
rows: Row,
columns: Column,
row_counter: &mut Row,
column_counter: &mut Column,
) -> Option<(Row, Column)> {
if *finished {
return None;
}
let value = Some((*row_counter, *column_counter));
if *column_counter == columns - 1 && *row_counter == rows - 1 {
*finished = true;
}
if *column_counter == columns - 1 {
*column_counter = 0;
*row_counter += 1;
} else {
*column_counter += 1;
}
value
}
fn row_major_size_hint(
rows: Row,
columns: Column,
row_counter: Row,
column_counter: Column,
) -> (usize, Option<usize>) {
let remaining_rows = rows - row_counter;
match remaining_rows {
0 => (0, Some(0)),
1 => {
let remaining_columns = columns - column_counter;
(remaining_columns, Some(remaining_columns))
}
x => {
let remaining_columns = columns - column_counter;
let remaining_full_rows = (x - 1) * columns;
let remaining = remaining_columns + remaining_full_rows;
(remaining, Some(remaining))
}
}
}
#[derive(Debug)]
pub struct RowMajorIterator<'a, T: Clone, S: MatrixRef<T> = Matrix<T>> {
matrix: &'a S,
column_counter: Column,
columns: Column,
row_counter: Row,
rows: Row,
finished: bool,
_type: PhantomData<&'a T>,
}
impl<'a, T: Clone> RowMajorIterator<'a, T> {
pub fn new(matrix: &Matrix<T>) -> RowMajorIterator<T> {
RowMajorIterator::from(matrix)
}
}
impl<'a, T: Clone, S: MatrixRef<T>> RowMajorIterator<'a, T, S> {
pub fn from(source: &S) -> RowMajorIterator<T, S> {
RowMajorIterator {
matrix: source,
column_counter: 0,
columns: source.view_columns(),
row_counter: 0,
rows: source.view_rows(),
finished: !source.index_is_valid(0, 0),
_type: PhantomData,
}
}
pub fn with_index(self) -> WithIndex<Self> {
WithIndex { iterator: self }
}
}
impl<'a, T: Clone, S: MatrixRef<T>> Iterator for RowMajorIterator<'a, T, S> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
row_major_iter(
&mut self.finished,
self.rows,
self.columns,
&mut self.row_counter,
&mut self.column_counter,
)
.map(|(row, column)| unsafe {
self.matrix.get_reference_unchecked(row, column).clone()
})
}
fn size_hint(&self) -> (usize, Option<usize>) {
row_major_size_hint(
self.rows,
self.columns,
self.row_counter,
self.column_counter,
)
}
}
impl<'a, T: Clone, S: MatrixRef<T>> FusedIterator for RowMajorIterator<'a, T, S> {}
impl<'a, T: Clone, S: MatrixRef<T>> ExactSizeIterator for RowMajorIterator<'a, T, S> {}
impl<'a, T: Clone, S: MatrixRef<T>> Iterator for WithIndex<RowMajorIterator<'a, T, S>> {
type Item = ((Row, Column), T);
fn next(&mut self) -> Option<Self::Item> {
let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
self.iterator.next().map(|x| ((row, column), x))
}
}
impl<'a, T: Clone, S: MatrixRef<T>> FusedIterator for WithIndex<RowMajorIterator<'a, T, S>> {}
impl<'a, T: Clone, S: MatrixRef<T>> ExactSizeIterator for WithIndex<RowMajorIterator<'a, T, S>> {}
#[derive(Debug)]
pub struct ColumnReferenceIterator<'a, T, S: MatrixRef<T> = Matrix<T>> {
matrix: &'a S,
column: Column,
range: Range<Row>,
_type: PhantomData<&'a T>,
}
impl<'a, T> ColumnReferenceIterator<'a, T> {
#[track_caller]
pub fn new(matrix: &Matrix<T>, column: Column) -> ColumnReferenceIterator<T> {
ColumnReferenceIterator::from(matrix, column)
}
}
impl<'a, T, S: MatrixRef<T>> ColumnReferenceIterator<'a, T, S> {
#[track_caller]
pub fn from(source: &S, column: Column) -> ColumnReferenceIterator<T, S> {
assert!(
source.index_is_valid(0, column),
"Expected ({},{}) to be in range",
0,
column
);
ColumnReferenceIterator {
matrix: source,
column,
range: 0..source.view_rows(),
_type: PhantomData,
}
}
}
impl<'a, T, S: MatrixRef<T>> Iterator for ColumnReferenceIterator<'a, T, S> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
match self.range.next() {
None => None,
Some(row) => unsafe {
Some(self.matrix.get_reference_unchecked(row, self.column))
},
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.range.size_hint()
}
}
impl<'a, T, S: MatrixRef<T>> FusedIterator for ColumnReferenceIterator<'a, T, S> {}
impl<'a, T, S: MatrixRef<T>> ExactSizeIterator for ColumnReferenceIterator<'a, T, S> {}
#[derive(Debug)]
pub struct RowReferenceIterator<'a, T, S: MatrixRef<T> = Matrix<T>> {
matrix: &'a S,
row: Row,
range: Range<Column>,
_type: PhantomData<&'a T>,
}
impl<'a, T> RowReferenceIterator<'a, T> {
#[track_caller]
pub fn new(matrix: &Matrix<T>, row: Row) -> RowReferenceIterator<T> {
RowReferenceIterator::from(matrix, row)
}
}
impl<'a, T, S: MatrixRef<T>> RowReferenceIterator<'a, T, S> {
#[track_caller]
pub fn from(source: &S, row: Row) -> RowReferenceIterator<T, S> {
assert!(
source.index_is_valid(row, 0),
"Expected ({},{}) to be in range",
row,
0
);
RowReferenceIterator {
matrix: source,
row,
range: 0..source.view_columns(),
_type: PhantomData,
}
}
}
impl<'a, T, S: MatrixRef<T>> Iterator for RowReferenceIterator<'a, T, S> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
match self.range.next() {
None => None,
Some(column) => unsafe {
Some(self.matrix.get_reference_unchecked(self.row, column))
},
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.range.size_hint()
}
}
impl<'a, T, S: MatrixRef<T>> FusedIterator for RowReferenceIterator<'a, T, S> {}
impl<'a, T, S: MatrixRef<T>> ExactSizeIterator for RowReferenceIterator<'a, T, S> {}
#[derive(Debug)]
pub struct ColumnMajorReferenceIterator<'a, T, S: MatrixRef<T> = Matrix<T>> {
matrix: &'a S,
column_counter: Column,
columns: Column,
row_counter: Row,
rows: Row,
finished: bool,
_type: PhantomData<&'a T>,
}
impl<'a, T> ColumnMajorReferenceIterator<'a, T> {
pub fn new(matrix: &Matrix<T>) -> ColumnMajorReferenceIterator<T> {
ColumnMajorReferenceIterator::from(matrix)
}
}
impl<'a, T, S: MatrixRef<T>> ColumnMajorReferenceIterator<'a, T, S> {
pub fn from(source: &S) -> ColumnMajorReferenceIterator<T, S> {
ColumnMajorReferenceIterator {
matrix: source,
column_counter: 0,
columns: source.view_columns(),
row_counter: 0,
rows: source.view_rows(),
finished: !source.index_is_valid(0, 0),
_type: PhantomData,
}
}
pub fn with_index(self) -> WithIndex<Self> {
WithIndex { iterator: self }
}
}
impl<'a, T, S: MatrixRef<T>> Iterator for ColumnMajorReferenceIterator<'a, T, S> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
column_major_iter(
&mut self.finished,
self.rows,
self.columns,
&mut self.row_counter,
&mut self.column_counter,
)
.map(|(row, column)| unsafe {
self.matrix.get_reference_unchecked(row, column)
})
}
fn size_hint(&self) -> (usize, Option<usize>) {
column_major_size_hint(
self.rows,
self.columns,
self.row_counter,
self.column_counter,
)
}
}
impl<'a, T, S: MatrixRef<T>> FusedIterator for ColumnMajorReferenceIterator<'a, T, S> {}
impl<'a, T, S: MatrixRef<T>> ExactSizeIterator for ColumnMajorReferenceIterator<'a, T, S> {}
impl<'a, T, S: MatrixRef<T>> Iterator for WithIndex<ColumnMajorReferenceIterator<'a, T, S>> {
type Item = ((Row, Column), &'a T);
fn next(&mut self) -> Option<Self::Item> {
let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
self.iterator.next().map(|x| ((row, column), x))
}
}
impl<'a, T, S: MatrixRef<T>> FusedIterator for WithIndex<ColumnMajorReferenceIterator<'a, T, S>> {}
#[rustfmt::skip]
impl<'a, T, S: MatrixRef<T>> ExactSizeIterator for WithIndex<ColumnMajorReferenceIterator<'a, T, S>> {}
#[derive(Debug)]
pub struct RowMajorReferenceIterator<'a, T, S: MatrixRef<T> = Matrix<T>> {
matrix: &'a S,
column_counter: Column,
columns: Column,
row_counter: Row,
rows: Row,
finished: bool,
_type: PhantomData<&'a T>,
}
impl<'a, T> RowMajorReferenceIterator<'a, T> {
pub fn new(matrix: &Matrix<T>) -> RowMajorReferenceIterator<T> {
RowMajorReferenceIterator::from(matrix)
}
}
impl<'a, T, S: MatrixRef<T>> RowMajorReferenceIterator<'a, T, S> {
pub fn from(source: &S) -> RowMajorReferenceIterator<T, S> {
RowMajorReferenceIterator {
matrix: source,
column_counter: 0,
columns: source.view_columns(),
row_counter: 0,
rows: source.view_rows(),
finished: !source.index_is_valid(0, 0),
_type: PhantomData,
}
}
pub fn with_index(self) -> WithIndex<Self> {
WithIndex { iterator: self }
}
}
impl<'a, T, S: MatrixRef<T>> Iterator for RowMajorReferenceIterator<'a, T, S> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
row_major_iter(
&mut self.finished,
self.rows,
self.columns,
&mut self.row_counter,
&mut self.column_counter,
)
.map(|(row, column)| unsafe {
self.matrix.get_reference_unchecked(row, column)
})
}
fn size_hint(&self) -> (usize, Option<usize>) {
row_major_size_hint(
self.rows,
self.columns,
self.row_counter,
self.column_counter,
)
}
}
impl<'a, T, S: MatrixRef<T>> FusedIterator for RowMajorReferenceIterator<'a, T, S> {}
impl<'a, T, S: MatrixRef<T>> ExactSizeIterator for RowMajorReferenceIterator<'a, T, S> {}
impl<'a, T, S: MatrixRef<T>> Iterator for WithIndex<RowMajorReferenceIterator<'a, T, S>> {
type Item = ((Row, Column), &'a T);
fn next(&mut self) -> Option<Self::Item> {
let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
self.iterator.next().map(|x| ((row, column), x))
}
}
impl<'a, T, S: MatrixRef<T>> FusedIterator for WithIndex<RowMajorReferenceIterator<'a, T, S>> {}
impl<'a, T, S: MatrixRef<T>> ExactSizeIterator for WithIndex<RowMajorReferenceIterator<'a, T, S>> {}
#[derive(Debug)]
pub struct DiagonalIterator<'a, T: Clone, S: MatrixRef<T> = Matrix<T>> {
matrix: &'a S,
range: Range<usize>,
_type: PhantomData<&'a T>,
}
impl<'a, T: Clone> DiagonalIterator<'a, T> {
pub fn new(matrix: &Matrix<T>) -> DiagonalIterator<T> {
DiagonalIterator::from(matrix)
}
}
impl<'a, T: Clone, S: MatrixRef<T>> DiagonalIterator<'a, T, S> {
pub fn from(source: &S) -> DiagonalIterator<T, S> {
DiagonalIterator {
matrix: source,
range: 0..std::cmp::min(source.view_rows(), source.view_columns()),
_type: PhantomData,
}
}
}
impl<'a, T: Clone, S: MatrixRef<T>> Iterator for DiagonalIterator<'a, T, S> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
match self.range.next() {
None => None,
Some(i) => unsafe {
Some(self.matrix.get_reference_unchecked(i, i).clone())
},
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.range.size_hint()
}
}
impl<'a, T: Clone, S: MatrixRef<T>> FusedIterator for DiagonalIterator<'a, T, S> {}
impl<'a, T: Clone, S: MatrixRef<T>> ExactSizeIterator for DiagonalIterator<'a, T, S> {}
#[derive(Debug)]
pub struct DiagonalReferenceIterator<'a, T, S: MatrixRef<T> = Matrix<T>> {
matrix: &'a S,
range: Range<usize>,
_type: PhantomData<&'a T>,
}
impl<'a, T> DiagonalReferenceIterator<'a, T> {
pub fn new(matrix: &Matrix<T>) -> DiagonalReferenceIterator<T> {
DiagonalReferenceIterator::from(matrix)
}
}
impl<'a, T, S: MatrixRef<T>> DiagonalReferenceIterator<'a, T, S> {
pub fn from(source: &S) -> DiagonalReferenceIterator<T, S> {
DiagonalReferenceIterator {
matrix: source,
range: 0..std::cmp::min(source.view_rows(), source.view_columns()),
_type: PhantomData,
}
}
}
impl<'a, T, S: MatrixRef<T>> Iterator for DiagonalReferenceIterator<'a, T, S> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
match self.range.next() {
None => None,
Some(i) => unsafe {
Some(self.matrix.get_reference_unchecked(i, i))
},
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.range.size_hint()
}
}
impl<'a, T, S: MatrixRef<T>> FusedIterator for DiagonalReferenceIterator<'a, T, S> {}
impl<'a, T, S: MatrixRef<T>> ExactSizeIterator for DiagonalReferenceIterator<'a, T, S> {}
#[derive(Debug)]
#[rustfmt::skip]
pub struct ColumnMajorReferenceMutIterator<'a, T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
matrix: &'a mut S,
column_counter: Column,
columns: Column,
row_counter: Row,
rows: Row,
finished: bool,
_type: PhantomData<&'a mut T>,
}
impl<'a, T> ColumnMajorReferenceMutIterator<'a, T> {
pub fn new(matrix: &mut Matrix<T>) -> ColumnMajorReferenceMutIterator<T> {
ColumnMajorReferenceMutIterator::from(matrix)
}
}
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ColumnMajorReferenceMutIterator<'a, T, S> {
pub fn from(source: &mut S) -> ColumnMajorReferenceMutIterator<T, S> {
ColumnMajorReferenceMutIterator {
column_counter: 0,
columns: source.view_columns(),
row_counter: 0,
rows: source.view_rows(),
finished: !source.index_is_valid(0, 0),
matrix: source,
_type: PhantomData,
}
}
pub fn with_index(self) -> WithIndex<Self> {
WithIndex { iterator: self }
}
}
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
for ColumnMajorReferenceMutIterator<'a, T, S>
{
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
column_major_iter(
&mut self.finished,
self.rows,
self.columns,
&mut self.row_counter,
&mut self.column_counter,
)
.map(|(row, column)| unsafe {
std::mem::transmute(self.matrix.get_reference_unchecked_mut(row, column))
})
}
fn size_hint(&self) -> (usize, Option<usize>) {
column_major_size_hint(
self.rows,
self.columns,
self.row_counter,
self.column_counter,
)
}
}
#[rustfmt::skip]
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for ColumnMajorReferenceMutIterator<'a, T, S> {}
#[rustfmt::skip]
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for ColumnMajorReferenceMutIterator<'a, T, S> {}
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
for WithIndex<ColumnMajorReferenceMutIterator<'a, T, S>>
{
type Item = ((Row, Column), &'a mut T);
fn next(&mut self) -> Option<Self::Item> {
let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
self.iterator.next().map(|x| ((row, column), x))
}
}
#[rustfmt::skip]
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for WithIndex<ColumnMajorReferenceMutIterator<'a, T, S>> {}
#[rustfmt::skip]
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for WithIndex<ColumnMajorReferenceMutIterator<'a, T, S>> {}
#[derive(Debug)]
pub struct RowMajorReferenceMutIterator<'a, T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
matrix: &'a mut S,
column_counter: Column,
columns: Column,
row_counter: Row,
rows: Row,
finished: bool,
_type: PhantomData<&'a mut T>,
}
impl<'a, T> RowMajorReferenceMutIterator<'a, T> {
pub fn new(matrix: &mut Matrix<T>) -> RowMajorReferenceMutIterator<T> {
RowMajorReferenceMutIterator::from(matrix)
}
}
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> RowMajorReferenceMutIterator<'a, T, S> {
pub fn from(source: &mut S) -> RowMajorReferenceMutIterator<T, S> {
RowMajorReferenceMutIterator {
column_counter: 0,
columns: source.view_columns(),
row_counter: 0,
rows: source.view_rows(),
finished: !source.index_is_valid(0, 0),
matrix: source,
_type: PhantomData,
}
}
pub fn with_index(self) -> WithIndex<Self> {
WithIndex { iterator: self }
}
}
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
for RowMajorReferenceMutIterator<'a, T, S>
{
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
row_major_iter(
&mut self.finished,
self.rows,
self.columns,
&mut self.row_counter,
&mut self.column_counter,
)
.map(|(row, column)| unsafe {
std::mem::transmute(self.matrix.get_reference_unchecked_mut(row, column))
})
}
fn size_hint(&self) -> (usize, Option<usize>) {
row_major_size_hint(
self.rows,
self.columns,
self.row_counter,
self.column_counter,
)
}
}
#[rustfmt::skip]
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for RowMajorReferenceMutIterator<'a, T, S> {}
#[rustfmt::skip]
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for RowMajorReferenceMutIterator<'a, T, S> {}
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
for WithIndex<RowMajorReferenceMutIterator<'a, T, S>>
{
type Item = ((Row, Column), &'a mut T);
fn next(&mut self) -> Option<Self::Item> {
let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
self.iterator.next().map(|x| ((row, column), x))
}
}
#[rustfmt::skip]
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for WithIndex<RowMajorReferenceMutIterator<'a, T, S>> {}
#[rustfmt::skip]
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for WithIndex<RowMajorReferenceMutIterator<'a, T, S>> {}
#[derive(Debug)]
pub struct DiagonalReferenceMutIterator<'a, T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
matrix: &'a mut S,
range: Range<usize>,
_type: PhantomData<&'a mut T>,
}
impl<'a, T> DiagonalReferenceMutIterator<'a, T> {
pub fn new(matrix: &mut Matrix<T>) -> DiagonalReferenceMutIterator<T> {
DiagonalReferenceMutIterator::from(matrix)
}
}
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> DiagonalReferenceMutIterator<'a, T, S> {
pub fn from(source: &mut S) -> DiagonalReferenceMutIterator<T, S> {
DiagonalReferenceMutIterator {
range: 0..std::cmp::min(source.view_rows(), source.view_columns()),
matrix: source,
_type: PhantomData,
}
}
}
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
for DiagonalReferenceMutIterator<'a, T, S>
{
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
match self.range.next() {
None => None,
Some(i) => unsafe {
std::mem::transmute(self.matrix.get_reference_unchecked_mut(i, i))
},
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.range.size_hint()
}
}
#[rustfmt::skip]
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for DiagonalReferenceMutIterator<'a, T, S> {}
#[rustfmt::skip]
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for DiagonalReferenceMutIterator<'a, T, S> {}
#[derive(Debug)]
pub struct ColumnReferenceMutIterator<'a, T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
matrix: &'a mut S,
column: Column,
range: Range<Row>,
_type: PhantomData<&'a mut T>,
}
impl<'a, T> ColumnReferenceMutIterator<'a, T> {
#[track_caller]
pub fn new(matrix: &mut Matrix<T>, column: Column) -> ColumnReferenceMutIterator<T> {
ColumnReferenceMutIterator::from(matrix, column)
}
}
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ColumnReferenceMutIterator<'a, T, S> {
#[track_caller]
pub fn from(source: &mut S, column: Column) -> ColumnReferenceMutIterator<T, S> {
assert!(
source.index_is_valid(0, column),
"Expected ({},{}) to be in range",
0,
column
);
ColumnReferenceMutIterator {
range: 0..source.view_rows(),
matrix: source,
column,
_type: PhantomData,
}
}
}
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
for ColumnReferenceMutIterator<'a, T, S>
{
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
match self.range.next() {
None => None,
Some(row) => unsafe {
std::mem::transmute(self.matrix.get_reference_unchecked_mut(row, self.column))
},
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.range.size_hint()
}
}
#[rustfmt::skip]
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for ColumnReferenceMutIterator<'a, T, S> {}
#[rustfmt::skip]
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for ColumnReferenceMutIterator<'a, T, S> {}
#[derive(Debug)]
pub struct RowReferenceMutIterator<'a, T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
matrix: &'a mut S,
row: Row,
range: Range<Column>,
_type: PhantomData<&'a mut T>,
}
impl<'a, T> RowReferenceMutIterator<'a, T> {
#[track_caller]
pub fn new(matrix: &mut Matrix<T>, row: Row) -> RowReferenceMutIterator<T> {
RowReferenceMutIterator::from(matrix, row)
}
}
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> RowReferenceMutIterator<'a, T, S> {
#[track_caller]
pub fn from(source: &mut S, row: Row) -> RowReferenceMutIterator<T, S> {
assert!(
source.index_is_valid(row, 0),
"Expected ({},{}) to be in range",
row,
0
);
RowReferenceMutIterator {
range: 0..source.view_columns(),
matrix: source,
row,
_type: PhantomData,
}
}
}
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator for RowReferenceMutIterator<'a, T, S> {
type Item = &'a mut T;
fn next(&mut self) -> Option<Self::Item> {
match self.range.next() {
None => None,
Some(column) => unsafe {
std::mem::transmute(self.matrix.get_reference_unchecked_mut(self.row, column))
},
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
self.range.size_hint()
}
}
#[rustfmt::skip]
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for RowReferenceMutIterator<'a, T, S> {}
#[rustfmt::skip]
impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for RowReferenceMutIterator<'a, T, S> {}