Skip to main content

rstl_queue/
traits.rs

1use collection::Collection;
2use std::cmp::Ordering;
3
4pub trait QueueLike<T>: Collection<Item = T> {
5    fn front(&self) -> Option<&T>;
6    fn enqueue(&mut self, element: T);
7    fn dequeue(&mut self) -> Option<T>;
8
9    fn enqueues<I>(&mut self, elements: I)
10    where
11        I: IntoIterator<Item = T>,
12    {
13        for element in elements {
14            self.enqueue(element);
15        }
16    }
17
18    fn replace_front(&mut self, new_back: T) -> Option<T> {
19        let removed = self.dequeue();
20        self.enqueue(new_back);
21        removed
22    }
23}
24
25pub trait DequeLike<T>: QueueLike<T> {
26    fn back(&self) -> Option<&T>;
27    fn enqueue_front(&mut self, element: T);
28    fn dequeue_back(&mut self) -> Option<T>;
29
30    fn enqueues_front<I>(&mut self, elements: I)
31    where
32        I: IntoIterator<Item = T>,
33    {
34        for element in elements {
35            self.enqueue_front(element);
36        }
37    }
38
39    fn replace_back(&mut self, new_front: T) -> Option<T> {
40        let removed = self.dequeue_back();
41        self.enqueue_front(new_front);
42        removed
43    }
44}
45
46pub trait CircularQueueLike<T>: DequeLike<T> {
47    type Error;
48
49    fn capacity(&self) -> usize;
50    fn at(&self, index: isize) -> Option<&T>;
51    fn resize(&mut self, new_capacity: usize) -> Result<(), Self::Error>;
52    fn rearrange(&mut self);
53}
54
55pub trait PriorityQueueLike<T>: QueueLike<T> {
56    fn compare(&self, a: &T, b: &T) -> Ordering;
57}