1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
use crate::{node::LinkedListNode, prelude::LinkedList};
use orx_imp_vec::prelude::PinnedVec;
use std::iter::FusedIterator;
impl<'a, T, P> LinkedList<'a, T, P>
where
P: PinnedVec<LinkedListNode<'a, T>> + 'a,
T: 'a,
{
/// Provides a forward iterator.
///
/// # Examples
///
/// ```
/// use orx_linked_list::prelude::*;
///
/// let mut list = LinkedList::with_linear_growth(4);
///
/// list.push_back(1);
/// list.push_back(2);
/// list.push_front(0);
/// list.push_back(3);
///
/// let mut iter = list.iter();
/// assert_eq!(iter.next(), Some(&0));
/// assert_eq!(iter.next(), Some(&1));
/// assert_eq!(iter.next(), Some(&2));
/// assert_eq!(iter.next(), Some(&3));
/// assert_eq!(iter.next(), None);
/// ```
pub fn iter<'b>(&self) -> Iter<'b, T>
where
'a: 'b,
{
Iter {
curr: self.imp[0].prev,
len: self.len,
}
}
}
/// An iterator over the elements of a `LinkedList`.
///
/// This struct is created by `LinkedList::iter()` method.
pub struct Iter<'b, T> {
curr: Option<&'b LinkedListNode<'b, T>>,
len: usize,
}
impl<'b, T> Iterator for Iter<'b, T> {
type Item = &'b T;
fn next(&mut self) -> Option<Self::Item> {
if let Some(curr_node) = self.curr {
self.curr = curr_node.next;
self.len -= 1;
curr_node.data.as_ref()
} else {
None
}
}
}
impl<T> FusedIterator for Iter<'_, T> {}
impl<T> ExactSizeIterator for Iter<'_, T> {
fn len(&self) -> usize {
self.len
}
}