traitgraph_algo/
queue.rs

1/// A queue that supports both popping and pushing at front and back.
2pub trait BidirectedQueue<T>: Default {
3    /// Insert an element at the front of the queue.
4    fn push_front(&mut self, t: T);
5    /// Insert an element at the back of the queue.
6    fn push_back(&mut self, t: T);
7    /// Remove and return an element from the front of the queue.
8    fn pop_front(&mut self) -> Option<T>;
9    /// Remove and return an element from the back of the queue.
10    fn pop_back(&mut self) -> Option<T>;
11    /// Remove all elements from the queue without returning them.
12    fn clear(&mut self);
13    /// Return the amount of elements currently in the queue.
14    fn len(&self) -> usize;
15    /// Returns true if the queue contains no elements.
16    fn is_empty(&self) -> bool {
17        self.len() == 0
18    }
19}
20
21impl<T> BidirectedQueue<T> for std::collections::LinkedList<T> {
22    fn push_front(&mut self, t: T) {
23        std::collections::LinkedList::<T>::push_front(self, t)
24    }
25
26    fn push_back(&mut self, t: T) {
27        std::collections::LinkedList::<T>::push_back(self, t)
28    }
29
30    fn pop_front(&mut self) -> Option<T> {
31        std::collections::LinkedList::<T>::pop_front(self)
32    }
33
34    fn pop_back(&mut self) -> Option<T> {
35        std::collections::LinkedList::<T>::pop_back(self)
36    }
37
38    fn clear(&mut self) {
39        self.clear();
40    }
41
42    fn len(&self) -> usize {
43        std::collections::LinkedList::<T>::len(self)
44    }
45}
46
47impl<T> BidirectedQueue<T> for std::collections::VecDeque<T> {
48    fn push_front(&mut self, t: T) {
49        std::collections::VecDeque::<T>::push_front(self, t)
50    }
51
52    fn push_back(&mut self, t: T) {
53        std::collections::VecDeque::<T>::push_back(self, t)
54    }
55
56    fn pop_front(&mut self) -> Option<T> {
57        std::collections::VecDeque::<T>::pop_front(self)
58    }
59
60    fn pop_back(&mut self) -> Option<T> {
61        std::collections::VecDeque::<T>::pop_back(self)
62    }
63
64    fn clear(&mut self) {
65        self.clear();
66    }
67
68    fn len(&self) -> usize {
69        std::collections::VecDeque::<T>::len(self)
70    }
71}