Skip to main content

spirv_cross2/
iter.rs

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;