sparse_bin_mat/matrix/
rows.rs1use super::SparseBinMat;
2use crate::SparseBinSlice;
3
4#[derive(Debug, Clone, PartialEq)]
8pub struct Rows<'a> {
9 matrix: &'a SparseBinMat,
10 front: usize,
11 back: usize,
12}
13
14impl<'a> Rows<'a> {
15 pub(super) fn from(matrix: &'a SparseBinMat) -> Self {
16 Self {
17 matrix,
18 front: 0,
19 back: matrix.number_of_rows(),
20 }
21 }
22}
23
24impl<'a> Iterator for Rows<'a> {
25 type Item = SparseBinSlice<'a>;
26
27 fn next(&mut self) -> Option<Self::Item> {
28 if self.front < self.back {
29 let row = self.matrix.row(self.front);
30 self.front += 1;
31 row
32 } else {
33 None
34 }
35 }
36}
37
38impl<'a> DoubleEndedIterator for Rows<'a> {
39 fn next_back(&mut self) -> Option<Self::Item> {
40 if self.back > self.front {
41 self.back -= 1;
42 self.matrix.row(self.back)
43 } else {
44 None
45 }
46 }
47}
48
49#[cfg(test)]
50mod test {
51 use super::*;
52
53 #[test]
54 fn checks_iterator() {
55 let rows = vec![vec![0, 1, 2], vec![2, 3], vec![0, 3], vec![1, 2, 3]];
56 let matrix = SparseBinMat::new(4, rows.clone());
57 let mut iter = Rows::from(&matrix);
58
59 assert_eq!(iter.next(), Some(SparseBinSlice::new(4, &rows[0])));
60 assert_eq!(iter.next(), Some(SparseBinSlice::new(4, &rows[1])));
61 assert_eq!(iter.next(), Some(SparseBinSlice::new(4, &rows[2])));
62 assert_eq!(iter.next(), Some(SparseBinSlice::new(4, &rows[3])));
63 assert_eq!(iter.next(), None);
64 }
65
66 #[test]
67 fn checks_iterator_for_empty_matrix() {
68 let matrix = SparseBinMat::empty();
69 let mut iter = Rows::from(&matrix);
70 assert_eq!(iter.next(), None);
71 }
72
73 #[test]
74 fn reverse_checks_iterator() {
75 let rows = vec![vec![0, 1, 2], vec![2, 3], vec![0, 3], vec![1, 2, 3]];
76 let matrix = SparseBinMat::new(4, rows.clone());
77 let mut iter = Rows::from(&matrix).rev();
78
79 assert_eq!(iter.next(), Some(SparseBinSlice::new(4, &rows[3])));
80 assert_eq!(iter.next(), Some(SparseBinSlice::new(4, &rows[2])));
81 assert_eq!(iter.next(), Some(SparseBinSlice::new(4, &rows[1])));
82 assert_eq!(iter.next(), Some(SparseBinSlice::new(4, &rows[0])));
83 assert_eq!(iter.next(), None);
84 }
85
86 #[test]
87 fn bothway_checks_iterator() {
88 let rows = vec![vec![0, 1, 2], vec![2, 3], vec![0, 3], vec![1, 2, 3]];
89 let matrix = SparseBinMat::new(4, rows.clone());
90 let mut iter = Rows::from(&matrix);
91
92 assert_eq!(iter.next(), Some(SparseBinSlice::new(4, &rows[0])));
93 assert_eq!(iter.next_back(), Some(SparseBinSlice::new(4, &rows[3])));
94 assert_eq!(iter.next(), Some(SparseBinSlice::new(4, &rows[1])));
95 assert_eq!(iter.next(), Some(SparseBinSlice::new(4, &rows[2])));
96 assert_eq!(iter.next_back(), None);
97 assert_eq!(iter.next(), None);
98 }
99}