1macro_rules! impl_iterator {
2 ($ty:ty: $item:ty as $func:ident |$self:ident, $val:ident: $valtype:ty| $block:block for <$lt:lifetime> [$($slice:tt)+]) => {
3 impl<$lt> ExactSizeIterator for $ty {
4 fn len(&self) -> usize {
5 self.$($slice)+.len()
6 }
7 }
8
9 impl<$lt> Iterator for $ty {
10 type Item = $item;
11
12 fn next(&mut self) -> Option<Self::Item> {
13 self.$($slice)+.next().$func(|val| {
14 (| $self: &mut Self, $val: $valtype| $block )(self, val)
15 })
16 }
17 }
18
19 impl<$lt> DoubleEndedIterator for $ty {
20 fn next_back(&mut self) -> Option<Self::Item> {
21 self.$($slice)+.next_back().$func(|val| {
22 (| $self: &mut Self, $val: $valtype| $block )(self, val)
23 })
24 }
25 }
26 };
27
28 ($ty:ty: $item:ty as $func:ident |$self:ident, $val:ident: $valtype:ty| $block:block for [$($slice:tt)+]) => {
29 impl ExactSizeIterator for $ty {
30 fn len(&self) -> usize {
31 self.$($slice)+.len()
32 }
33 }
34
35 impl Iterator for $ty {
36 type Item = $item;
37
38 fn next(&mut self) -> Option<Self::Item> {
39 self.$($slice)+.next().$func(|val| {
40 (| $self: &mut Self, $val: $valtype| $block)(self, val)
41 })
42 }
43 }
44
45 impl DoubleEndedIterator for $ty {
46 fn next_back(&mut self) -> Option<Self::Item> {
47 self.$($slice)+.next_back().$func(|val| {
48 (| $self: &mut Self, $val: $valtype| $block)(self, val)
49 })
50 }
51 }
52 };
53}
54
55pub(crate) use impl_iterator;