1use std::iter::{ExactSizeIterator, FusedIterator};
83use std::marker::PhantomData;
84use std::ops::Range;
85
86use crate::matrices::views::{MatrixMut, MatrixRef, NoInteriorMutability};
87use crate::matrices::{Column, Matrix, Row};
88
89trait MatrixRefExtension<T>: MatrixRef<T> {
90 fn index_is_valid(&self, row: Row, column: Column) -> bool {
94 row < self.view_rows() && column < self.view_columns()
95 }
96}
97
98impl<R, T> MatrixRefExtension<T> for R where R: MatrixRef<T> {}
99
100#[derive(Debug)]
107pub struct WithIndex<I> {
108 pub(crate) iterator: I,
109}
110
111impl<I> WithIndex<I> {
112 pub fn source(self) -> I {
116 self.iterator
117 }
118}
119
120#[derive(Debug)]
134pub struct ColumnIterator<'a, T: Clone, S: MatrixRef<T> = Matrix<T>> {
135 matrix: &'a S,
136 column: Column,
137 range: Range<Row>,
138 _type: PhantomData<&'a T>,
139}
140
141impl<'a, T: Clone> ColumnIterator<'a, T> {
142 #[track_caller]
150 pub fn new(matrix: &Matrix<T>, column: Column) -> ColumnIterator<T> {
151 ColumnIterator::from(matrix, column)
152 }
153}
154
155impl<'a, T: Clone, S: MatrixRef<T>> ColumnIterator<'a, T, S> {
156 #[track_caller]
164 pub fn from(source: &S, column: Column) -> ColumnIterator<T, S> {
165 assert!(
166 source.index_is_valid(0, column),
167 "Expected ({},{}) to be in range",
168 0,
169 column
170 );
171 ColumnIterator {
172 matrix: source,
173 column,
174 range: 0..source.view_rows(),
175 _type: PhantomData,
176 }
177 }
178}
179
180impl<'a, T: Clone, S: MatrixRef<T>> Iterator for ColumnIterator<'a, T, S> {
181 type Item = T;
182
183 fn next(&mut self) -> Option<Self::Item> {
184 match self.range.next() {
185 None => None,
186 Some(row) => unsafe {
187 Some(
193 self.matrix
194 .get_reference_unchecked(row, self.column)
195 .clone(),
196 )
197 },
198 }
199 }
200
201 fn size_hint(&self) -> (usize, Option<usize>) {
202 self.range.size_hint()
203 }
204}
205impl<'a, T: Clone, S: MatrixRef<T>> FusedIterator for ColumnIterator<'a, T, S> {}
206impl<'a, T: Clone, S: MatrixRef<T>> ExactSizeIterator for ColumnIterator<'a, T, S> {}
207
208#[derive(Debug)]
222pub struct RowIterator<'a, T: Clone, S: MatrixRef<T> = Matrix<T>> {
223 matrix: &'a S,
224 row: Row,
225 range: Range<Column>,
226 _type: PhantomData<&'a T>,
227}
228
229impl<'a, T: Clone> RowIterator<'a, T> {
230 #[track_caller]
238 pub fn new(matrix: &Matrix<T>, row: Row) -> RowIterator<T> {
239 RowIterator::from(matrix, row)
240 }
241}
242
243impl<'a, T: Clone, S: MatrixRef<T>> RowIterator<'a, T, S> {
244 #[track_caller]
252 pub fn from(source: &S, row: Row) -> RowIterator<T, S> {
253 assert!(
254 source.index_is_valid(row, 0),
255 "Expected ({},{}) to be in range",
256 row,
257 0
258 );
259 RowIterator {
260 matrix: source,
261 row,
262 range: 0..source.view_columns(),
263 _type: PhantomData,
264 }
265 }
266}
267
268impl<'a, T: Clone, S: MatrixRef<T>> Iterator for RowIterator<'a, T, S> {
269 type Item = T;
270
271 fn next(&mut self) -> Option<Self::Item> {
272 match self.range.next() {
273 None => None,
274 Some(column) => unsafe {
275 Some(
281 self.matrix
282 .get_reference_unchecked(self.row, column)
283 .clone(),
284 )
285 },
286 }
287 }
288
289 fn size_hint(&self) -> (usize, Option<usize>) {
290 self.range.size_hint()
291 }
292}
293impl<'a, T: Clone, S: MatrixRef<T>> FusedIterator for RowIterator<'a, T, S> {}
294impl<'a, T: Clone, S: MatrixRef<T>> ExactSizeIterator for RowIterator<'a, T, S> {}
295
296fn column_major_iter(
298 finished: &mut bool,
299 rows: Row,
300 columns: Column,
301 row_counter: &mut Row,
302 column_counter: &mut Column,
303) -> Option<(Row, Column)> {
304 if *finished {
305 return None;
306 }
307
308 let value = Some((*row_counter, *column_counter));
309
310 if *row_counter == rows - 1 && *column_counter == columns - 1 {
311 *finished = true;
313 }
314
315 if *row_counter == rows - 1 {
316 *row_counter = 0;
318 *column_counter += 1;
319 } else {
320 *row_counter += 1;
322 }
323
324 value
325}
326
327fn column_major_size_hint(
329 rows: Row,
330 columns: Column,
331 row_counter: Row,
332 column_counter: Column,
333) -> (usize, Option<usize>) {
334 let remaining_columns = columns - column_counter;
335 match remaining_columns {
336 0 => (0, Some(0)),
337 1 => {
338 let remaining_rows = rows - row_counter;
341 (remaining_rows, Some(remaining_rows))
342 }
343 x => {
344 let remaining_rows = rows - row_counter;
347 let remaining_full_columns = (x - 1) * rows;
349 let remaining = remaining_rows + remaining_full_columns;
350 (remaining, Some(remaining))
351 }
352 }
353}
354
355#[derive(Debug)]
368pub struct ColumnMajorIterator<'a, T: Clone, S: MatrixRef<T> = Matrix<T>> {
369 matrix: &'a S,
370 column_counter: Column,
371 columns: Column,
372 row_counter: Row,
373 rows: Row,
374 finished: bool,
375 _type: PhantomData<&'a T>,
376}
377
378impl<'a, T: Clone> ColumnMajorIterator<'a, T> {
379 pub fn new(matrix: &Matrix<T>) -> ColumnMajorIterator<T> {
383 ColumnMajorIterator::from(matrix)
384 }
385}
386
387impl<'a, T: Clone, S: MatrixRef<T>> ColumnMajorIterator<'a, T, S> {
388 pub fn from(source: &S) -> ColumnMajorIterator<T, S> {
392 ColumnMajorIterator {
393 matrix: source,
394 column_counter: 0,
395 columns: source.view_columns(),
396 row_counter: 0,
397 rows: source.view_rows(),
398 finished: !source.index_is_valid(0, 0),
399 _type: PhantomData,
400 }
401 }
402
403 pub fn with_index(self) -> WithIndex<Self> {
408 WithIndex { iterator: self }
409 }
410}
411
412impl<'a, T: Clone, S: MatrixRef<T>> From<ColumnMajorIterator<'a, T, S>>
413 for WithIndex<ColumnMajorIterator<'a, T, S>>
414{
415 fn from(iterator: ColumnMajorIterator<'a, T, S>) -> Self {
416 iterator.with_index()
417 }
418}
419
420impl<'a, T: Clone, S: MatrixRef<T>> Iterator for ColumnMajorIterator<'a, T, S> {
421 type Item = T;
422
423 fn next(&mut self) -> Option<Self::Item> {
424 column_major_iter(
425 &mut self.finished,
426 self.rows,
427 self.columns,
428 &mut self.row_counter,
429 &mut self.column_counter,
430 )
431 .map(|(row, column)| unsafe {
432 self.matrix.get_reference_unchecked(row, column).clone()
438 })
439 }
440
441 fn size_hint(&self) -> (usize, Option<usize>) {
442 column_major_size_hint(
443 self.rows,
444 self.columns,
445 self.row_counter,
446 self.column_counter,
447 )
448 }
449}
450impl<'a, T: Clone, S: MatrixRef<T>> FusedIterator for ColumnMajorIterator<'a, T, S> {}
451impl<'a, T: Clone, S: MatrixRef<T>> ExactSizeIterator for ColumnMajorIterator<'a, T, S> {}
452
453impl<'a, T: Clone, S: MatrixRef<T>> Iterator for WithIndex<ColumnMajorIterator<'a, T, S>> {
454 type Item = ((Row, Column), T);
455
456 fn next(&mut self) -> Option<Self::Item> {
457 let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
458 self.iterator.next().map(|x| ((row, column), x))
459 }
460
461 fn size_hint(&self) -> (usize, Option<usize>) {
462 self.iterator.size_hint()
463 }
464}
465impl<'a, T: Clone, S: MatrixRef<T>> FusedIterator for WithIndex<ColumnMajorIterator<'a, T, S>> {}
466impl<'a, T: Clone, S: MatrixRef<T>> ExactSizeIterator for WithIndex<ColumnMajorIterator<'a, T, S>> {}
471
472fn row_major_iter(
474 finished: &mut bool,
475 rows: Row,
476 columns: Column,
477 row_counter: &mut Row,
478 column_counter: &mut Column,
479) -> Option<(Row, Column)> {
480 if *finished {
481 return None;
482 }
483
484 let value = Some((*row_counter, *column_counter));
485
486 if *column_counter == columns - 1 && *row_counter == rows - 1 {
487 *finished = true;
489 }
490
491 if *column_counter == columns - 1 {
492 *column_counter = 0;
494 *row_counter += 1;
495 } else {
496 *column_counter += 1;
498 }
499
500 value
501}
502
503fn row_major_size_hint(
505 rows: Row,
506 columns: Column,
507 row_counter: Row,
508 column_counter: Column,
509) -> (usize, Option<usize>) {
510 let remaining_rows = rows - row_counter;
511 match remaining_rows {
512 0 => (0, Some(0)),
513 1 => {
514 let remaining_columns = columns - column_counter;
517 (remaining_columns, Some(remaining_columns))
518 }
519 x => {
520 let remaining_columns = columns - column_counter;
523 let remaining_full_rows = (x - 1) * columns;
525 let remaining = remaining_columns + remaining_full_rows;
526 (remaining, Some(remaining))
527 }
528 }
529}
530
531#[derive(Debug)]
544pub struct RowMajorIterator<'a, T: Clone, S: MatrixRef<T> = Matrix<T>> {
545 matrix: &'a S,
546 column_counter: Column,
547 columns: Column,
548 row_counter: Row,
549 rows: Row,
550 finished: bool,
551 _type: PhantomData<&'a T>,
552}
553
554impl<'a, T: Clone> RowMajorIterator<'a, T> {
555 pub fn new(matrix: &Matrix<T>) -> RowMajorIterator<T> {
559 RowMajorIterator::from(matrix)
560 }
561}
562
563impl<'a, T: Clone, S: MatrixRef<T>> RowMajorIterator<'a, T, S> {
564 pub fn from(source: &S) -> RowMajorIterator<T, S> {
568 RowMajorIterator {
569 matrix: source,
570 column_counter: 0,
571 columns: source.view_columns(),
572 row_counter: 0,
573 rows: source.view_rows(),
574 finished: !source.index_is_valid(0, 0),
575 _type: PhantomData,
576 }
577 }
578
579 pub fn with_index(self) -> WithIndex<Self> {
584 WithIndex { iterator: self }
585 }
586}
587
588impl<'a, T: Clone, S: MatrixRef<T>> From<RowMajorIterator<'a, T, S>>
589 for WithIndex<RowMajorIterator<'a, T, S>>
590{
591 fn from(iterator: RowMajorIterator<'a, T, S>) -> Self {
592 iterator.with_index()
593 }
594}
595
596impl<'a, T: Clone, S: MatrixRef<T>> Iterator for RowMajorIterator<'a, T, S> {
597 type Item = T;
598
599 fn next(&mut self) -> Option<Self::Item> {
600 row_major_iter(
601 &mut self.finished,
602 self.rows,
603 self.columns,
604 &mut self.row_counter,
605 &mut self.column_counter,
606 )
607 .map(|(row, column)| unsafe {
608 self.matrix.get_reference_unchecked(row, column).clone()
614 })
615 }
616
617 fn size_hint(&self) -> (usize, Option<usize>) {
618 row_major_size_hint(
619 self.rows,
620 self.columns,
621 self.row_counter,
622 self.column_counter,
623 )
624 }
625}
626impl<'a, T: Clone, S: MatrixRef<T>> FusedIterator for RowMajorIterator<'a, T, S> {}
627impl<'a, T: Clone, S: MatrixRef<T>> ExactSizeIterator for RowMajorIterator<'a, T, S> {}
628
629impl<'a, T: Clone, S: MatrixRef<T>> Iterator for WithIndex<RowMajorIterator<'a, T, S>> {
630 type Item = ((Row, Column), T);
631
632 fn next(&mut self) -> Option<Self::Item> {
633 let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
634 self.iterator.next().map(|x| ((row, column), x))
635 }
636
637 fn size_hint(&self) -> (usize, Option<usize>) {
638 self.iterator.size_hint()
639 }
640}
641impl<'a, T: Clone, S: MatrixRef<T>> FusedIterator for WithIndex<RowMajorIterator<'a, T, S>> {}
642impl<'a, T: Clone, S: MatrixRef<T>> ExactSizeIterator for WithIndex<RowMajorIterator<'a, T, S>> {}
647
648#[derive(Debug)]
662pub struct ColumnReferenceIterator<'a, T, S: MatrixRef<T> = Matrix<T>> {
663 matrix: &'a S,
664 column: Column,
665 range: Range<Row>,
666 _type: PhantomData<&'a T>,
667}
668
669impl<'a, T> ColumnReferenceIterator<'a, T> {
670 #[track_caller]
678 pub fn new(matrix: &Matrix<T>, column: Column) -> ColumnReferenceIterator<T> {
679 ColumnReferenceIterator::from(matrix, column)
680 }
681}
682
683impl<'a, T, S: MatrixRef<T>> ColumnReferenceIterator<'a, T, S> {
684 #[track_caller]
692 pub fn from(source: &S, column: Column) -> ColumnReferenceIterator<T, S> {
693 assert!(
694 source.index_is_valid(0, column),
695 "Expected ({},{}) to be in range",
696 0,
697 column
698 );
699 ColumnReferenceIterator {
700 matrix: source,
701 column,
702 range: 0..source.view_rows(),
703 _type: PhantomData,
704 }
705 }
706}
707
708impl<'a, T, S: MatrixRef<T>> Iterator for ColumnReferenceIterator<'a, T, S> {
709 type Item = &'a T;
710
711 fn next(&mut self) -> Option<Self::Item> {
712 match self.range.next() {
713 None => None,
714 Some(row) => unsafe {
715 Some(self.matrix.get_reference_unchecked(row, self.column))
721 },
722 }
723 }
724
725 fn size_hint(&self) -> (usize, Option<usize>) {
726 self.range.size_hint()
727 }
728}
729impl<'a, T, S: MatrixRef<T>> FusedIterator for ColumnReferenceIterator<'a, T, S> {}
730impl<'a, T, S: MatrixRef<T>> ExactSizeIterator for ColumnReferenceIterator<'a, T, S> {}
731
732#[derive(Debug)]
746pub struct RowReferenceIterator<'a, T, S: MatrixRef<T> = Matrix<T>> {
747 matrix: &'a S,
748 row: Row,
749 range: Range<Column>,
750 _type: PhantomData<&'a T>,
751}
752
753impl<'a, T> RowReferenceIterator<'a, T> {
754 #[track_caller]
762 pub fn new(matrix: &Matrix<T>, row: Row) -> RowReferenceIterator<T> {
763 RowReferenceIterator::from(matrix, row)
764 }
765}
766
767impl<'a, T, S: MatrixRef<T>> RowReferenceIterator<'a, T, S> {
768 #[track_caller]
776 pub fn from(source: &S, row: Row) -> RowReferenceIterator<T, S> {
777 assert!(
778 source.index_is_valid(row, 0),
779 "Expected ({},{}) to be in range",
780 row,
781 0
782 );
783 RowReferenceIterator {
784 matrix: source,
785 row,
786 range: 0..source.view_columns(),
787 _type: PhantomData,
788 }
789 }
790}
791
792impl<'a, T, S: MatrixRef<T>> Iterator for RowReferenceIterator<'a, T, S> {
793 type Item = &'a T;
794
795 fn next(&mut self) -> Option<Self::Item> {
796 match self.range.next() {
797 None => None,
798 Some(column) => unsafe {
799 Some(self.matrix.get_reference_unchecked(self.row, column))
805 },
806 }
807 }
808
809 fn size_hint(&self) -> (usize, Option<usize>) {
810 self.range.size_hint()
811 }
812}
813impl<'a, T, S: MatrixRef<T>> FusedIterator for RowReferenceIterator<'a, T, S> {}
814impl<'a, T, S: MatrixRef<T>> ExactSizeIterator for RowReferenceIterator<'a, T, S> {}
815
816#[derive(Debug)]
829pub struct ColumnMajorReferenceIterator<'a, T, S: MatrixRef<T> = Matrix<T>> {
830 matrix: &'a S,
831 column_counter: Column,
832 columns: Column,
833 row_counter: Row,
834 rows: Row,
835 finished: bool,
836 _type: PhantomData<&'a T>,
837}
838
839impl<'a, T> ColumnMajorReferenceIterator<'a, T> {
840 pub fn new(matrix: &Matrix<T>) -> ColumnMajorReferenceIterator<T> {
844 ColumnMajorReferenceIterator::from(matrix)
845 }
846}
847
848impl<'a, T, S: MatrixRef<T>> ColumnMajorReferenceIterator<'a, T, S> {
849 pub fn from(source: &S) -> ColumnMajorReferenceIterator<T, S> {
853 ColumnMajorReferenceIterator {
854 matrix: source,
855 column_counter: 0,
856 columns: source.view_columns(),
857 row_counter: 0,
858 rows: source.view_rows(),
859 finished: !source.index_is_valid(0, 0),
860 _type: PhantomData,
861 }
862 }
863
864 pub fn with_index(self) -> WithIndex<Self> {
869 WithIndex { iterator: self }
870 }
871}
872
873impl<'a, T, S: MatrixRef<T>> From<ColumnMajorReferenceIterator<'a, T, S>>
874 for WithIndex<ColumnMajorReferenceIterator<'a, T, S>>
875{
876 fn from(iterator: ColumnMajorReferenceIterator<'a, T, S>) -> Self {
877 iterator.with_index()
878 }
879}
880
881impl<'a, T, S: MatrixRef<T>> Iterator for ColumnMajorReferenceIterator<'a, T, S> {
882 type Item = &'a T;
883
884 fn next(&mut self) -> Option<Self::Item> {
885 column_major_iter(
886 &mut self.finished,
887 self.rows,
888 self.columns,
889 &mut self.row_counter,
890 &mut self.column_counter,
891 )
892 .map(|(row, column)| unsafe {
893 self.matrix.get_reference_unchecked(row, column)
899 })
900 }
901
902 fn size_hint(&self) -> (usize, Option<usize>) {
903 column_major_size_hint(
904 self.rows,
905 self.columns,
906 self.row_counter,
907 self.column_counter,
908 )
909 }
910}
911
912impl<'a, T, S: MatrixRef<T>> FusedIterator for ColumnMajorReferenceIterator<'a, T, S> {}
913impl<'a, T, S: MatrixRef<T>> ExactSizeIterator for ColumnMajorReferenceIterator<'a, T, S> {}
914
915impl<'a, T, S: MatrixRef<T>> Iterator for WithIndex<ColumnMajorReferenceIterator<'a, T, S>> {
916 type Item = ((Row, Column), &'a T);
917
918 fn next(&mut self) -> Option<Self::Item> {
919 let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
920 self.iterator.next().map(|x| ((row, column), x))
921 }
922
923 fn size_hint(&self) -> (usize, Option<usize>) {
924 self.iterator.size_hint()
925 }
926}
927impl<'a, T, S: MatrixRef<T>> FusedIterator for WithIndex<ColumnMajorReferenceIterator<'a, T, S>> {}
928#[rustfmt::skip]
933impl<'a, T, S: MatrixRef<T>> ExactSizeIterator for WithIndex<ColumnMajorReferenceIterator<'a, T, S>> {}
934
935#[derive(Debug)]
948pub struct RowMajorReferenceIterator<'a, T, S: MatrixRef<T> = Matrix<T>> {
949 matrix: &'a S,
950 column_counter: Column,
951 columns: Column,
952 row_counter: Row,
953 rows: Row,
954 finished: bool,
955 _type: PhantomData<&'a T>,
956}
957
958impl<'a, T> RowMajorReferenceIterator<'a, T> {
959 pub fn new(matrix: &Matrix<T>) -> RowMajorReferenceIterator<T> {
963 RowMajorReferenceIterator::from(matrix)
964 }
965}
966
967impl<'a, T, S: MatrixRef<T>> RowMajorReferenceIterator<'a, T, S> {
968 pub fn from(source: &S) -> RowMajorReferenceIterator<T, S> {
972 RowMajorReferenceIterator {
973 matrix: source,
974 column_counter: 0,
975 columns: source.view_columns(),
976 row_counter: 0,
977 rows: source.view_rows(),
978 finished: !source.index_is_valid(0, 0),
979 _type: PhantomData,
980 }
981 }
982
983 pub fn with_index(self) -> WithIndex<Self> {
988 WithIndex { iterator: self }
989 }
990}
991
992impl<'a, T, S: MatrixRef<T>> From<RowMajorReferenceIterator<'a, T, S>>
993 for WithIndex<RowMajorReferenceIterator<'a, T, S>>
994{
995 fn from(iterator: RowMajorReferenceIterator<'a, T, S>) -> Self {
996 iterator.with_index()
997 }
998}
999
1000impl<'a, T, S: MatrixRef<T>> Iterator for RowMajorReferenceIterator<'a, T, S> {
1001 type Item = &'a T;
1002
1003 fn next(&mut self) -> Option<Self::Item> {
1004 row_major_iter(
1005 &mut self.finished,
1006 self.rows,
1007 self.columns,
1008 &mut self.row_counter,
1009 &mut self.column_counter,
1010 )
1011 .map(|(row, column)| unsafe {
1012 self.matrix.get_reference_unchecked(row, column)
1018 })
1019 }
1020
1021 fn size_hint(&self) -> (usize, Option<usize>) {
1022 row_major_size_hint(
1023 self.rows,
1024 self.columns,
1025 self.row_counter,
1026 self.column_counter,
1027 )
1028 }
1029}
1030impl<'a, T, S: MatrixRef<T>> FusedIterator for RowMajorReferenceIterator<'a, T, S> {}
1031impl<'a, T, S: MatrixRef<T>> ExactSizeIterator for RowMajorReferenceIterator<'a, T, S> {}
1032
1033impl<'a, T, S: MatrixRef<T>> Iterator for WithIndex<RowMajorReferenceIterator<'a, T, S>> {
1034 type Item = ((Row, Column), &'a T);
1035
1036 fn next(&mut self) -> Option<Self::Item> {
1037 let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
1038 self.iterator.next().map(|x| ((row, column), x))
1039 }
1040
1041 fn size_hint(&self) -> (usize, Option<usize>) {
1042 self.iterator.size_hint()
1043 }
1044}
1045impl<'a, T, S: MatrixRef<T>> FusedIterator for WithIndex<RowMajorReferenceIterator<'a, T, S>> {}
1046impl<'a, T, S: MatrixRef<T>> ExactSizeIterator for WithIndex<RowMajorReferenceIterator<'a, T, S>> {}
1051
1052#[derive(Debug)]
1067pub struct DiagonalIterator<'a, T: Clone, S: MatrixRef<T> = Matrix<T>> {
1068 matrix: &'a S,
1069 range: Range<usize>,
1070 _type: PhantomData<&'a T>,
1071}
1072
1073impl<'a, T: Clone> DiagonalIterator<'a, T> {
1074 pub fn new(matrix: &Matrix<T>) -> DiagonalIterator<T> {
1078 DiagonalIterator::from(matrix)
1079 }
1080}
1081
1082impl<'a, T: Clone, S: MatrixRef<T>> DiagonalIterator<'a, T, S> {
1083 pub fn from(source: &S) -> DiagonalIterator<T, S> {
1087 DiagonalIterator {
1088 matrix: source,
1089 range: 0..std::cmp::min(source.view_rows(), source.view_columns()),
1090 _type: PhantomData,
1091 }
1092 }
1093}
1094
1095impl<'a, T: Clone, S: MatrixRef<T>> Iterator for DiagonalIterator<'a, T, S> {
1096 type Item = T;
1097
1098 fn next(&mut self) -> Option<Self::Item> {
1099 match self.range.next() {
1100 None => None,
1101 Some(i) => unsafe {
1102 Some(self.matrix.get_reference_unchecked(i, i).clone())
1107 },
1108 }
1109 }
1110
1111 fn size_hint(&self) -> (usize, Option<usize>) {
1112 self.range.size_hint()
1113 }
1114}
1115impl<'a, T: Clone, S: MatrixRef<T>> FusedIterator for DiagonalIterator<'a, T, S> {}
1116impl<'a, T: Clone, S: MatrixRef<T>> ExactSizeIterator for DiagonalIterator<'a, T, S> {}
1117
1118#[derive(Debug)]
1133pub struct DiagonalReferenceIterator<'a, T, S: MatrixRef<T> = Matrix<T>> {
1134 matrix: &'a S,
1135 range: Range<usize>,
1136 _type: PhantomData<&'a T>,
1137}
1138
1139impl<'a, T> DiagonalReferenceIterator<'a, T> {
1140 pub fn new(matrix: &Matrix<T>) -> DiagonalReferenceIterator<T> {
1144 DiagonalReferenceIterator::from(matrix)
1145 }
1146}
1147
1148impl<'a, T, S: MatrixRef<T>> DiagonalReferenceIterator<'a, T, S> {
1149 pub fn from(source: &S) -> DiagonalReferenceIterator<T, S> {
1153 DiagonalReferenceIterator {
1154 matrix: source,
1155 range: 0..std::cmp::min(source.view_rows(), source.view_columns()),
1156 _type: PhantomData,
1157 }
1158 }
1159}
1160
1161impl<'a, T, S: MatrixRef<T>> Iterator for DiagonalReferenceIterator<'a, T, S> {
1162 type Item = &'a T;
1163
1164 fn next(&mut self) -> Option<Self::Item> {
1165 match self.range.next() {
1166 None => None,
1167 Some(i) => unsafe {
1168 Some(self.matrix.get_reference_unchecked(i, i))
1173 },
1174 }
1175 }
1176
1177 fn size_hint(&self) -> (usize, Option<usize>) {
1178 self.range.size_hint()
1179 }
1180}
1181impl<'a, T, S: MatrixRef<T>> FusedIterator for DiagonalReferenceIterator<'a, T, S> {}
1182impl<'a, T, S: MatrixRef<T>> ExactSizeIterator for DiagonalReferenceIterator<'a, T, S> {}
1183
1184#[derive(Debug)]
1197#[rustfmt::skip]
1198pub struct ColumnMajorReferenceMutIterator<'a, T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
1199 matrix: &'a mut S,
1200 column_counter: Column,
1201 columns: Column,
1202 row_counter: Row,
1203 rows: Row,
1204 finished: bool,
1205 _type: PhantomData<&'a mut T>,
1206}
1207
1208impl<'a, T> ColumnMajorReferenceMutIterator<'a, T> {
1209 pub fn new(matrix: &mut Matrix<T>) -> ColumnMajorReferenceMutIterator<T> {
1213 ColumnMajorReferenceMutIterator::from(matrix)
1214 }
1215}
1216
1217impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ColumnMajorReferenceMutIterator<'a, T, S> {
1218 pub fn from(source: &mut S) -> ColumnMajorReferenceMutIterator<T, S> {
1222 ColumnMajorReferenceMutIterator {
1223 column_counter: 0,
1224 columns: source.view_columns(),
1225 row_counter: 0,
1226 rows: source.view_rows(),
1227 finished: !source.index_is_valid(0, 0),
1228 matrix: source,
1229 _type: PhantomData,
1230 }
1231 }
1232
1233 pub fn with_index(self) -> WithIndex<Self> {
1238 WithIndex { iterator: self }
1239 }
1240}
1241
1242impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> From<ColumnMajorReferenceMutIterator<'a, T, S>>
1243 for WithIndex<ColumnMajorReferenceMutIterator<'a, T, S>>
1244{
1245 fn from(iterator: ColumnMajorReferenceMutIterator<'a, T, S>) -> Self {
1246 iterator.with_index()
1247 }
1248}
1249
1250impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
1251 for ColumnMajorReferenceMutIterator<'a, T, S>
1252{
1253 type Item = &'a mut T;
1254
1255 fn next(&mut self) -> Option<Self::Item> {
1256 column_major_iter(
1257 &mut self.finished,
1258 self.rows,
1259 self.columns,
1260 &mut self.row_counter,
1261 &mut self.column_counter,
1262 )
1263 .map(|(row, column)| unsafe {
1264 std::mem::transmute(self.matrix.get_reference_unchecked_mut(row, column))
1278 })
1279 }
1280
1281 fn size_hint(&self) -> (usize, Option<usize>) {
1282 column_major_size_hint(
1283 self.rows,
1284 self.columns,
1285 self.row_counter,
1286 self.column_counter,
1287 )
1288 }
1289}
1290#[rustfmt::skip]
1291impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for ColumnMajorReferenceMutIterator<'a, T, S> {}
1292#[rustfmt::skip]
1293impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for ColumnMajorReferenceMutIterator<'a, T, S> {}
1294
1295impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
1296 for WithIndex<ColumnMajorReferenceMutIterator<'a, T, S>>
1297{
1298 type Item = ((Row, Column), &'a mut T);
1299
1300 fn next(&mut self) -> Option<Self::Item> {
1301 let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
1302 self.iterator.next().map(|x| ((row, column), x))
1303 }
1304
1305 fn size_hint(&self) -> (usize, Option<usize>) {
1306 self.iterator.size_hint()
1307 }
1308}
1309#[rustfmt::skip]
1310impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for WithIndex<ColumnMajorReferenceMutIterator<'a, T, S>> {}
1311#[rustfmt::skip]
1316impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for WithIndex<ColumnMajorReferenceMutIterator<'a, T, S>> {}
1317
1318#[derive(Debug)]
1331pub struct RowMajorReferenceMutIterator<'a, T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
1332 matrix: &'a mut S,
1333 column_counter: Column,
1334 columns: Column,
1335 row_counter: Row,
1336 rows: Row,
1337 finished: bool,
1338 _type: PhantomData<&'a mut T>,
1339}
1340
1341impl<'a, T> RowMajorReferenceMutIterator<'a, T> {
1342 pub fn new(matrix: &mut Matrix<T>) -> RowMajorReferenceMutIterator<T> {
1346 RowMajorReferenceMutIterator::from(matrix)
1347 }
1348}
1349
1350impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> RowMajorReferenceMutIterator<'a, T, S> {
1351 pub fn from(source: &mut S) -> RowMajorReferenceMutIterator<T, S> {
1355 RowMajorReferenceMutIterator {
1356 column_counter: 0,
1357 columns: source.view_columns(),
1358 row_counter: 0,
1359 rows: source.view_rows(),
1360 finished: !source.index_is_valid(0, 0),
1361 matrix: source,
1362 _type: PhantomData,
1363 }
1364 }
1365
1366 pub fn with_index(self) -> WithIndex<Self> {
1371 WithIndex { iterator: self }
1372 }
1373}
1374
1375impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> From<RowMajorReferenceMutIterator<'a, T, S>>
1376 for WithIndex<RowMajorReferenceMutIterator<'a, T, S>>
1377{
1378 fn from(iterator: RowMajorReferenceMutIterator<'a, T, S>) -> Self {
1379 iterator.with_index()
1380 }
1381}
1382
1383impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
1384 for RowMajorReferenceMutIterator<'a, T, S>
1385{
1386 type Item = &'a mut T;
1387
1388 fn next(&mut self) -> Option<Self::Item> {
1389 row_major_iter(
1390 &mut self.finished,
1391 self.rows,
1392 self.columns,
1393 &mut self.row_counter,
1394 &mut self.column_counter,
1395 )
1396 .map(|(row, column)| unsafe {
1397 std::mem::transmute(self.matrix.get_reference_unchecked_mut(row, column))
1412 })
1413 }
1414
1415 fn size_hint(&self) -> (usize, Option<usize>) {
1416 row_major_size_hint(
1417 self.rows,
1418 self.columns,
1419 self.row_counter,
1420 self.column_counter,
1421 )
1422 }
1423}
1424#[rustfmt::skip]
1425impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for RowMajorReferenceMutIterator<'a, T, S> {}
1426#[rustfmt::skip]
1427impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for RowMajorReferenceMutIterator<'a, T, S> {}
1428
1429impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
1430 for WithIndex<RowMajorReferenceMutIterator<'a, T, S>>
1431{
1432 type Item = ((Row, Column), &'a mut T);
1433
1434 fn next(&mut self) -> Option<Self::Item> {
1435 let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
1436 self.iterator.next().map(|x| ((row, column), x))
1437 }
1438
1439 fn size_hint(&self) -> (usize, Option<usize>) {
1440 self.iterator.size_hint()
1441 }
1442}
1443#[rustfmt::skip]
1444impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for WithIndex<RowMajorReferenceMutIterator<'a, T, S>> {}
1445#[rustfmt::skip]
1450impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for WithIndex<RowMajorReferenceMutIterator<'a, T, S>> {}
1451
1452#[derive(Debug)]
1485#[rustfmt::skip]
1486pub struct ColumnMajorOwnedIterator<T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
1487 matrix: S,
1488 column_counter: Column,
1489 columns: Column,
1490 row_counter: Row,
1491 rows: Row,
1492 finished: bool,
1493 producer: fn() -> T,
1494}
1495
1496impl<T> ColumnMajorOwnedIterator<T> {
1497 pub fn new(matrix: Matrix<T>) -> ColumnMajorOwnedIterator<T>
1501 where
1502 T: Default,
1503 {
1504 ColumnMajorOwnedIterator::from(matrix)
1505 }
1506}
1507
1508impl<T, S: MatrixMut<T> + NoInteriorMutability> ColumnMajorOwnedIterator<T, S> {
1509 pub fn from(source: S) -> ColumnMajorOwnedIterator<T, S>
1513 where
1514 T: Default,
1515 {
1516 ColumnMajorOwnedIterator {
1517 column_counter: 0,
1518 columns: source.view_columns(),
1519 row_counter: 0,
1520 rows: source.view_rows(),
1521 finished: !source.index_is_valid(0, 0),
1522 matrix: source,
1523 producer: || T::default(),
1524 }
1525 }
1526
1527 pub fn from_numeric(source: S) -> ColumnMajorOwnedIterator<T, S>
1531 where
1532 T: crate::numeric::ZeroOne,
1533 {
1534 ColumnMajorOwnedIterator {
1535 column_counter: 0,
1536 columns: source.view_columns(),
1537 row_counter: 0,
1538 rows: source.view_rows(),
1539 finished: !source.index_is_valid(0, 0),
1540 matrix: source,
1541 producer: || T::zero(),
1542 }
1543 }
1544
1545 pub fn with_index(self) -> WithIndex<Self> {
1550 WithIndex { iterator: self }
1551 }
1552}
1553
1554impl<T, S: MatrixMut<T> + NoInteriorMutability> From<ColumnMajorOwnedIterator<T, S>>
1555 for WithIndex<ColumnMajorOwnedIterator<T, S>>
1556{
1557 fn from(iterator: ColumnMajorOwnedIterator<T, S>) -> Self {
1558 iterator.with_index()
1559 }
1560}
1561
1562impl<T, S: MatrixMut<T> + NoInteriorMutability> Iterator for ColumnMajorOwnedIterator<T, S> {
1563 type Item = T;
1564
1565 fn next(&mut self) -> Option<Self::Item> {
1566 column_major_iter(
1567 &mut self.finished,
1568 self.rows,
1569 self.columns,
1570 &mut self.row_counter,
1571 &mut self.column_counter,
1572 )
1573 .map(|(row, column)| unsafe {
1574 let producer = self.producer;
1584 let dummy = producer();
1585 std::mem::replace(self.matrix.get_reference_unchecked_mut(row, column), dummy)
1586 })
1587 }
1588
1589 fn size_hint(&self) -> (usize, Option<usize>) {
1590 column_major_size_hint(
1591 self.rows,
1592 self.columns,
1593 self.row_counter,
1594 self.column_counter,
1595 )
1596 }
1597}
1598#[rustfmt::skip]
1599impl<T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for ColumnMajorOwnedIterator<T, S> {}
1600#[rustfmt::skip]
1601impl<T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for ColumnMajorOwnedIterator<T, S> {}
1602
1603impl<T, S: MatrixMut<T> + NoInteriorMutability> Iterator
1604 for WithIndex<ColumnMajorOwnedIterator<T, S>>
1605{
1606 type Item = ((Row, Column), T);
1607
1608 fn next(&mut self) -> Option<Self::Item> {
1609 let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
1610 self.iterator.next().map(|x| ((row, column), x))
1611 }
1612
1613 fn size_hint(&self) -> (usize, Option<usize>) {
1614 self.iterator.size_hint()
1615 }
1616}
1617#[rustfmt::skip]
1618impl<T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for WithIndex<ColumnMajorOwnedIterator<T, S>> {}
1619#[rustfmt::skip]
1620impl<T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for WithIndex<ColumnMajorOwnedIterator<T, S>> {}
1621
1622#[derive(Debug)]
1655pub struct RowMajorOwnedIterator<T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
1656 matrix: S,
1657 column_counter: Column,
1658 columns: Column,
1659 row_counter: Row,
1660 rows: Row,
1661 finished: bool,
1662 producer: fn() -> T,
1663}
1664
1665impl<T> RowMajorOwnedIterator<T> {
1666 pub fn new(matrix: Matrix<T>) -> RowMajorOwnedIterator<T>
1670 where
1671 T: Default,
1672 {
1673 RowMajorOwnedIterator::from(matrix)
1674 }
1675}
1676
1677impl<T, S: MatrixMut<T> + NoInteriorMutability> RowMajorOwnedIterator<T, S> {
1678 pub fn from(source: S) -> RowMajorOwnedIterator<T, S>
1682 where
1683 T: Default,
1684 {
1685 RowMajorOwnedIterator {
1686 column_counter: 0,
1687 columns: source.view_columns(),
1688 row_counter: 0,
1689 rows: source.view_rows(),
1690 finished: !source.index_is_valid(0, 0),
1691 matrix: source,
1692 producer: || T::default(),
1693 }
1694 }
1695
1696 pub fn from_numeric(source: S) -> RowMajorOwnedIterator<T, S>
1700 where
1701 T: crate::numeric::ZeroOne,
1702 {
1703 RowMajorOwnedIterator {
1704 column_counter: 0,
1705 columns: source.view_columns(),
1706 row_counter: 0,
1707 rows: source.view_rows(),
1708 finished: !source.index_is_valid(0, 0),
1709 matrix: source,
1710 producer: || T::zero(),
1711 }
1712 }
1713
1714 pub fn with_index(self) -> WithIndex<Self> {
1719 WithIndex { iterator: self }
1720 }
1721}
1722
1723impl<T, S: MatrixMut<T> + NoInteriorMutability> From<RowMajorOwnedIterator<T, S>>
1724 for WithIndex<RowMajorOwnedIterator<T, S>>
1725{
1726 fn from(iterator: RowMajorOwnedIterator<T, S>) -> Self {
1727 iterator.with_index()
1728 }
1729}
1730
1731impl<T, S: MatrixMut<T> + NoInteriorMutability> Iterator for RowMajorOwnedIterator<T, S> {
1732 type Item = T;
1733
1734 fn next(&mut self) -> Option<Self::Item> {
1735 row_major_iter(
1736 &mut self.finished,
1737 self.rows,
1738 self.columns,
1739 &mut self.row_counter,
1740 &mut self.column_counter,
1741 )
1742 .map(|(row, column)| unsafe {
1743 let producer = self.producer;
1753 let dummy = producer();
1754 std::mem::replace(self.matrix.get_reference_unchecked_mut(row, column), dummy)
1755 })
1756 }
1757
1758 fn size_hint(&self) -> (usize, Option<usize>) {
1759 row_major_size_hint(
1760 self.rows,
1761 self.columns,
1762 self.row_counter,
1763 self.column_counter,
1764 )
1765 }
1766}
1767#[rustfmt::skip]
1768impl<T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for RowMajorOwnedIterator<T, S> {}
1769#[rustfmt::skip]
1770impl<T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for RowMajorOwnedIterator<T, S> {}
1771
1772impl<T, S: MatrixMut<T> + NoInteriorMutability> Iterator
1773 for WithIndex<RowMajorOwnedIterator<T, S>>
1774{
1775 type Item = ((Row, Column), T);
1776
1777 fn next(&mut self) -> Option<Self::Item> {
1778 let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
1779 self.iterator.next().map(|x| ((row, column), x))
1780 }
1781
1782 fn size_hint(&self) -> (usize, Option<usize>) {
1783 self.iterator.size_hint()
1784 }
1785}
1786#[rustfmt::skip]
1787impl<T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for WithIndex<RowMajorOwnedIterator<T, S>> {}
1788#[rustfmt::skip]
1789impl<T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for WithIndex<RowMajorOwnedIterator<T, S>> {}
1790
1791#[derive(Debug)]
1806pub struct DiagonalReferenceMutIterator<'a, T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
1807 matrix: &'a mut S,
1808 range: Range<usize>,
1809 _type: PhantomData<&'a mut T>,
1810}
1811
1812impl<'a, T> DiagonalReferenceMutIterator<'a, T> {
1813 pub fn new(matrix: &mut Matrix<T>) -> DiagonalReferenceMutIterator<T> {
1817 DiagonalReferenceMutIterator::from(matrix)
1818 }
1819}
1820
1821impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> DiagonalReferenceMutIterator<'a, T, S> {
1822 pub fn from(source: &mut S) -> DiagonalReferenceMutIterator<T, S> {
1826 DiagonalReferenceMutIterator {
1827 range: 0..std::cmp::min(source.view_rows(), source.view_columns()),
1828 matrix: source,
1829 _type: PhantomData,
1830 }
1831 }
1832}
1833
1834impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
1835 for DiagonalReferenceMutIterator<'a, T, S>
1836{
1837 type Item = &'a mut T;
1838
1839 fn next(&mut self) -> Option<Self::Item> {
1840 match self.range.next() {
1841 None => None,
1842 Some(i) => unsafe {
1843 std::mem::transmute(self.matrix.get_reference_unchecked_mut(i, i))
1855 },
1856 }
1857 }
1858
1859 fn size_hint(&self) -> (usize, Option<usize>) {
1860 self.range.size_hint()
1861 }
1862}
1863#[rustfmt::skip]
1864impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for DiagonalReferenceMutIterator<'a, T, S> {}
1865#[rustfmt::skip]
1866impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for DiagonalReferenceMutIterator<'a, T, S> {}
1867
1868#[derive(Debug)]
1882pub struct ColumnReferenceMutIterator<'a, T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
1883 matrix: &'a mut S,
1884 column: Column,
1885 range: Range<Row>,
1886 _type: PhantomData<&'a mut T>,
1887}
1888
1889impl<'a, T> ColumnReferenceMutIterator<'a, T> {
1890 #[track_caller]
1898 pub fn new(matrix: &mut Matrix<T>, column: Column) -> ColumnReferenceMutIterator<T> {
1899 ColumnReferenceMutIterator::from(matrix, column)
1900 }
1901}
1902
1903impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ColumnReferenceMutIterator<'a, T, S> {
1904 #[track_caller]
1912 pub fn from(source: &mut S, column: Column) -> ColumnReferenceMutIterator<T, S> {
1913 assert!(
1914 source.index_is_valid(0, column),
1915 "Expected ({},{}) to be in range",
1916 0,
1917 column
1918 );
1919 ColumnReferenceMutIterator {
1920 range: 0..source.view_rows(),
1921 matrix: source,
1922 column,
1923 _type: PhantomData,
1924 }
1925 }
1926}
1927
1928impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
1929 for ColumnReferenceMutIterator<'a, T, S>
1930{
1931 type Item = &'a mut T;
1932
1933 fn next(&mut self) -> Option<Self::Item> {
1934 match self.range.next() {
1935 None => None,
1936 Some(row) => unsafe {
1937 std::mem::transmute(self.matrix.get_reference_unchecked_mut(row, self.column))
1950 },
1951 }
1952 }
1953
1954 fn size_hint(&self) -> (usize, Option<usize>) {
1955 self.range.size_hint()
1956 }
1957}
1958#[rustfmt::skip]
1959impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for ColumnReferenceMutIterator<'a, T, S> {}
1960#[rustfmt::skip]
1961impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for ColumnReferenceMutIterator<'a, T, S> {}
1962
1963#[derive(Debug)]
1977pub struct RowReferenceMutIterator<'a, T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
1978 matrix: &'a mut S,
1979 row: Row,
1980 range: Range<Column>,
1981 _type: PhantomData<&'a mut T>,
1982}
1983
1984impl<'a, T> RowReferenceMutIterator<'a, T> {
1985 #[track_caller]
1993 pub fn new(matrix: &mut Matrix<T>, row: Row) -> RowReferenceMutIterator<T> {
1994 RowReferenceMutIterator::from(matrix, row)
1995 }
1996}
1997
1998impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> RowReferenceMutIterator<'a, T, S> {
1999 #[track_caller]
2007 pub fn from(source: &mut S, row: Row) -> RowReferenceMutIterator<T, S> {
2008 assert!(
2009 source.index_is_valid(row, 0),
2010 "Expected ({},{}) to be in range",
2011 row,
2012 0
2013 );
2014 RowReferenceMutIterator {
2015 range: 0..source.view_columns(),
2016 matrix: source,
2017 row,
2018 _type: PhantomData,
2019 }
2020 }
2021}
2022
2023impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator for RowReferenceMutIterator<'a, T, S> {
2024 type Item = &'a mut T;
2025
2026 fn next(&mut self) -> Option<Self::Item> {
2027 match self.range.next() {
2028 None => None,
2029 Some(column) => unsafe {
2030 std::mem::transmute(self.matrix.get_reference_unchecked_mut(self.row, column))
2043 },
2044 }
2045 }
2046
2047 fn size_hint(&self) -> (usize, Option<usize>) {
2048 self.range.size_hint()
2049 }
2050}
2051#[rustfmt::skip]
2052impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for RowReferenceMutIterator<'a, T, S> {}
2053#[rustfmt::skip]
2054impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for RowReferenceMutIterator<'a, T, S> {}