use core::iter::{DoubleEndedIterator, FusedIterator};
use crate::listindex::ListIndex;
use crate::listnode::ListNode;
pub struct ListIterMut<'a, T> {
pub(crate) elems: *mut Option<T>,
pub(crate) nodes: &'a [ListNode],
pub(crate) start: ListIndex,
pub(crate) end: ListIndex,
pub(crate) len: usize,
}
impl<T> ListIterMut<'_, T> {
#[inline]
fn set_empty(&mut self) {
self.start = ListIndex::new();
self.end = ListIndex::new();
self.len = 0;
}
}
impl<'a, T: 'a> Iterator for ListIterMut<'a, T> {
type Item = &'a mut T;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
let idx = self.start.get()?;
let elem_ptr = unsafe { self.elems.add(idx) };
if self.start == self.end {
self.set_empty();
} else {
self.start = self.nodes[idx].next;
self.len -= 1;
}
Some(unsafe { &mut *elem_ptr }.as_mut().unwrap())
}
#[inline]
fn size_hint(&self) -> (usize, Option<usize>) {
(self.len, Some(self.len))
}
}
impl<'a, T: 'a> FusedIterator for ListIterMut<'a, T> {}
impl<'a, T: 'a> ExactSizeIterator for ListIterMut<'a, T> {}
impl<'a, T: 'a> DoubleEndedIterator for ListIterMut<'a, T> {
fn next_back(&mut self) -> Option<Self::Item> {
let idx = self.end.get()?;
let elem_ptr = unsafe { self.elems.add(idx) };
if self.start == self.end {
self.set_empty();
} else {
self.end = self.nodes[idx].prev;
self.len -= 1;
}
Some(unsafe { &mut *elem_ptr }.as_mut().unwrap())
}
}