algo_rs/data_structure/queue/
fixed_queue.rs1use crate::data_structure::queue::Queue;
2
3pub struct FixedQueue<T: Default> {
4 inner: Vec<T>,
5 head: usize,
6 tail: usize,
7 size: usize,
8}
9
10impl<T: Default> FixedQueue<T> {
11 pub fn new(size: usize) -> Self {
12 Self {
13 head: 0,
14 tail: 0,
15 size: 0,
16 inner: Vec::<T>::with_capacity(size),
17 }
18 }
19}
20
21impl<T: Default> Queue<T> for FixedQueue<T> {
22 fn push_back(&mut self, item: T) {
23 if self.size == self.inner.capacity() {
24 panic!("queue is full")
25 }
26
27 if self.inner.len() < self.inner.capacity() {
28 self.inner.push(item);
29 } else {
30 self.inner[self.head] = item;
31 }
32
33 self.size += 1;
34 self.head += 1;
35
36 if self.head == self.inner.capacity() {
37 self.head = 0;
38 }
39 }
40
41 fn pop_front(&mut self) -> Option<T> {
42 if self.size == 0 {
43 return None;
44 }
45
46 let result = std::mem::take(&mut self.inner[self.tail]);
47 self.tail += 1;
48
49 if self.tail == self.inner.capacity() {
50 self.tail = 0;
51 }
52
53 self.size -= 1;
54
55 Some(result)
56 }
57
58 fn front(&self) -> Option<&T> {
59 if self.size == 0 {
60 return None;
61 }
62
63 Some(&self.inner[self.tail])
64 }
65
66 fn is_empty(&self) -> bool {
67 self.size == 0
68 }
69}
70
71#[cfg(test)]
72mod tests {
73 use crate::data_structure::queue::fixed_queue::FixedQueue;
74 use crate::data_structure::queue::Queue;
75
76 extern crate test;
77 use std::collections::VecDeque;
78 use test::Bencher;
79
80 #[test]
81 fn test_push_pop() {
82 let mut queue = FixedQueue::<i32>::new(10);
83 for i in 0..33 {
84 queue.push_back(i);
85 queue.push_back(i + 1);
86 queue.push_back(i + 2);
87 assert_eq!(Some(i), queue.pop_front());
88 assert_eq!(Some(i + 1), queue.pop_front());
89 assert_eq!(Some(i + 2), queue.pop_front());
90 assert_eq!(None, queue.pop_front());
91 }
92 }
93
94 #[test]
95 fn test_is_empty() {
96 let mut queue = FixedQueue::<i32>::new(10);
97 assert_eq!(true, queue.is_empty());
98 queue.push_back(1);
99 assert_eq!(false, queue.is_empty());
100 queue.pop_front();
101 assert_eq!(true, queue.is_empty());
102 }
103
104 #[test]
105 fn test_front() {
106 let mut queue = FixedQueue::<i32>::new(10);
107 assert_eq!(None, queue.front());
108 queue.push_back(1);
109 assert_eq!(1, *queue.front().unwrap());
110 queue.push_back(2);
111 assert_eq!(1, *queue.front().unwrap());
112 queue.pop_front();
113 assert_eq!(2, *queue.front().unwrap());
114 queue.pop_front();
115 assert_eq!(None, queue.front());
116 }
117
118 #[test]
119 #[should_panic(expected = "queue is full")]
120 fn test_panic_when_full() {
121 let mut queue = FixedQueue::new(0);
122 queue.push_back(1);
123 }
124
125 #[bench]
126 fn bench_push_pop(b: &mut Bencher) {
127 b.iter(|| {
128 let mut queue = FixedQueue::<i32>::new(20);
129 for i in 0..10000 {
130 for _ in 0..10 {
131 queue.push_back(i);
132 }
133
134 for _ in 0..10 {
135 queue.pop_front();
136 }
137 }
138 });
139 }
140
141 #[bench]
142 fn bench_rust_std_veq_deque_push_pop(b: &mut Bencher) {
143 b.iter(|| {
144 let mut queue = VecDeque::<i32>::with_capacity(20);
145 for i in 0..10000 {
146 for _ in 0..10 {
147 queue.push_back(i);
148 }
149
150 for _ in 0..10 {
151 queue.pop_front();
152 }
153 }
154 });
155 }
156}