numeris/dynmatrix/
slice.rs1use super::DynMatrix;
2
3impl<T> DynMatrix<T> {
4 #[inline]
12 pub fn as_slice(&self) -> &[T] {
13 &self.data
14 }
15
16 #[inline]
18 pub fn as_mut_slice(&mut self) -> &mut [T] {
19 &mut self.data
20 }
21
22 #[inline]
31 pub fn row_slice(&self, i: usize) -> &[T] {
32 let start = i * self.ncols;
33 &self.data[start..start + self.ncols]
34 }
35
36 #[inline]
38 pub fn row_slice_mut(&mut self, i: usize) -> &mut [T] {
39 let start = i * self.ncols;
40 let end = start + self.ncols;
41 &mut self.data[start..end]
42 }
43
44 #[inline]
46 pub fn iter(&self) -> core::slice::Iter<'_, T> {
47 self.data.iter()
48 }
49
50 #[inline]
52 pub fn iter_mut(&mut self) -> core::slice::IterMut<'_, T> {
53 self.data.iter_mut()
54 }
55}
56
57impl<'a, T> IntoIterator for &'a DynMatrix<T> {
58 type Item = &'a T;
59 type IntoIter = core::slice::Iter<'a, T>;
60
61 #[inline]
62 fn into_iter(self) -> Self::IntoIter {
63 self.iter()
64 }
65}
66
67impl<'a, T> IntoIterator for &'a mut DynMatrix<T> {
68 type Item = &'a mut T;
69 type IntoIter = core::slice::IterMut<'a, T>;
70
71 #[inline]
72 fn into_iter(self) -> Self::IntoIter {
73 self.iter_mut()
74 }
75}
76
77#[cfg(test)]
78mod tests {
79 use super::*;
80
81 #[test]
82 fn as_slice() {
83 let m = DynMatrix::from_slice(2, 2, &[1.0, 2.0, 3.0, 4.0]);
84 assert_eq!(m.as_slice(), &[1.0, 2.0, 3.0, 4.0]);
85 }
86
87 #[test]
88 fn as_mut_slice() {
89 let mut m = DynMatrix::from_slice(2, 2, &[1.0, 2.0, 3.0, 4.0]);
90 m.as_mut_slice()[0] = 99.0;
91 assert_eq!(m[(0, 0)], 99.0);
92 }
93
94 #[test]
95 fn row_slice() {
96 let m = DynMatrix::from_slice(2, 3, &[1.0, 2.0, 3.0, 4.0, 5.0, 6.0]);
97 assert_eq!(m.row_slice(0), &[1.0, 2.0, 3.0]);
98 assert_eq!(m.row_slice(1), &[4.0, 5.0, 6.0]);
99 }
100
101 #[test]
102 fn iter() {
103 let m = DynMatrix::from_slice(2, 2, &[1.0, 2.0, 3.0, 4.0]);
104 let sum: f64 = m.iter().sum();
105 assert_eq!(sum, 10.0);
106 }
107
108 #[test]
109 fn iter_mut() {
110 let mut m = DynMatrix::from_slice(2, 2, &[1.0, 2.0, 3.0, 4.0]);
111 for x in m.iter_mut() {
112 *x *= 2.0;
113 }
114 assert_eq!(m[(0, 0)], 2.0);
115 assert_eq!(m[(1, 1)], 8.0);
116 }
117
118 #[test]
119 fn into_iter_ref() {
120 let m = DynMatrix::from_slice(2, 2, &[1.0, 2.0, 3.0, 4.0]);
121 let sum: f64 = (&m).into_iter().sum();
122 assert_eq!(sum, 10.0);
123 }
124
125 #[test]
126 fn into_iter_for_loop() {
127 let m = DynMatrix::from_slice(2, 2, &[1, 2, 3, 4]);
128 let mut sum = 0;
129 for &x in &m {
130 sum += x;
131 }
132 assert_eq!(sum, 10);
133 }
134}