byte_array_ops/byte_array/
iter.rs

1use super::model::ByteArray;
2
3// TODO document this in my md notes
4
5/// Iterator over immutable references to bytes in a [`ByteArray`].
6///
7/// Created by [`ByteArray::iter()`].
8pub struct ByteArrayIter<'a> {
9    inner: core::slice::Iter<'a, u8>,
10}
11
12/// Iterator over mutable references to bytes in a [`ByteArray`].
13///
14/// Created by [`ByteArray::iter_mut()`].
15pub struct ByteArrayIterMut<'a> {
16    inner: core::slice::IterMut<'a, u8>,
17}
18
19impl<'a> Iterator for ByteArrayIter<'a> {
20    type Item = &'a u8;
21
22    fn next(&mut self) -> Option<Self::Item> {
23        self.inner.next()
24    }
25}
26
27impl<'a> Iterator for ByteArrayIterMut<'a> {
28    type Item = &'a mut u8;
29
30    fn next(&mut self) -> Option<Self::Item> {
31        self.inner.next()
32    }
33}
34
35impl<'a> ExactSizeIterator for ByteArrayIter<'a> {
36    fn len(&self) -> usize {
37        self.inner.len()
38    }
39}
40
41impl<'a> ExactSizeIterator for ByteArrayIterMut<'a> {
42    fn len(&self) -> usize {
43        self.inner.len()
44    }
45}
46
47impl ByteArray {
48    /// Returns an iterator over the bytes.
49    ///
50    /// # Example
51    /// ```
52    /// use byte_array_ops::byte_array::model::ByteArray;
53    ///
54    /// let arr: ByteArray = "0xdeadbeef".parse().unwrap();
55    /// let mut iter = arr.iter();
56    /// assert_eq!(iter.next(), Some(&0xde));
57    /// assert_eq!(iter.next(),Some(&0xad));
58    /// assert_eq!(iter.next(),Some(&0xbe));
59    /// assert_eq!(iter.next(),Some(&0xef));
60    /// assert_eq!(iter.next(),None);
61    ///
62    /// ```
63    pub fn iter(&'_ self) -> ByteArrayIter<'_> {
64        ByteArrayIter {
65            inner: self.bytes.iter(),
66        }
67    }
68
69    /// Returns an iterator that allows modifying each byte.
70    ///
71    /// # Example
72    /// ```
73    /// use byte_array_ops::byte_array::model::ByteArray;
74    ///
75    /// let mut arr: ByteArray = "0xff00ff".parse().unwrap();
76    /// let mut iter_mut = arr.iter_mut();
77    /// iter_mut.next();
78    /// let mut byte = iter_mut.next().unwrap();
79    /// *byte = 0xee;
80    /// assert_eq!(arr.as_bytes(),[0x0ff,0xee,0xff]);
81    ///
82    /// ```
83    pub fn iter_mut(&'_ mut self) -> ByteArrayIterMut<'_> {
84        ByteArrayIterMut {
85            inner: self.bytes.iter_mut(),
86        }
87    }
88}
89
90impl<'a> IntoIterator for &'a ByteArray {
91    type Item = &'a u8;
92    type IntoIter = ByteArrayIter<'a>;
93
94    fn into_iter(self) -> Self::IntoIter {
95        self.iter()
96    }
97}
98
99impl<'a> IntoIterator for &'a mut ByteArray {
100    type Item = &'a mut u8;
101    type IntoIter = ByteArrayIterMut<'a>;
102
103    fn into_iter(self) -> Self::IntoIter {
104        self.iter_mut()
105    }
106}
107
108#[cfg(test)]
109mod tests {
110    use super::*;
111    use alloc::vec::Vec;
112
113    #[test]
114    fn test_iter_empty() {
115        let arr = ByteArray::default();
116
117        let mut iter = arr.iter();
118        assert_eq!(iter.next(), None);
119        assert_eq!(iter.next(), None);
120    }
121
122    #[test]
123    fn test_iter_single_byte() {
124        let arr: ByteArray = "0xff".parse().unwrap();
125
126        let mut iter = arr.iter();
127        assert_eq!(iter.next(), Some(&0xff));
128        assert_eq!(iter.next(), None);
129    }
130
131    #[test]
132    fn test_iter_exhaustion() {
133        let arr: ByteArray = "0xaabbcc".parse().unwrap();
134
135        let mut iter = arr.iter();
136        assert_eq!(iter.next(), Some(&0xaa));
137        assert_eq!(iter.next(), Some(&0xbb));
138        assert_eq!(iter.next(), Some(&0xcc));
139        assert_eq!(iter.next(), None);
140        assert_eq!(iter.next(), None);
141    }
142
143    #[test]
144    fn test_multiple_iterators() {
145        let arr: ByteArray = "0xaabb".parse().unwrap();
146
147        let mut iter1 = arr.iter();
148        let mut iter2 = arr.iter();
149
150        assert_eq!(iter1.next(), Some(&0xaa));
151        assert_eq!(iter2.next(), Some(&0xaa));
152        assert_eq!(iter1.next(), Some(&0xbb));
153    }
154
155    #[test]
156    fn test_partial_iteration() {
157        let arr: ByteArray = "0xaabbccdd".parse().unwrap();
158
159        let mut iter = arr.iter();
160        assert_eq!(iter.next(), Some(&0xaa));
161        assert_eq!(iter.next(), Some(&0xbb));
162        // Drop iterator without consuming all elements
163    }
164
165    #[test]
166    fn test_for_loop() {
167        let arr: ByteArray = "0x010203".parse().unwrap();
168
169        let mut sum = 0u32;
170        for byte in &arr {
171            sum += *byte as u32;
172        }
173        assert_eq!(sum, 1 + 2 + 3);
174    }
175
176    #[test]
177    fn test_iter_mut_modification() {
178        let mut arr: ByteArray = "0x000000".parse().unwrap();
179
180        for byte in arr.iter_mut() {
181            *byte = 0xff;
182        }
183
184        assert_eq!(arr.as_bytes(), &[0xff, 0xff, 0xff]);
185    }
186
187    #[test]
188    fn test_iter_after_mutation() {
189        let mut arr: ByteArray = "0xaa".parse().unwrap();
190        arr[0] = 0xbb;
191
192        let mut iter = arr.iter();
193        assert_eq!(iter.next(), Some(&0xbb));
194    }
195
196    #[test]
197    fn test_collect() {
198        let arr: ByteArray = "0xaabbcc".parse().unwrap();
199
200        let collected: Vec<u8> = arr.iter().copied().collect();
201        let expected = Vec::from([0xaa, 0xbb, 0xcc]);
202        assert_eq!(collected, expected);
203    }
204
205    #[test]
206    fn test_iterator_methods() {
207        let arr: ByteArray = "0x010203".parse().unwrap();
208
209        assert_eq!(arr.iter().count(), 3);
210        assert!(arr.iter().any(|&b| b == 0x02));
211        assert!(arr.iter().all(|&b| b > 0));
212        assert_eq!(arr.iter().find(|&&b| b == 0x03), Some(&0x03));
213    }
214
215    #[test]
216    fn test_large_array() {
217        let arr = ByteArray::init_value(0xff, 10000);
218        assert_eq!(arr.iter().count(), 10000);
219    }
220
221    #[test]
222    fn test_borrow_then_iterate() {
223        let arr: ByteArray = "0xaa".parse().unwrap();
224        let _slice = arr.as_bytes();
225
226        let mut iter = arr.iter();
227        assert_eq!(iter.next(), Some(&0xaa));
228    }
229
230    #[test]
231    fn test_exact_size_iterator() {
232        let arr: ByteArray = "0xaabbccdd".parse().unwrap();
233
234        let iter = arr.iter();
235        assert_eq!(iter.len(), 4);
236
237        let mut iter = arr.iter();
238        iter.next();
239        assert_eq!(iter.len(), 3);
240
241        iter.next();
242        assert_eq!(iter.len(), 2);
243    }
244
245    #[test]
246    fn test_exact_size_iterator_mut() {
247        let mut arr: ByteArray = "0xaabbcc".parse().unwrap();
248
249        let iter = arr.iter_mut();
250        assert_eq!(iter.len(), 3);
251
252        let mut iter = arr.iter_mut();
253        iter.next();
254        assert_eq!(iter.len(), 2);
255    }
256
257    #[test]
258    fn test_exact_size_empty() {
259        let arr = ByteArray::default();
260
261        let iter = arr.iter();
262        assert_eq!(iter.len(), 0);
263    }
264
265    #[test]
266    fn test_iter_mut_for_loop() {
267        let mut arr: ByteArray = "0x010203".parse().unwrap();
268
269        for byte in &mut arr {
270            *byte = byte.wrapping_add(1);
271        }
272
273        assert_eq!(arr.as_bytes(), &[0x02, 0x03, 0x04]);
274    }
275}