pub struct List {
pub next: *mut List,
pub prev: *mut List,
}
impl List {
pub fn new() -> Box<Self> {
let mut node = Box::new(List {
next: std::ptr::null_mut(),
prev: std::ptr::null_mut(),
});
node.init();
node
}
pub fn init(&mut self) {
self.next = self;
self.prev = self;
}
pub fn is_empty(&mut self) -> bool {
self.next == self as *mut List &&
self.prev == self as *mut List
}
pub fn next(&mut self) -> &mut List {
unsafe {
&mut *(self.next)
}
}
pub fn prev(&mut self) -> &mut List {
unsafe {
&mut *(self.prev)
}
}
pub fn append(&mut self, node: &mut List) {
node.next = self;
node.prev = self.prev;
unsafe { (*self.prev).next = node; }
self.prev = node;
}
pub fn prepend(&mut self, node: &mut List) {
node.prev = self;
node.next = self.next;
unsafe { (*self.next).prev = node; }
self.next = node;
}
pub fn delete(&mut self) -> *mut Self {
if self.is_empty() {
return std::ptr::null_mut();
}
unsafe {
(*self.prev).next = self.next;
(*self.next).prev = self.prev;
}
self
}
}
use std::fmt;
impl fmt::Display for List {
fn fmt(&self, f: &mut fmt::Formatter)
-> fmt::Result {
write!(
f,
"[{:p}] [{:p}] [{:p}]",
self, self.next, self.prev
)
}
}