use std::iter::{ExactSizeIterator, FusedIterator};
use crate::matrices::{Matrix, Row, Column};
pub struct ColumnIterator<'a, T: Clone> {
matrix: &'a Matrix<T>,
column: Column,
counter: usize,
finished: bool,
}
impl <'a, T: Clone> ColumnIterator<'a, T> {
pub fn new(matrix: &Matrix<T>, column: Column) -> ColumnIterator<T> {
ColumnIterator {
matrix,
column,
counter: 0,
finished: false,
}
}
}
impl <'a, T: Clone> Iterator for ColumnIterator<'a, T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
if self.finished {
return None
}
let value = Some(self.matrix.get(self.counter, self.column));
if self.counter == self.matrix.rows() - 1 {
self.finished = true;
}
self.counter += 1;
value
}
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining = self.matrix.rows() - self.counter;
(remaining, Some(remaining))
}
}
impl <'a, T: Clone> FusedIterator for ColumnIterator<'a, T> {}
impl <'a, T: Clone> ExactSizeIterator for ColumnIterator<'a, T> {}
pub struct RowIterator<'a, T: Clone> {
matrix: &'a Matrix<T>,
row: Row,
counter: usize,
finished: bool,
}
impl <'a, T: Clone> RowIterator<'a, T> {
pub fn new(matrix: &Matrix<T>, row: Row) -> RowIterator<T> {
RowIterator {
matrix,
row,
counter: 0,
finished: false,
}
}
}
impl <'a, T: Clone> Iterator for RowIterator<'a, T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
if self.finished {
return None
}
let value = Some(self.matrix.get(self.row, self.counter));
if self.counter == self.matrix.columns() - 1 {
self.finished = true;
}
self.counter += 1;
value
}
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining = self.matrix.columns() - self.counter;
(remaining, Some(remaining))
}
}
impl <'a, T: Clone> FusedIterator for RowIterator<'a, T> {}
impl <'a, T: Clone> ExactSizeIterator for RowIterator<'a, T> {}
pub struct ColumnMajorIterator<'a, T: Clone> {
matrix: &'a Matrix<T>,
column_counter: Column,
row_counter: Row,
finished: bool,
}
impl <'a, T: Clone> ColumnMajorIterator<'a, T> {
pub fn new(matrix: &Matrix<T>) -> ColumnMajorIterator<T> {
ColumnMajorIterator {
matrix,
column_counter: 0,
row_counter: 0,
finished: false,
}
}
}
impl <'a, T: Clone> Iterator for ColumnMajorIterator<'a, T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
if self.finished {
return None
}
let value = Some(self.matrix.get(self.row_counter, self.column_counter));
if self.row_counter == self.matrix.rows() - 1
&& self.column_counter == self.matrix.columns() -1 {
self.finished = true;
}
if self.row_counter == self.matrix.rows() - 1 {
self.row_counter = 0;
self.column_counter += 1;
} else {
self.row_counter += 1;
}
value
}
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining_columns = self.matrix.columns() - self.column_counter;
match remaining_columns {
0 => (0, Some(0)),
1 => {
let remaining_rows = self.matrix.rows() - self.row_counter;
(remaining_rows, Some(remaining_rows))
}
x => {
let remaining_rows = self.matrix.rows() - self.row_counter;
let remaining_full_columns = (x - 1) * self.matrix.rows();
let remaining = remaining_rows + remaining_full_columns;
(remaining, Some(remaining))
}
}
}
}
impl <'a, T: Clone> FusedIterator for ColumnMajorIterator<'a, T> {}
impl <'a, T: Clone> ExactSizeIterator for ColumnMajorIterator<'a, T> {}
pub struct RowMajorIterator<'a, T: Clone> {
matrix: &'a Matrix<T>,
column_counter: Column,
row_counter: Row,
finished: bool,
}
impl <'a, T: Clone> RowMajorIterator<'a, T> {
pub fn new(matrix: &Matrix<T>) -> RowMajorIterator<T> {
RowMajorIterator {
matrix,
column_counter: 0,
row_counter: 0,
finished: false,
}
}
}
impl <'a, T: Clone> Iterator for RowMajorIterator<'a, T> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
if self.finished {
return None
}
let value = Some(self.matrix.get(self.row_counter, self.column_counter));
if self.column_counter == self.matrix.columns() - 1
&& self.row_counter == self.matrix.rows() -1 {
self.finished = true;
}
if self.column_counter == self.matrix.columns() - 1 {
self.column_counter = 0;
self.row_counter += 1;
} else {
self.column_counter += 1;
}
value
}
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining_rows = self.matrix.rows() - self.row_counter;
match remaining_rows {
0 => (0, Some(0)),
1 => {
let remaining_columns = self.matrix.columns() - self.column_counter;
(remaining_columns, Some(remaining_columns))
}
x => {
let remaining_columns = self.matrix.columns() - self.column_counter;
let remaining_full_rows = (x - 1) * self.matrix.columns();
let remaining = remaining_columns + remaining_full_rows;
(remaining, Some(remaining))
}
}
}
}
impl <'a, T: Clone> FusedIterator for RowMajorIterator<'a, T> {}
impl <'a, T: Clone> ExactSizeIterator for RowMajorIterator<'a, T> {}
pub struct ColumnReferenceIterator<'a, T> {
matrix: &'a Matrix<T>,
column: Column,
counter: usize,
finished: bool,
}
impl <'a, T> ColumnReferenceIterator<'a, T> {
pub fn new(matrix: &Matrix<T>, column: Column) -> ColumnReferenceIterator<T> {
ColumnReferenceIterator {
matrix,
column,
counter: 0,
finished: false,
}
}
}
impl <'a, T> Iterator for ColumnReferenceIterator<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
if self.finished {
return None
}
let value = Some(self.matrix.get_reference(self.counter, self.column));
if self.counter == self.matrix.rows() - 1 {
self.finished = true;
}
self.counter += 1;
value
}
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining = self.matrix.rows() - self.counter;
(remaining, Some(remaining))
}
}
impl <'a, T> FusedIterator for ColumnReferenceIterator<'a, T> {}
impl <'a, T> ExactSizeIterator for ColumnReferenceIterator<'a, T> {}
pub struct RowReferenceIterator<'a, T> {
matrix: &'a Matrix<T>,
row: Row,
counter: usize,
finished: bool,
}
impl <'a, T> RowReferenceIterator<'a, T> {
pub fn new(matrix: &Matrix<T>, row: Row) -> RowReferenceIterator<T> {
RowReferenceIterator {
matrix,
row,
counter: 0,
finished: false,
}
}
}
impl <'a, T> Iterator for RowReferenceIterator<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
if self.finished {
return None
}
let value = Some(self.matrix.get_reference(self.row, self.counter));
if self.counter == self.matrix.columns() - 1 {
self.finished = true;
}
self.counter += 1;
value
}
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining = self.matrix.columns() - self.counter;
(remaining, Some(remaining))
}
}
impl <'a, T> FusedIterator for RowReferenceIterator<'a, T> {}
impl <'a, T> ExactSizeIterator for RowReferenceIterator<'a, T> {}
pub struct ColumnMajorReferenceIterator<'a, T> {
matrix: &'a Matrix<T>,
column_counter: Column,
row_counter: Row,
finished: bool,
}
impl <'a, T> ColumnMajorReferenceIterator<'a, T> {
pub fn new(matrix: &Matrix<T>) -> ColumnMajorReferenceIterator<T> {
ColumnMajorReferenceIterator {
matrix,
column_counter: 0,
row_counter: 0,
finished: false,
}
}
}
impl <'a, T> Iterator for ColumnMajorReferenceIterator<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
if self.finished {
return None
}
let value = Some(self.matrix.get_reference(self.row_counter, self.column_counter));
if self.row_counter == self.matrix.rows() - 1
&& self.column_counter == self.matrix.columns() -1 {
self.finished = true;
}
if self.row_counter == self.matrix.rows() - 1 {
self.row_counter = 0;
self.column_counter += 1;
} else {
self.row_counter += 1;
}
value
}
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining_columns = self.matrix.columns() - self.column_counter;
match remaining_columns {
0 => (0, Some(0)),
1 => {
let remaining_rows = self.matrix.rows() - self.row_counter;
(remaining_rows, Some(remaining_rows))
}
x => {
let remaining_rows = self.matrix.rows() - self.row_counter;
let remaining_full_columns = (x - 1) * self.matrix.rows();
let remaining = remaining_rows + remaining_full_columns;
(remaining, Some(remaining))
}
}
}
}
impl <'a, T> FusedIterator for ColumnMajorReferenceIterator<'a, T> {}
impl <'a, T> ExactSizeIterator for ColumnMajorReferenceIterator<'a, T> {}
pub struct RowMajorReferenceIterator<'a, T> {
matrix: &'a Matrix<T>,
column_counter: Column,
row_counter: Row,
finished: bool,
}
impl <'a, T> RowMajorReferenceIterator<'a, T> {
pub fn new(matrix: &Matrix<T>) -> RowMajorReferenceIterator<T> {
RowMajorReferenceIterator {
matrix,
column_counter: 0,
row_counter: 0,
finished: false,
}
}
}
impl <'a, T> Iterator for RowMajorReferenceIterator<'a, T> {
type Item = &'a T;
fn next(&mut self) -> Option<Self::Item> {
if self.finished {
return None
}
let value = Some(self.matrix.get_reference(self.row_counter, self.column_counter));
if self.column_counter == self.matrix.columns() - 1
&& self.row_counter == self.matrix.rows() -1 {
self.finished = true;
}
if self.column_counter == self.matrix.columns() - 1 {
self.column_counter = 0;
self.row_counter += 1;
} else {
self.column_counter += 1;
}
value
}
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining_rows = self.matrix.rows() - self.row_counter;
match remaining_rows {
0 => (0, Some(0)),
1 => {
let remaining_columns = self.matrix.columns() - self.column_counter;
(remaining_columns, Some(remaining_columns))
}
x => {
let remaining_columns = self.matrix.columns() - self.column_counter;
let remaining_full_rows = (x - 1) * self.matrix.columns();
let remaining = remaining_columns + remaining_full_rows;
(remaining, Some(remaining))
}
}
}
}
impl <'a, T> FusedIterator for RowMajorReferenceIterator<'a, T> {}
impl <'a, T> ExactSizeIterator for RowMajorReferenceIterator<'a, T> {}