1macro_rules! impl_iter {
3 ($name:ident, $item:ident) => {
4 impl<'a> Iterator for $name<'a> {
5 type Item = $item<'a>;
6
7 fn size_hint(&self) -> (usize, Option<usize>) {
8 let remaining = self.len - self.pos;
9 (remaining, Some(remaining))
10 }
11
12 fn nth(&mut self, n: usize) -> Option<Self::Item> {
13 let pos = self.pos.checked_add(n)?;
14 if pos >= self.len {
15 self.pos = self.len;
16 None
17 } else {
18 self.pos = pos + 1;
19 self.get(pos)
20 }
21 }
22
23 fn next(&mut self) -> Option<Self::Item> {
24 if self.pos >= self.len {
25 None
26 } else {
27 let pos = self.pos;
28 self.pos += 1;
29 self.get(pos)
30 }
31 }
32 }
33
34 impl<'a> ExactSizeIterator for $name<'a> {
35 fn len(&self) -> usize {
36 self.len - self.pos
37 }
38 }
39 };
40}