use super::QueueError;
#[derive(Clone, Debug)]
pub struct SortedQueue<T>
where
T: Ord,
{
items: Vec<T>,
max_size: Option<usize>,
reverse: bool,
}
impl<T> SortedQueue<T>
where
T: Ord,
{
pub fn new(reverse: bool) -> Self {
Self { items: vec![], max_size: None, reverse }
}
pub fn new_sized(size: usize, reverse: bool) -> Self {
Self { items: vec![], max_size: Some(size), reverse }
}
pub fn clear(&mut self) {
self.items = vec![];
}
pub fn len(&self) -> usize {
self.items.len()
}
pub fn is_full(&self) -> bool {
if let Some(max_size) = self.max_size {
return self.len() >= max_size;
}
false
}
pub fn is_reversed(&self) -> bool {
self.reverse
}
pub fn add(&mut self, item: T) {
let mut low = 0;
let mut high = self.len();
while low < high {
let mid = (low + high) / 2;
if (self.items[mid] > item)^self.reverse { low = mid + 1;
} else {
high = mid;
}
}
self.items.insert(low, item);
}
pub fn try_add(&mut self, item: T) -> Result<(), QueueError> {
if self.is_full() {
Err(QueueError::Full)
} else {
self.add(item);
Ok(())
}
}
pub fn pop(&mut self) -> Option<T> {
self.items.pop()
}
pub fn first(&self) -> Option<&T> {
self.items.last()
}
}
impl<T> Iterator for SortedQueue<T> where T: Ord {
type Item = T;
fn next(&mut self) -> Option<Self::Item> {
self.pop()
}
}