priority_send_queue/
lib.rs1use std::collections::VecDeque;
6
7#[derive(Debug, Clone, Copy, Ord, PartialOrd, Eq, PartialEq)]
8pub enum SendQueuePriority {
9 High = 0,
10 Normal = 1,
11 Low = 2,
12}
13
14pub struct PrioritySendQueue<T> {
15 queues: Vec<VecDeque<T>>,
16}
17
18impl<T> Default for PrioritySendQueue<T> {
19 fn default() -> PrioritySendQueue<T> {
20 let mut queues = Vec::new();
21 queues.push(VecDeque::new()); queues.push(VecDeque::new()); queues.push(VecDeque::new()); PrioritySendQueue { queues }
25 }
26}
27
28impl<T> PrioritySendQueue<T> {
29 fn queue(&self, priority: SendQueuePriority) -> &VecDeque<T> {
30 &self.queues[priority as usize]
31 }
32
33 fn queue_mut(&mut self, priority: SendQueuePriority) -> &mut VecDeque<T> {
34 &mut self.queues[priority as usize]
35 }
36
37 pub fn pop_front(&mut self) -> Option<(T, SendQueuePriority)> {
38 if let Some(data) = self.queue_mut(SendQueuePriority::High).pop_front()
39 {
40 return Some((data, SendQueuePriority::High));
41 }
42
43 if let Some(data) =
44 self.queue_mut(SendQueuePriority::Normal).pop_front()
45 {
46 return Some((data, SendQueuePriority::Normal));
47 }
48
49 if let Some(data) = self.queue_mut(SendQueuePriority::Low).pop_front() {
50 return Some((data, SendQueuePriority::Low));
51 }
52
53 None
54 }
55
56 pub fn is_empty(&self) -> bool {
57 self.queue(SendQueuePriority::High).is_empty()
58 && self.queue(SendQueuePriority::Normal).is_empty()
59 && self.queue(SendQueuePriority::Low).is_empty()
60 }
61
62 pub fn is_send_queue_empty(&self, priority: SendQueuePriority) -> bool {
63 self.queue(priority).is_empty()
64 }
65
66 pub fn push_back(&mut self, value: T, priority: SendQueuePriority) {
67 self.queue_mut(priority).push_back(value);
68 }
69
70 pub fn len(&self) -> usize {
71 self.queue(SendQueuePriority::High).len()
72 + self.queue(SendQueuePriority::Normal).len()
73 + self.queue(SendQueuePriority::Low).len()
74 }
75
76 pub fn len_by_priority(&self, priority: SendQueuePriority) -> usize {
77 self.queue(priority).len()
78 }
79}