Prepare to remove P type parameter of punctuated::IntoIter
diff --git a/src/punctuated.rs b/src/punctuated.rs
index e9a47c3..5aa519f 100644
--- a/src/punctuated.rs
+++ b/src/punctuated.rs
@@ -25,6 +25,7 @@
#[cfg(any(feature = "full", feature = "derive"))]
use std::iter;
use std::iter::FromIterator;
+use std::marker::PhantomData;
use std::ops::{Index, IndexMut};
use std::option;
use std::slice;
@@ -413,9 +414,13 @@
type IntoIter = IntoIter<T, P>;
fn into_iter(self) -> Self::IntoIter {
+ let mut elements = Vec::with_capacity(self.len());
+ elements.extend(self.inner.into_iter().map(|pair| pair.0));
+ elements.extend(self.last.map(|t| *t));
+
IntoIter {
- inner: self.inner.into_iter(),
- last: self.last.map(|t| *t).into_iter(),
+ inner: elements.into_iter(),
+ marker: PhantomData,
}
}
}
@@ -543,24 +548,23 @@
/// [module documentation]: index.html
#[derive(Clone)]
pub struct IntoIter<T, P> {
- inner: vec::IntoIter<(T, P)>,
- last: option::IntoIter<T>,
+ inner: vec::IntoIter<T>,
+
+ // TODO: remove P type parameter in the next breaking change
+ marker: PhantomData<P>,
}
impl<T, P> Iterator for IntoIter<T, P> {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
- self.inner
- .next()
- .map(|pair| pair.0)
- .or_else(|| self.last.next())
+ self.inner.next()
}
}
impl<T, P> ExactSizeIterator for IntoIter<T, P> {
fn len(&self) -> usize {
- self.inner.len() + self.last.len()
+ self.inner.len()
}
}