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}