1use alloc::format;
2use alloc::vec;
3use alloc::vec::Vec;
4
5#[derive(Debug)]
7pub struct Queue<T> {
8 data: Vec<T>,
10 head: usize,
12 tail: usize,
14 len: usize,
16}
17
18impl<T: Clone + Default> Queue<T> {
19 pub fn new(length: usize) -> Self {
29 let data = vec![T::default(); length];
30 Self {
31 data,
32 head: 0,
33 tail: 0,
34 len: length,
35 }
36 }
37
38 pub fn is_empty(&self) -> bool {
48 self.head == self.tail
49 }
50
51 pub fn en_queue(&mut self, element: T) -> anyhow::Result<()> {
64 if self.head == (self.tail + 1) % self.len {
65 return Err(anyhow::anyhow!("overflow"));
66 }
67 if let Some(value) = self.data.get_mut(self.tail) {
68 *value = element;
69 } else {
70 return Err(anyhow::anyhow!(format!(
71 "get index of {} element",
72 self.tail
73 )));
74 }
75
76 if self.tail == (self.len - 1) {
77 self.tail = 0;
78 } else {
79 self.tail += 1;
80 }
81
82 Ok(())
83 }
84
85 pub fn de_queue(&mut self) -> anyhow::Result<T> {
101 if self.is_empty() {
102 return Err(anyhow::anyhow!("underflow"));
103 }
104 let element = self.data.get(self.head);
105 if self.head == (self.len - 1) {
106 self.head = 0;
107 } else {
108 self.head += 1;
109 }
110 Ok(element.unwrap().clone())
111 }
112}
113
114#[cfg(test)]
115mod tests {
116 use super::*;
117
118 fn process_result<T>(result: Result<T, anyhow::Error>) {
119 match result {
120 Ok(_value) => {}
121 Err(err) => {
122 if err.to_string() == *"overflow" {
123 assert_eq!(err.to_string(), "overflow".to_string());
124 } else if err.to_string() == *"underflow" {
125 assert_eq!(err.to_string(), "underflow".to_string());
126 }
127 }
128 }
129 }
130
131 #[test]
132 fn test_is_empty_queue() {
133 let empty_queue = Queue::<i32>::new(3);
134 assert!(empty_queue.is_empty());
135 }
136
137 #[test]
138 fn test_is_enqueue_success() {
139 let mut queue = Queue::<i32>::new(3);
140 let ret = queue.en_queue(1);
141 process_result(ret);
142 let ret = queue.en_queue(2);
143 process_result(ret);
144 }
145
146 #[test]
147 fn test_is_enqueue_overflow() {
148 let mut queue = Queue::<i32>::new(3);
149 let ret = queue.en_queue(1);
150 process_result(ret);
151 let ret = queue.en_queue(2);
152 process_result(ret);
153 let ret = queue.en_queue(3);
154 process_result(ret);
155 }
156
157 #[test]
158 fn test_is_dequeue_success() {
159 let mut queue = Queue::<i32>::new(3);
160 let ret = queue.en_queue(1);
161 process_result(ret);
162 let ret = queue.en_queue(2);
163 process_result(ret);
164 let ret = queue.de_queue();
165 process_result(ret);
166 let ret = queue.de_queue();
167 process_result(ret);
168 let ret = queue.en_queue(4);
169 process_result(ret);
170 let ret = queue.de_queue();
171 process_result(ret);
172 let ret = queue.en_queue(5);
173 process_result(ret);
174 let ret = queue.en_queue(6);
175 process_result(ret);
176 let ret = queue.de_queue();
177 process_result(ret);
178 let ret = queue.de_queue();
179 process_result(ret);
180 let ret = queue.en_queue(7);
181 process_result(ret);
182 let ret = queue.en_queue(8);
183 process_result(ret);
184 }
185}