-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy pathinternal_queue.rs
104 lines (83 loc) · 2.38 KB
/
internal_queue.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#![allow(dead_code)]
#[derive(Default)]
pub(crate) struct SimpleQueue<T> {
payload: Vec<T>,
pos: usize,
}
impl<T> SimpleQueue<T> {
pub(crate) fn reserve(&mut self, n: usize) {
if n > self.payload.len() {
self.payload.reserve(n - self.payload.len());
}
}
pub(crate) fn size(&self) -> usize {
self.payload.len() - self.pos
}
pub(crate) fn empty(&self) -> bool {
self.pos == self.payload.len()
}
pub(crate) fn push(&mut self, t: T) {
self.payload.push(t);
}
// Do we need mutable version?
pub(crate) fn front(&self) -> Option<&T> {
if self.pos < self.payload.len() {
Some(&self.payload[self.pos])
} else {
None
}
}
pub(crate) fn clear(&mut self) {
self.payload.clear();
self.pos = 0;
}
pub(crate) fn pop(&mut self) -> Option<&T> {
if self.pos < self.payload.len() {
self.pos += 1;
Some(&self.payload[self.pos - 1])
} else {
None
}
}
}
#[cfg(test)]
mod test {
use super::SimpleQueue;
#[allow(clippy::cognitive_complexity)]
#[test]
fn test_simple_queue() {
let mut queue = SimpleQueue::default();
assert_eq!(queue.size(), 0);
assert!(queue.empty());
assert!(queue.front().is_none());
assert!(queue.pop().is_none());
queue.push(123);
assert_eq!(queue.size(), 1);
assert!(!queue.empty());
assert_eq!(queue.front(), Some(&123));
queue.push(456);
assert_eq!(queue.size(), 2);
assert!(!queue.empty());
assert_eq!(queue.front(), Some(&123));
assert_eq!(queue.pop(), Some(&123));
assert_eq!(queue.size(), 1);
assert!(!queue.empty());
assert_eq!(queue.front(), Some(&456));
queue.push(789);
queue.push(789);
queue.push(456);
queue.push(456);
assert_eq!(queue.size(), 5);
assert!(!queue.empty());
assert_eq!(queue.front(), Some(&456));
assert_eq!(queue.pop(), Some(&456));
assert_eq!(queue.size(), 4);
assert!(!queue.empty());
assert_eq!(queue.front(), Some(&789));
queue.clear();
assert_eq!(queue.size(), 0);
assert!(queue.empty());
assert!(queue.front().is_none());
assert!(queue.pop().is_none());
}
}