Skip to content

Commit dd2a49c

Browse files
authored
Merge pull request #13 from TonalidadeHidrica/feature/internal_queue
Add internal_queue
2 parents 54a54fd + 0859129 commit dd2a49c

File tree

1 file changed

+103
-0
lines changed

1 file changed

+103
-0
lines changed

src/internal_queue.rs

+103
Original file line numberDiff line numberDiff line change
@@ -1 +1,104 @@
1+
#![allow(dead_code)]
12

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

0 commit comments

Comments
 (0)