graph_collections/queue.rs
1use std::collections::VecDeque;
2
3/// A FIFO queue backed by [`VecDeque`].
4///
5/// Provides O(1) enqueue and dequeue operations. Iteration order is
6/// front-to-back (i.e. the next element to be dequeued comes first).
7///
8/// # Examples
9///
10/// ```
11/// use graph_collections::Queue;
12///
13/// let mut queue: Queue<u32> = Queue::new();
14/// queue.enqueue(1);
15/// queue.enqueue(2);
16/// queue.enqueue(3);
17///
18/// assert_eq!(queue.front(), Some(&1));
19/// assert_eq!(queue.dequeue(), Some(1));
20/// assert_eq!(queue.len(), 2);
21/// ```
22#[derive(Debug, Clone, PartialEq, Eq)]
23pub struct Queue<T> {
24 data: VecDeque<T>,
25}
26
27impl<T> Default for Queue<T> {
28 fn default() -> Self {
29 Self {
30 data: VecDeque::new(),
31 }
32 }
33}
34
35impl<T> Queue<T> {
36 /// Creates a new, empty queue.
37 ///
38 /// # Examples
39 ///
40 /// ```
41 /// use graph_collections::Queue;
42 ///
43 /// let queue: Queue<u32> = Queue::new();
44 /// assert!(queue.is_empty());
45 /// ```
46 pub fn new() -> Self {
47 Self::default()
48 }
49
50 /// Creates a new, empty queue with at least the given capacity
51 /// pre-allocated, avoiding reallocations for the first `capacity` pushes.
52 ///
53 /// # Examples
54 ///
55 /// ```
56 /// use graph_collections::Queue;
57 ///
58 /// let mut queue: Queue<u32> = Queue::with_capacity(16);
59 /// assert!(queue.is_empty());
60 /// ```
61 pub fn with_capacity(capacity: usize) -> Self {
62 Self {
63 data: VecDeque::with_capacity(capacity),
64 }
65 }
66}
67
68impl<T> Queue<T> {
69 /// Returns `true` if the queue contains no elements.
70 ///
71 /// # Examples
72 ///
73 /// ```
74 /// use graph_collections::Queue;
75 ///
76 /// let mut queue: Queue<u32> = Queue::new();
77 /// assert!(queue.is_empty());
78 /// queue.enqueue(1);
79 /// assert!(!queue.is_empty());
80 /// ```
81 #[inline]
82 pub fn is_empty(&self) -> bool {
83 self.data.is_empty()
84 }
85
86 /// Returns the number of elements in the queue.
87 ///
88 /// # Examples
89 ///
90 /// ```
91 /// use graph_collections::Queue;
92 ///
93 /// let mut queue: Queue<u32> = Queue::new();
94 /// assert_eq!(queue.len(), 0);
95 /// queue.enqueue(42);
96 /// assert_eq!(queue.len(), 1);
97 /// ```
98 #[must_use]
99 #[inline]
100 pub fn len(&self) -> usize {
101 self.data.len()
102 }
103
104 /// Returns a reference to the element at the **front** of the queue
105 /// (the next one to be dequeued), or `None` if the queue is empty.
106 ///
107 /// # Examples
108 ///
109 /// ```
110 /// use graph_collections::Queue;
111 ///
112 /// let mut queue: Queue<u32> = Queue::new();
113 /// assert_eq!(queue.front(), None);
114 /// queue.enqueue(1);
115 /// queue.enqueue(2);
116 /// assert_eq!(queue.front(), Some(&1));
117 /// ```
118 #[must_use]
119 #[inline]
120 pub fn front(&self) -> Option<&T> {
121 self.data.front()
122 }
123
124 /// Returns a reference to the element at the **back** of the queue
125 /// (the most recently enqueued one), or `None` if the queue is empty.
126 ///
127 /// # Examples
128 ///
129 /// ```
130 /// use graph_collections::Queue;
131 ///
132 /// let mut queue: Queue<u32> = Queue::new();
133 /// assert_eq!(queue.back(), None);
134 /// queue.enqueue(1);
135 /// queue.enqueue(2);
136 /// assert_eq!(queue.back(), Some(&2));
137 /// ```
138 #[must_use]
139 #[inline]
140 pub fn back(&self) -> Option<&T> {
141 self.data.back()
142 }
143
144 /// Adds `element` to the **back** of the queue.
145 ///
146 /// # Examples
147 ///
148 /// ```
149 /// use graph_collections::Queue;
150 ///
151 /// let mut queue: Queue<u32> = Queue::new();
152 /// queue.enqueue(1);
153 /// queue.enqueue(2);
154 /// assert_eq!(queue.front(), Some(&1));
155 /// assert_eq!(queue.back(), Some(&2));
156 /// ```
157 #[inline]
158 pub fn enqueue(&mut self, element: T) {
159 self.data.push_back(element);
160 }
161
162 /// Removes and returns the element at the **front** of the queue,
163 /// or `None` if the queue is empty.
164 ///
165 /// # Examples
166 ///
167 /// ```
168 /// use graph_collections::Queue;
169 ///
170 /// let mut queue: Queue<u32> = Queue::new();
171 /// assert_eq!(queue.dequeue(), None);
172 /// queue.enqueue(1);
173 /// queue.enqueue(2);
174 /// assert_eq!(queue.dequeue(), Some(1));
175 /// assert_eq!(queue.dequeue(), Some(2));
176 /// assert_eq!(queue.dequeue(), None);
177 /// ```
178 #[inline]
179 pub fn dequeue(&mut self) -> Option<T> {
180 self.data.pop_front()
181 }
182
183 /// Removes all elements from the queue.
184 ///
185 /// # Examples
186 ///
187 /// ```
188 /// use graph_collections::Queue;
189 ///
190 /// let mut queue: Queue<u32> = Queue::new();
191 /// queue.enqueue(1);
192 /// queue.enqueue(2);
193 /// queue.clear();
194 /// assert!(queue.is_empty());
195 /// ```
196 #[inline]
197 pub fn clear(&mut self) {
198 self.data.clear();
199 }
200
201 /// Returns a front-to-back iterator over references to the elements.
202 ///
203 /// The queue is not modified.
204 ///
205 /// # Examples
206 ///
207 /// ```
208 /// use graph_collections::Queue;
209 ///
210 /// let mut queue: Queue<u32> = Queue::new();
211 /// queue.enqueue(1);
212 /// queue.enqueue(2);
213 /// queue.enqueue(3);
214 ///
215 /// let values: Vec<u32> = queue.iter().copied().collect();
216 /// assert_eq!(values, [1, 2, 3]);
217 /// ```
218 #[inline]
219 pub fn iter(&self) -> std::collections::vec_deque::Iter<'_, T> {
220 self.data.iter()
221 }
222}
223
224impl<T> FromIterator<T> for Queue<T> {
225 /// Builds a `Queue` from any iterator. Elements are enqueued in iteration order.
226 ///
227 /// # Examples
228 ///
229 /// ```
230 /// use graph_collections::Queue;
231 ///
232 /// let queue: Queue<u32> = (1..=3).collect();
233 /// assert_eq!(queue.front(), Some(&1));
234 /// assert_eq!(queue.len(), 3);
235 /// ```
236 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
237 Self {
238 data: VecDeque::from_iter(iter),
239 }
240 }
241}
242
243impl<T> Extend<T> for Queue<T> {
244 /// Enqueues all elements produced by the iterator.
245 ///
246 /// # Examples
247 ///
248 /// ```
249 /// use graph_collections::Queue;
250 ///
251 /// let mut queue: Queue<u32> = Queue::new();
252 /// queue.extend([1, 2, 3]);
253 /// assert_eq!(queue.len(), 3);
254 /// ```
255 fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
256 self.data.extend(iter);
257 }
258}
259
260/// Consuming iterator: `for x in queue`
261impl<T> IntoIterator for Queue<T> {
262 type Item = T;
263 type IntoIter = std::collections::vec_deque::IntoIter<T>;
264
265 /// Consumes the queue and yields elements front-to-back.
266 ///
267 /// # Examples
268 ///
269 /// ```
270 /// use graph_collections::Queue;
271 ///
272 /// let queue: Queue<u32> = (1..=3).collect();
273 /// let values: Vec<u32> = queue.into_iter().collect();
274 /// assert_eq!(values, [1, 2, 3]);
275 /// ```
276 fn into_iter(self) -> Self::IntoIter {
277 self.data.into_iter()
278 }
279}
280
281/// Borrowing iterator: `for x in &queue`
282impl<'a, T> IntoIterator for &'a Queue<T> {
283 type Item = &'a T;
284 type IntoIter = std::collections::vec_deque::Iter<'a, T>;
285
286 /// Iterates over references to elements front-to-back without consuming the queue.
287 ///
288 /// # Examples
289 ///
290 /// ```
291 /// use graph_collections::Queue;
292 ///
293 /// let queue: Queue<u32> = (1..=3).collect();
294 /// let sum: u32 = (&queue).into_iter().sum();
295 /// assert_eq!(sum, 6);
296 /// assert_eq!(queue.len(), 3); // queue is still alive
297 /// ```
298 fn into_iter(self) -> Self::IntoIter {
299 self.data.iter()
300 }
301}