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::<&mut T, &mut T>(
1278 self.matrix.get_reference_unchecked_mut(row, column),
1279 )
1280 })
1281 }
1282
1283 fn size_hint(&self) -> (usize, Option<usize>) {
1284 column_major_size_hint(
1285 self.rows,
1286 self.columns,
1287 self.row_counter,
1288 self.column_counter,
1289 )
1290 }
1291}
1292#[rustfmt::skip]
1293impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for ColumnMajorReferenceMutIterator<'a, T, S> {}
1294#[rustfmt::skip]
1295impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for ColumnMajorReferenceMutIterator<'a, T, S> {}
1296
1297impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
1298 for WithIndex<ColumnMajorReferenceMutIterator<'a, T, S>>
1299{
1300 type Item = ((Row, Column), &'a mut T);
1301
1302 fn next(&mut self) -> Option<Self::Item> {
1303 let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
1304 self.iterator.next().map(|x| ((row, column), x))
1305 }
1306
1307 fn size_hint(&self) -> (usize, Option<usize>) {
1308 self.iterator.size_hint()
1309 }
1310}
1311#[rustfmt::skip]
1312impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for WithIndex<ColumnMajorReferenceMutIterator<'a, T, S>> {}
1313#[rustfmt::skip]
1318impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for WithIndex<ColumnMajorReferenceMutIterator<'a, T, S>> {}
1319
1320#[derive(Debug)]
1333pub struct RowMajorReferenceMutIterator<'a, T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
1334 matrix: &'a mut S,
1335 column_counter: Column,
1336 columns: Column,
1337 row_counter: Row,
1338 rows: Row,
1339 finished: bool,
1340 _type: PhantomData<&'a mut T>,
1341}
1342
1343impl<'a, T> RowMajorReferenceMutIterator<'a, T> {
1344 pub fn new(matrix: &mut Matrix<T>) -> RowMajorReferenceMutIterator<'_, T> {
1348 RowMajorReferenceMutIterator::from(matrix)
1349 }
1350}
1351
1352impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> RowMajorReferenceMutIterator<'a, T, S> {
1353 pub fn from(source: &mut S) -> RowMajorReferenceMutIterator<'_, T, S> {
1357 RowMajorReferenceMutIterator {
1358 column_counter: 0,
1359 columns: source.view_columns(),
1360 row_counter: 0,
1361 rows: source.view_rows(),
1362 finished: !source.index_is_valid(0, 0),
1363 matrix: source,
1364 _type: PhantomData,
1365 }
1366 }
1367
1368 pub fn with_index(self) -> WithIndex<Self> {
1373 WithIndex { iterator: self }
1374 }
1375}
1376
1377impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> From<RowMajorReferenceMutIterator<'a, T, S>>
1378 for WithIndex<RowMajorReferenceMutIterator<'a, T, S>>
1379{
1380 fn from(iterator: RowMajorReferenceMutIterator<'a, T, S>) -> Self {
1381 iterator.with_index()
1382 }
1383}
1384
1385impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
1386 for RowMajorReferenceMutIterator<'a, T, S>
1387{
1388 type Item = &'a mut T;
1389
1390 fn next(&mut self) -> Option<Self::Item> {
1391 row_major_iter(
1392 &mut self.finished,
1393 self.rows,
1394 self.columns,
1395 &mut self.row_counter,
1396 &mut self.column_counter,
1397 )
1398 .map(|(row, column)| unsafe {
1399 std::mem::transmute::<&mut T, &mut T>(
1414 self.matrix.get_reference_unchecked_mut(row, column),
1415 )
1416 })
1417 }
1418
1419 fn size_hint(&self) -> (usize, Option<usize>) {
1420 row_major_size_hint(
1421 self.rows,
1422 self.columns,
1423 self.row_counter,
1424 self.column_counter,
1425 )
1426 }
1427}
1428#[rustfmt::skip]
1429impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for RowMajorReferenceMutIterator<'a, T, S> {}
1430#[rustfmt::skip]
1431impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for RowMajorReferenceMutIterator<'a, T, S> {}
1432
1433impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
1434 for WithIndex<RowMajorReferenceMutIterator<'a, T, S>>
1435{
1436 type Item = ((Row, Column), &'a mut T);
1437
1438 fn next(&mut self) -> Option<Self::Item> {
1439 let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
1440 self.iterator.next().map(|x| ((row, column), x))
1441 }
1442
1443 fn size_hint(&self) -> (usize, Option<usize>) {
1444 self.iterator.size_hint()
1445 }
1446}
1447#[rustfmt::skip]
1448impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for WithIndex<RowMajorReferenceMutIterator<'a, T, S>> {}
1449#[rustfmt::skip]
1454impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for WithIndex<RowMajorReferenceMutIterator<'a, T, S>> {}
1455
1456#[derive(Debug)]
1489#[rustfmt::skip]
1490pub struct ColumnMajorOwnedIterator<T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
1491 matrix: S,
1492 column_counter: Column,
1493 columns: Column,
1494 row_counter: Row,
1495 rows: Row,
1496 finished: bool,
1497 producer: fn() -> T,
1498}
1499
1500impl<T> ColumnMajorOwnedIterator<T> {
1501 pub fn new(matrix: Matrix<T>) -> ColumnMajorOwnedIterator<T>
1505 where
1506 T: Default,
1507 {
1508 ColumnMajorOwnedIterator::from(matrix)
1509 }
1510}
1511
1512impl<T, S: MatrixMut<T> + NoInteriorMutability> ColumnMajorOwnedIterator<T, S> {
1513 pub fn from(source: S) -> ColumnMajorOwnedIterator<T, S>
1517 where
1518 T: Default,
1519 {
1520 ColumnMajorOwnedIterator {
1521 column_counter: 0,
1522 columns: source.view_columns(),
1523 row_counter: 0,
1524 rows: source.view_rows(),
1525 finished: !source.index_is_valid(0, 0),
1526 matrix: source,
1527 producer: || T::default(),
1528 }
1529 }
1530
1531 pub fn from_numeric(source: S) -> ColumnMajorOwnedIterator<T, S>
1535 where
1536 T: crate::numeric::ZeroOne,
1537 {
1538 ColumnMajorOwnedIterator {
1539 column_counter: 0,
1540 columns: source.view_columns(),
1541 row_counter: 0,
1542 rows: source.view_rows(),
1543 finished: !source.index_is_valid(0, 0),
1544 matrix: source,
1545 producer: || T::zero(),
1546 }
1547 }
1548
1549 pub fn with_index(self) -> WithIndex<Self> {
1554 WithIndex { iterator: self }
1555 }
1556}
1557
1558impl<T, S: MatrixMut<T> + NoInteriorMutability> From<ColumnMajorOwnedIterator<T, S>>
1559 for WithIndex<ColumnMajorOwnedIterator<T, S>>
1560{
1561 fn from(iterator: ColumnMajorOwnedIterator<T, S>) -> Self {
1562 iterator.with_index()
1563 }
1564}
1565
1566impl<T, S: MatrixMut<T> + NoInteriorMutability> Iterator for ColumnMajorOwnedIterator<T, S> {
1567 type Item = T;
1568
1569 fn next(&mut self) -> Option<Self::Item> {
1570 column_major_iter(
1571 &mut self.finished,
1572 self.rows,
1573 self.columns,
1574 &mut self.row_counter,
1575 &mut self.column_counter,
1576 )
1577 .map(|(row, column)| unsafe {
1578 let producer = self.producer;
1588 let dummy = producer();
1589 std::mem::replace(self.matrix.get_reference_unchecked_mut(row, column), dummy)
1590 })
1591 }
1592
1593 fn size_hint(&self) -> (usize, Option<usize>) {
1594 column_major_size_hint(
1595 self.rows,
1596 self.columns,
1597 self.row_counter,
1598 self.column_counter,
1599 )
1600 }
1601}
1602#[rustfmt::skip]
1603impl<T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for ColumnMajorOwnedIterator<T, S> {}
1604#[rustfmt::skip]
1605impl<T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for ColumnMajorOwnedIterator<T, S> {}
1606
1607impl<T, S: MatrixMut<T> + NoInteriorMutability> Iterator
1608 for WithIndex<ColumnMajorOwnedIterator<T, S>>
1609{
1610 type Item = ((Row, Column), T);
1611
1612 fn next(&mut self) -> Option<Self::Item> {
1613 let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
1614 self.iterator.next().map(|x| ((row, column), x))
1615 }
1616
1617 fn size_hint(&self) -> (usize, Option<usize>) {
1618 self.iterator.size_hint()
1619 }
1620}
1621#[rustfmt::skip]
1622impl<T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for WithIndex<ColumnMajorOwnedIterator<T, S>> {}
1623#[rustfmt::skip]
1624impl<T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for WithIndex<ColumnMajorOwnedIterator<T, S>> {}
1625
1626#[derive(Debug)]
1659pub struct RowMajorOwnedIterator<T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
1660 matrix: S,
1661 column_counter: Column,
1662 columns: Column,
1663 row_counter: Row,
1664 rows: Row,
1665 finished: bool,
1666 producer: fn() -> T,
1667}
1668
1669impl<T> RowMajorOwnedIterator<T> {
1670 pub fn new(matrix: Matrix<T>) -> RowMajorOwnedIterator<T>
1674 where
1675 T: Default,
1676 {
1677 RowMajorOwnedIterator::from(matrix)
1678 }
1679}
1680
1681impl<T, S: MatrixMut<T> + NoInteriorMutability> RowMajorOwnedIterator<T, S> {
1682 pub fn from(source: S) -> RowMajorOwnedIterator<T, S>
1686 where
1687 T: Default,
1688 {
1689 RowMajorOwnedIterator {
1690 column_counter: 0,
1691 columns: source.view_columns(),
1692 row_counter: 0,
1693 rows: source.view_rows(),
1694 finished: !source.index_is_valid(0, 0),
1695 matrix: source,
1696 producer: || T::default(),
1697 }
1698 }
1699
1700 pub fn from_numeric(source: S) -> RowMajorOwnedIterator<T, S>
1704 where
1705 T: crate::numeric::ZeroOne,
1706 {
1707 RowMajorOwnedIterator {
1708 column_counter: 0,
1709 columns: source.view_columns(),
1710 row_counter: 0,
1711 rows: source.view_rows(),
1712 finished: !source.index_is_valid(0, 0),
1713 matrix: source,
1714 producer: || T::zero(),
1715 }
1716 }
1717
1718 pub fn with_index(self) -> WithIndex<Self> {
1723 WithIndex { iterator: self }
1724 }
1725}
1726
1727impl<T, S: MatrixMut<T> + NoInteriorMutability> From<RowMajorOwnedIterator<T, S>>
1728 for WithIndex<RowMajorOwnedIterator<T, S>>
1729{
1730 fn from(iterator: RowMajorOwnedIterator<T, S>) -> Self {
1731 iterator.with_index()
1732 }
1733}
1734
1735impl<T, S: MatrixMut<T> + NoInteriorMutability> Iterator for RowMajorOwnedIterator<T, S> {
1736 type Item = T;
1737
1738 fn next(&mut self) -> Option<Self::Item> {
1739 row_major_iter(
1740 &mut self.finished,
1741 self.rows,
1742 self.columns,
1743 &mut self.row_counter,
1744 &mut self.column_counter,
1745 )
1746 .map(|(row, column)| unsafe {
1747 let producer = self.producer;
1757 let dummy = producer();
1758 std::mem::replace(self.matrix.get_reference_unchecked_mut(row, column), dummy)
1759 })
1760 }
1761
1762 fn size_hint(&self) -> (usize, Option<usize>) {
1763 row_major_size_hint(
1764 self.rows,
1765 self.columns,
1766 self.row_counter,
1767 self.column_counter,
1768 )
1769 }
1770}
1771#[rustfmt::skip]
1772impl<T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for RowMajorOwnedIterator<T, S> {}
1773#[rustfmt::skip]
1774impl<T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for RowMajorOwnedIterator<T, S> {}
1775
1776impl<T, S: MatrixMut<T> + NoInteriorMutability> Iterator
1777 for WithIndex<RowMajorOwnedIterator<T, S>>
1778{
1779 type Item = ((Row, Column), T);
1780
1781 fn next(&mut self) -> Option<Self::Item> {
1782 let (row, column) = (self.iterator.row_counter, self.iterator.column_counter);
1783 self.iterator.next().map(|x| ((row, column), x))
1784 }
1785
1786 fn size_hint(&self) -> (usize, Option<usize>) {
1787 self.iterator.size_hint()
1788 }
1789}
1790#[rustfmt::skip]
1791impl<T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for WithIndex<RowMajorOwnedIterator<T, S>> {}
1792#[rustfmt::skip]
1793impl<T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for WithIndex<RowMajorOwnedIterator<T, S>> {}
1794
1795#[derive(Debug)]
1810pub struct DiagonalReferenceMutIterator<'a, T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
1811 matrix: &'a mut S,
1812 range: Range<usize>,
1813 _type: PhantomData<&'a mut T>,
1814}
1815
1816impl<'a, T> DiagonalReferenceMutIterator<'a, T> {
1817 pub fn new(matrix: &mut Matrix<T>) -> DiagonalReferenceMutIterator<'_, T> {
1821 DiagonalReferenceMutIterator::from(matrix)
1822 }
1823}
1824
1825impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> DiagonalReferenceMutIterator<'a, T, S> {
1826 pub fn from(source: &mut S) -> DiagonalReferenceMutIterator<'_, T, S> {
1830 DiagonalReferenceMutIterator {
1831 range: 0..std::cmp::min(source.view_rows(), source.view_columns()),
1832 matrix: source,
1833 _type: PhantomData,
1834 }
1835 }
1836}
1837
1838impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
1839 for DiagonalReferenceMutIterator<'a, T, S>
1840{
1841 type Item = &'a mut T;
1842
1843 fn next(&mut self) -> Option<Self::Item> {
1844 match self.range.next() {
1845 None => None,
1846 Some(i) => unsafe {
1847 Some(std::mem::transmute::<&mut T, &mut T>(
1859 self.matrix.get_reference_unchecked_mut(i, i),
1860 ))
1861 },
1862 }
1863 }
1864
1865 fn size_hint(&self) -> (usize, Option<usize>) {
1866 self.range.size_hint()
1867 }
1868}
1869#[rustfmt::skip]
1870impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for DiagonalReferenceMutIterator<'a, T, S> {}
1871#[rustfmt::skip]
1872impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for DiagonalReferenceMutIterator<'a, T, S> {}
1873
1874#[derive(Debug)]
1888pub struct ColumnReferenceMutIterator<'a, T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
1889 matrix: &'a mut S,
1890 column: Column,
1891 range: Range<Row>,
1892 _type: PhantomData<&'a mut T>,
1893}
1894
1895impl<'a, T> ColumnReferenceMutIterator<'a, T> {
1896 #[track_caller]
1904 pub fn new(matrix: &mut Matrix<T>, column: Column) -> ColumnReferenceMutIterator<'_, T> {
1905 ColumnReferenceMutIterator::from(matrix, column)
1906 }
1907}
1908
1909impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ColumnReferenceMutIterator<'a, T, S> {
1910 #[track_caller]
1918 pub fn from(source: &mut S, column: Column) -> ColumnReferenceMutIterator<'_, T, S> {
1919 assert!(
1920 source.index_is_valid(0, column),
1921 "Expected ({},{}) to be in range",
1922 0,
1923 column
1924 );
1925 ColumnReferenceMutIterator {
1926 range: 0..source.view_rows(),
1927 matrix: source,
1928 column,
1929 _type: PhantomData,
1930 }
1931 }
1932}
1933
1934impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator
1935 for ColumnReferenceMutIterator<'a, T, S>
1936{
1937 type Item = &'a mut T;
1938
1939 fn next(&mut self) -> Option<Self::Item> {
1940 match self.range.next() {
1941 None => None,
1942 Some(row) => unsafe {
1943 Some(std::mem::transmute::<&mut T, &mut T>(
1956 self.matrix.get_reference_unchecked_mut(row, self.column),
1957 ))
1958 },
1959 }
1960 }
1961
1962 fn size_hint(&self) -> (usize, Option<usize>) {
1963 self.range.size_hint()
1964 }
1965}
1966#[rustfmt::skip]
1967impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for ColumnReferenceMutIterator<'a, T, S> {}
1968#[rustfmt::skip]
1969impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for ColumnReferenceMutIterator<'a, T, S> {}
1970
1971#[derive(Debug)]
1985pub struct RowReferenceMutIterator<'a, T, S: MatrixMut<T> + NoInteriorMutability = Matrix<T>> {
1986 matrix: &'a mut S,
1987 row: Row,
1988 range: Range<Column>,
1989 _type: PhantomData<&'a mut T>,
1990}
1991
1992impl<'a, T> RowReferenceMutIterator<'a, T> {
1993 #[track_caller]
2001 pub fn new(matrix: &mut Matrix<T>, row: Row) -> RowReferenceMutIterator<'_, T> {
2002 RowReferenceMutIterator::from(matrix, row)
2003 }
2004}
2005
2006impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> RowReferenceMutIterator<'a, T, S> {
2007 #[track_caller]
2015 pub fn from(source: &mut S, row: Row) -> RowReferenceMutIterator<'_, T, S> {
2016 assert!(
2017 source.index_is_valid(row, 0),
2018 "Expected ({},{}) to be in range",
2019 row,
2020 0
2021 );
2022 RowReferenceMutIterator {
2023 range: 0..source.view_columns(),
2024 matrix: source,
2025 row,
2026 _type: PhantomData,
2027 }
2028 }
2029}
2030
2031impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> Iterator for RowReferenceMutIterator<'a, T, S> {
2032 type Item = &'a mut T;
2033
2034 fn next(&mut self) -> Option<Self::Item> {
2035 match self.range.next() {
2036 None => None,
2037 Some(column) => unsafe {
2038 Some(std::mem::transmute::<&mut T, &mut T>(
2051 self.matrix.get_reference_unchecked_mut(self.row, column),
2052 ))
2053 },
2054 }
2055 }
2056
2057 fn size_hint(&self) -> (usize, Option<usize>) {
2058 self.range.size_hint()
2059 }
2060}
2061#[rustfmt::skip]
2062impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> FusedIterator for RowReferenceMutIterator<'a, T, S> {}
2063#[rustfmt::skip]
2064impl<'a, T, S: MatrixMut<T> + NoInteriorMutability> ExactSizeIterator for RowReferenceMutIterator<'a, T, S> {}