diff options
Diffstat (limited to 'vendor/petgraph/src/macros.rs')
| -rw-r--r-- | vendor/petgraph/src/macros.rs | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/vendor/petgraph/src/macros.rs b/vendor/petgraph/src/macros.rs new file mode 100644 index 00000000..9ecb9002 --- /dev/null +++ b/vendor/petgraph/src/macros.rs @@ -0,0 +1,108 @@ +macro_rules! clone_fields { + ($name:ident, $($field:ident),+ $(,)*) => ( + fn clone(&self) -> Self { + $name { + $( + $field : self . $field .clone() + ),* + } + } + ); +} + +macro_rules! iterator_wrap { + (impl () for + struct $name: ident <$($typarm:tt),*> where { $($bounds: tt)* } + item: $item: ty, + iter: $iter: ty, + ) => (); + ( + impl (Iterator $($rest:tt)*) for + $(#[$derive:meta])* + struct $name: ident <$($typarm:tt),*> where { $($bounds: tt)* } + item: $item: ty, + iter: $iter: ty, + ) => ( + // having complex iterator types is kind of the point of this macro + #[allow(clippy::type_complexity)] + $(#[$derive])* + pub struct $name <$($typarm),*> where $($bounds)* { + iter: $iter, + } + impl<$($typarm),*> Iterator for $name <$($typarm),*> + where $($bounds)* + { + type Item = $item; + #[inline] + fn next(&mut self) -> Option<Self::Item> { + self.iter.next() + } + + #[inline] + fn size_hint(&self) -> (usize, Option<usize>) { + self.iter.size_hint() + } + } + iterator_wrap!( + impl ($($rest)*) for + struct $name <$($typarm),*> where { $($bounds)* } + item: $item, + iter: $iter, + ); + ); + + ( +impl (ExactSizeIterator $($rest:tt)*) for + $(#[$derive:meta])* + struct $name: ident <$($typarm:tt),*> where { $($bounds: tt)* } + item: $item: ty, + iter: $iter: ty, + ) => ( + impl<$($typarm),*> ExactSizeIterator for $name <$($typarm),*> + where $($bounds)* + { + #[inline] + fn len(&self) -> usize { + self.iter.len() + } + } + iterator_wrap!( + impl ($($rest)*) for + $(#[$derive])* + struct $name <$($typarm),*> where { $($bounds)* } + item: $item, + iter: $iter, + ); + ); + + ( +impl (DoubleEndedIterator $($rest:tt)*) for + $(#[$derive:meta])* + struct $name: ident <$($typarm:tt),*> where { $($bounds: tt)* } + item: $item: ty, + iter: $iter: ty, + ) => ( + impl<$($typarm),*> DoubleEndedIterator for $name <$($typarm),*> + where $($bounds)* + { + fn next_back(&mut self) -> Option<Self::Item> { + self.iter.next_back() + } + fn rfold<B, F>(self, accum: B, f: F) -> B + where + F: FnMut(B, Self::Item) -> B, + { self.iter.rfold(accum, f) } + fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item> + where + P: FnMut(&Self::Item) -> bool, + { self.iter.rfind(predicate) } + } + iterator_wrap!( + impl ($($rest)*) for + $(#[$derive])* + struct $name <$($typarm),*> where { $($bounds)* } + item: $item, + iter: $iter, + ); + ); +} |
