Improve list by adding iterator trait
This commit is contained in:
parent
bd0b6e17a5
commit
fd6b22a2f3
@ -77,7 +77,7 @@ impl<T> DoublyLinkedList<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Remove the item at the end of the list
|
/// Retrieve and remove the item at the end of the list
|
||||||
pub fn pop_back(&mut self) -> Option<T> {
|
pub fn pop_back(&mut self) -> Option<T> {
|
||||||
self.tail.take().map(|prev_tail| {
|
self.tail.take().map(|prev_tail| {
|
||||||
self.size -= 1;
|
self.size -= 1;
|
||||||
@ -94,7 +94,7 @@ impl<T> DoublyLinkedList<T> {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Remove the item at the start of the list
|
/// Retrieve and remove the item at the start of the list
|
||||||
pub fn pop_front(&mut self) -> Option<T> {
|
pub fn pop_front(&mut self) -> Option<T> {
|
||||||
self.head.take().map(|prev_head| {
|
self.head.take().map(|prev_head| {
|
||||||
self.size -= 1;
|
self.size -= 1;
|
||||||
@ -124,6 +124,43 @@ impl<T> Drop for DoublyLinkedList<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<T> IntoIterator for DoublyLinkedList<T> {
|
||||||
|
type Item = <ListIterator<T> as Iterator>::Item;
|
||||||
|
|
||||||
|
type IntoIter = ListIterator<T>;
|
||||||
|
|
||||||
|
fn into_iter(self) -> Self::IntoIter {
|
||||||
|
Self::IntoIter::new(self)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ListIterator<T> {
|
||||||
|
list: DoublyLinkedList<T>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> ListIterator<T> {
|
||||||
|
fn new(list: DoublyLinkedList<T>) -> Self {
|
||||||
|
Self { list }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Iterator for ListIterator<T> {
|
||||||
|
type Item = T;
|
||||||
|
|
||||||
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
|
self.list.pop_front()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> DoubleEndedIterator for ListIterator<T> {
|
||||||
|
fn next_back(&mut self) -> Option<Self::Item> {
|
||||||
|
self.list.pop_back()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub type List<T> = DoublyLinkedList<T>;
|
||||||
|
pub type ListInt = List<i32>;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
|
|
||||||
@ -138,5 +175,4 @@ mod test {
|
|||||||
assert_eq!(list.pop_front().unwrap(), 5);
|
assert_eq!(list.pop_front().unwrap(), 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user