use {
crate::{CircularList, list::node::Node},
core::ptr::NonNull,
};
pub struct Cursor<'c, T> {
list: &'c CircularList<T>,
current: NonNull<Node<T>>,
index: usize,
}
impl<'c, T> Cursor<'c, T> {
pub(super) fn from_list(list: &'c CircularList<T>) -> Option<Self> {
list.head.map(|h| Self {
list,
current: h,
index: 0,
})
}
}
impl<'c, T> Cursor<'c, T> {
pub fn index(&self) -> usize {
self.index
}
pub fn move_next(&mut self) {
unsafe {
self.current = (*self.current.as_ptr()).next;
}
self.index = (self.index + 1) % self.list.len();
}
pub fn move_prev(&mut self) {
unsafe {
self.current = (*self.current.as_ptr()).prev;
}
let len = self.list.len();
self.index = (len + self.index - 1) % len;
}
pub fn current(&self) -> &'c T {
unsafe { &(*self.current.as_ptr()).value }
}
pub fn peek_next(&self) -> &'c T {
unsafe {
let next = (*self.current.as_ptr()).next;
&(*next.as_ptr()).value
}
}
pub fn peek_prev(&self) -> &'c T {
unsafe {
let prev = (*self.current.as_ptr()).prev;
&(*prev.as_ptr()).value
}
}
}
pub struct CursorMut<'c, T> {
list: &'c mut CircularList<T>,
current: NonNull<Node<T>>,
index: usize,
}
impl<'c, T> CursorMut<'c, T> {
pub(super) fn from_list(list: &'c mut CircularList<T>) -> Option<Self> {
list.head.map(|h| Self {
list,
current: h,
index: 0,
})
}
}
impl<'c, T> CursorMut<'c, T> {
pub fn index(&self) -> usize {
self.index
}
pub fn move_next(&mut self) {
unsafe {
self.current = (*self.current.as_ptr()).next;
}
self.index = (self.index + 1) % self.list.len();
}
pub fn move_prev(&mut self) {
unsafe {
self.current = (*self.current.as_ptr()).prev;
}
let len = self.list.len();
self.index = (len + self.index - 1) % len;
}
pub fn current(&mut self) -> &'c mut T {
unsafe { &mut (*self.current.as_ptr()).value }
}
pub fn peek_next(&self) -> &'c T {
unsafe {
let next = (*self.current.as_ptr()).next;
&(*next.as_ptr()).value
}
}
pub fn peek_prev(&self) -> &'c T {
unsafe {
let prev = (*self.current.as_ptr()).prev;
&(*prev.as_ptr()).value
}
}
}