queued_rust/queues/
sorted.rs1use super::QueueError;
2
3#[derive(Clone, Debug)]
5pub struct SortedQueue<T>
6where
7 T: Ord,
8{
9 items: Vec<T>,
10 max_size: Option<usize>,
11 reverse: bool,
12}
13
14impl<T> SortedQueue<T>
15where
16 T: Ord,
17{
18 pub fn new(reverse: bool) -> Self {
20 Self { items: vec![], max_size: None, reverse }
21 }
22 pub fn new_sized(size: usize, reverse: bool) -> Self {
24 Self { items: vec![], max_size: Some(size), reverse }
25 }
26
27 pub fn clear(&mut self) {
29 self.items = vec![];
30 }
31 pub fn len(&self) -> usize {
33 self.items.len()
34 }
35 pub fn is_full(&self) -> bool {
37 if let Some(max_size) = self.max_size {
38 return self.len() >= max_size;
39 }
40 false
41 }
42 pub fn is_reversed(&self) -> bool {
44 self.reverse
45 }
46
47 pub fn add(&mut self, item: T) {
51 let mut low = 0;
52 let mut high = self.len();
53
54 while low < high {
55 let mid = (low + high) / 2;
56
57
58 if (self.items[mid] > item)^self.reverse { low = mid + 1;
60 } else {
61 high = mid;
62 }
63 }
64
65 self.items.insert(low, item);
66 }
67
68 pub fn try_add(&mut self, item: T) -> Result<(), QueueError> {
72 if self.is_full() {
73 Err(QueueError::Full)
74 } else {
75 self.add(item);
76 Ok(())
77 }
78 }
79
80 pub fn pop(&mut self) -> Option<T> {
82 self.items.pop()
83 }
84
85 pub fn first(&self) -> Option<&T> {
87 self.items.last()
88 }
89}
90
91impl<T> Iterator for SortedQueue<T> where T: Ord {
92 type Item = T;
93
94 fn next(&mut self) -> Option<Self::Item> {
95 self.pop()
96 }
97}