byte_array_ops/byte_array/
iter.rs1use super::model::ByteArray;
2
3pub struct ByteArrayIter<'a> {
9 inner: core::slice::Iter<'a, u8>,
10}
11
12pub 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 pub fn iter(&'_ self) -> ByteArrayIter<'_> {
64 ByteArrayIter {
65 inner: self.bytes.iter(),
66 }
67 }
68
69 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 }
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}