use crate::data_structures::node::Node;
pub struct Queue<T> {
front: Option<Box<Node<T>>>,
rear: *mut Node<T>,
size: usize,
}
impl<T> Queue<T> {
pub fn new() -> Self {
Queue {
front: None,
rear: std::ptr::null_mut(),
size: 0,
}
}
pub fn enqueue(&mut self, value: T) {
let new_node = Box::new(
Node::new(
value,
None
)
);
let new_node_ptr: *mut Node<T> = Box::into_raw(new_node);
if self.rear.is_null() {
self.front = unsafe {
Some(Box::from_raw(new_node_ptr))
};
self.rear = new_node_ptr
} else {
unsafe {
(*self.rear).next = Some(Box::from_raw(new_node_ptr));
self.rear = new_node_ptr
}
}
self.size += 1;
}
pub fn dequeue(&mut self) -> Option<T> {
if self.front.is_none() {
return None;
}
let old_front = self.front.take().unwrap();
self.front = old_front.next;
if self.front.is_none() {
self.rear = std::ptr::null_mut();
}
self.size -= 1;
Some(old_front.value)
}
pub fn peek(&self) -> Option<&T> {
self.front.as_ref().map(|node| &node.value)
}
pub fn is_empty(&self) -> bool {
self.size == 0
}
pub fn size(&self) -> usize {
self.size
}
}