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