1#[derive(Debug)]
2pub struct Queue<T> {
3 older: Vec<T>,
4 newer: Vec<T>,
5 is_circle: bool,
6}
7
8impl<T> Queue<T> {
9 pub fn new() -> Queue<T> {
10 Self {
11 newer: Vec::new(),
12 older: Vec::new(),
13 is_circle: false,
14 }
15 }
16
17 pub fn enable_circle(&mut self) {
18 self.is_circle = true;
19 }
20
21 pub fn push(&mut self, c: T) {
22 self.newer.push(c);
23 }
24
25 pub fn pop(&mut self) -> Option<T> {
26 if self.is_circle {
27 if self.older.is_empty() {
28 if self.newer.is_empty() {
29 return None;
30 }
31 use std::mem::swap;
34 swap(&mut self.older, &mut self.newer);
35 self.older.reverse(); }
37 return self.older.pop();
38 }
39 return self.newer.pop();
40 }
41
42 pub fn is_empty(&self) -> bool {
43 if self.is_circle { self.older.is_empty() && self.newer.is_empty() } else { self.newer.is_empty() }
44 }
45
46 pub fn len(&mut self) -> usize {
47 self.newer.len()
48 }
49}