|
|
@@ -162,11 +162,48 @@ impl<T> Drop for List<T> {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+pub struct IntoIter<T>(List<T>);
|
|
|
+
|
|
|
+impl<T> List<T> {
|
|
|
+ pub fn into_iter(self) -> IntoIter<T> {
|
|
|
+ IntoIter(self)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+impl<T> Iterator for IntoIter<T> {
|
|
|
+ type Item = T;
|
|
|
+
|
|
|
+ fn next(&mut self) -> Option<Self::Item> {
|
|
|
+ self.0.pop_front()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+impl<T> DoubleEndedIterator for IntoIter<T> {
|
|
|
+ fn next_back(&mut self) -> Option<Self::Item> {
|
|
|
+ self.0.pop_back()
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
#[cfg(test)]
|
|
|
mod test {
|
|
|
use super::List;
|
|
|
|
|
|
#[test]
|
|
|
+ fn into_iter() {
|
|
|
+ let mut list = List::new();
|
|
|
+ list.push_front(1);
|
|
|
+ list.push_front(2);
|
|
|
+ list.push_front(3);
|
|
|
+
|
|
|
+ let mut iter = list.into_iter();
|
|
|
+ assert_eq!(iter.next(), Some(3));
|
|
|
+ assert_eq!(iter.next_back(), Some(1));
|
|
|
+ assert_eq!(iter.next(), Some(2));
|
|
|
+ assert_eq!(iter.next_back(), None);
|
|
|
+ assert_eq!(iter.next(), None);
|
|
|
+ }
|
|
|
+
|
|
|
+ #[test]
|
|
|
fn basics() {
|
|
|
let mut list = List::new();
|
|
|
|