summaryrefslogtreecommitdiff
path: root/vendor/petgraph/src/macros.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/petgraph/src/macros.rs')
-rw-r--r--vendor/petgraph/src/macros.rs108
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,
+ );
+ );
+}