bucket_queue/bucket/double_ended/
mod.rs

1use super::*;
2
3pub trait DoubleEndedBucket: Bucket {
4    fn push_back(&mut self, item: Self::Item);
5    fn push_front(&mut self, item: Self::Item);
6
7    fn pop_back(&mut self) -> Option<Self::Item>;
8    fn pop_front(&mut self) -> Option<Self::Item>;
9}
10
11// -----------------------------------------------------------------------
12// Provide a canonical implementation of DoubleEndedBucket using VecDeque:
13// -----------------------------------------------------------------------
14
15use std::collections::VecDeque;
16
17impl<T> DoubleEndedBucket for VecDeque<T> {
18    fn push_back(&mut self, item: Self::Item) {
19        self.push_back(item)
20    }
21
22    fn push_front(&mut self, item: Self::Item) {
23        self.push_front(item)
24    }
25
26    fn pop_back(&mut self) -> Option<Self::Item> {
27        self.pop_back()
28    }
29
30    fn pop_front(&mut self) -> Option<Self::Item> {
31        self.pop_front()
32    }
33}
34
35
36// -------------------------------------------------------------------
37// Implement DoubleEndedBucket for DeferredBucket to support deferral:
38// -------------------------------------------------------------------
39
40impl<'a, Q, B> DoubleEndedBucket for DeferredBucket<'a, Q, B>
41    where Q: DoubleEndedQueue<B>,
42          B: DoubleEndedBucket,
43{
44    fn push_back(&mut self, item: Self::Item) {
45        self.adding().push_back(item)
46    }
47
48    fn push_front(&mut self, item: Self::Item) {
49        self.adding().push_front(item)
50    }
51
52    fn pop_back(&mut self) -> Option<Self::Item> {
53        self.removing()?.pop_back()
54    }
55
56    fn pop_front(&mut self) -> Option<Self::Item> {
57        self.removing()?.pop_front()
58    }
59}