#[cfg(test)]
mod tests;
#[derive(Clone, Debug)]
pub struct Queue<T> {
vec: Vec<T>,
cap: Option<usize>,
}
impl<T: Clone> Queue<T> {
pub fn new() -> Queue<T> {
Queue {
vec: Vec::new(),
cap: None,
}
}
pub fn with_capacity(cap: usize) -> Queue<T> {
Queue {
vec: Vec::with_capacity(cap),
cap: Some(cap),
}
}
pub fn queue(&mut self, item: T) -> Result<usize, ()> {
if let Some(cap) = self.cap {
if self.vec.len() >= cap {
Err(())
} else {
self.vec.push(item);
Ok(self.vec.len())
}
} else {
self.vec.push(item);
Ok(self.vec.len())
}
}
pub fn dequeue(&mut self) -> Option<T> {
if self.vec.len() > 0 {
Some(self.vec.remove(0))
} else {
None
}
}
pub fn peek(&self) -> Option<T> {
if self.vec.len() > 0 {
Some(self.vec[0].clone())
} else {
None
}
}
pub fn len(&self) -> usize {
self.vec.len()
}
pub fn capacity(&self) -> Option<usize> {
self.cap
}
pub fn set_capacity<C: Into<Option<usize>>>(&mut self, cap: C) -> Result<(), ()> {
let cap = cap.into();
if cap == None {
self.cap = None;
return Ok(());
}
if cap == self.cap {
return Ok(());
}
let cap = cap.unwrap();
if cap < self.vec.len() {
return Err(());
}
if let Some(scap) = self.cap {
if cap < scap {
self.vec.shrink_to_fit();
}
}
let r = cap - self.vec.len();
self.vec.reserve_exact(r);
self.cap = Some(cap);
Ok(())
}
}