Implement ExactSizeIterator for Punctuated iterators
diff --git a/src/punctuated.rs b/src/punctuated.rs
index ac6492a..25bcfc3 100644
--- a/src/punctuated.rs
+++ b/src/punctuated.rs
@@ -361,6 +361,12 @@
}
}
+impl<'a, T, P> ExactSizeIterator for Pairs<'a, T, P> {
+ fn len(&self) -> usize {
+ self.inner.len() + self.last.len()
+ }
+}
+
/// An iterator over mutably borrowed pairs of type `Pair<&mut T, &mut P>`.
///
/// Refer to the [module documentation] for details about punctuated sequences.
@@ -382,6 +388,12 @@
}
}
+impl<'a, T, P> ExactSizeIterator for PairsMut<'a, T, P> {
+ fn len(&self) -> usize {
+ self.inner.len() + self.last.len()
+ }
+}
+
/// An iterator over owned pairs of type `Pair<T, P>`.
///
/// Refer to the [module documentation] for details about punctuated sequences.
@@ -403,6 +415,12 @@
}
}
+impl<T, P> ExactSizeIterator for IntoPairs<T, P> {
+ fn len(&self) -> usize {
+ self.inner.len() + self.last.len()
+ }
+}
+
/// An iterator over owned values of type `T`.
///
/// Refer to the [module documentation] for details about punctuated sequences.
@@ -424,13 +442,19 @@
}
}
+impl<T, P> ExactSizeIterator for IntoIter<T, P> {
+ fn len(&self) -> usize {
+ self.inner.len() + self.last.len()
+ }
+}
+
/// An iterator over borrowed values of type `&T`.
///
/// Refer to the [module documentation] for details about punctuated sequences.
///
/// [module documentation]: index.html
pub struct Iter<'a, T: 'a> {
- inner: Box<Iterator<Item = &'a T> + 'a>,
+ inner: Box<ExactSizeIterator<Item = &'a T> + 'a>,
}
struct PrivateIter<'a, T: 'a, P: 'a> {
@@ -457,6 +481,12 @@
}
}
+impl<'a, T> ExactSizeIterator for Iter<'a, T> {
+ fn len(&self) -> usize {
+ self.inner.len()
+ }
+}
+
impl<'a, T, P> Iterator for PrivateIter<'a, T, P> {
type Item = &'a T;
@@ -468,13 +498,19 @@
}
}
+impl<'a, T, P> ExactSizeIterator for PrivateIter<'a, T, P> {
+ fn len(&self) -> usize {
+ self.inner.len() + self.last.len()
+ }
+}
+
/// An iterator over mutably borrowed values of type `&mut T`.
///
/// Refer to the [module documentation] for details about punctuated sequences.
///
/// [module documentation]: index.html
pub struct IterMut<'a, T: 'a> {
- inner: Box<Iterator<Item = &'a mut T> + 'a>,
+ inner: Box<ExactSizeIterator<Item = &'a mut T> + 'a>,
}
struct PrivateIterMut<'a, T: 'a, P: 'a> {
@@ -490,6 +526,12 @@
}
}
+impl<'a, T> ExactSizeIterator for IterMut<'a, T> {
+ fn len(&self) -> usize {
+ self.inner.len()
+ }
+}
+
impl<'a, T, P> Iterator for PrivateIterMut<'a, T, P> {
type Item = &'a mut T;
@@ -501,6 +543,12 @@
}
}
+impl<'a, T, P> ExactSizeIterator for PrivateIterMut<'a, T, P> {
+ fn len(&self) -> usize {
+ self.inner.len() + self.last.len()
+ }
+}
+
/// A single syntax tree node of type `T` followed by its trailing punctuation
/// of type `P` if any.
///