sparse_bin_mat/matrix/
rows.rs

1use super::SparseBinMat;
2use crate::SparseBinSlice;
3
4/// An iterator over the rows of matrix.
5///
6/// See the [`rows`](SparseBinMat::rows) method.
7#[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}