rcmd_core/
queue.rs

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                // Bring the elements in younger over to older, and put them in
32                // the promised order.
33                use std::mem::swap;
34                swap(&mut self.older, &mut self.newer);
35                self.older.reverse(); //为什么要颠倒一下呢? 因为push/pop是栈操作,和队列顺序正相反
36            }
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}