use std::ptr;
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: ptr::null_mut(),
prev: 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 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) {
if self.is_empty() { return; }
unsafe {
(*self.prev).next = self.next;
(*self.next).prev = self.prev;
}
}
}
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
)
}
}