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 queues = vec![
21 VecDeque::new(), VecDeque::new(), VecDeque::new(), ];
25 PrioritySendQueue { queues }
26 }
27}
28
29impl<T> PrioritySendQueue<T> {
30 fn queue(&self, priority: SendQueuePriority) -> &VecDeque<T> {
31 &self.queues[priority as usize]
32 }
33
34 fn queue_mut(&mut self, priority: SendQueuePriority) -> &mut VecDeque<T> {
35 &mut self.queues[priority as usize]
36 }
37
38 pub fn pop_front(&mut self) -> Option<(T, SendQueuePriority)> {
39 if let Some(data) = self.queue_mut(SendQueuePriority::High).pop_front()
40 {
41 return Some((data, SendQueuePriority::High));
42 }
43
44 if let Some(data) =
45 self.queue_mut(SendQueuePriority::Normal).pop_front()
46 {
47 return Some((data, SendQueuePriority::Normal));
48 }
49
50 if let Some(data) = self.queue_mut(SendQueuePriority::Low).pop_front() {
51 return Some((data, SendQueuePriority::Low));
52 }
53
54 None
55 }
56
57 pub fn is_empty(&self) -> bool {
58 self.queue(SendQueuePriority::High).is_empty()
59 && self.queue(SendQueuePriority::Normal).is_empty()
60 && self.queue(SendQueuePriority::Low).is_empty()
61 }
62
63 pub fn is_send_queue_empty(&self, priority: SendQueuePriority) -> bool {
64 self.queue(priority).is_empty()
65 }
66
67 pub fn push_back(&mut self, value: T, priority: SendQueuePriority) {
68 self.queue_mut(priority).push_back(value);
69 }
70
71 pub fn len(&self) -> usize {
72 self.queue(SendQueuePriority::High).len()
73 + self.queue(SendQueuePriority::Normal).len()
74 + self.queue(SendQueuePriority::Low).len()
75 }
76
77 pub fn len_by_priority(&self, priority: SendQueuePriority) -> usize {
78 self.queue(priority).len()
79 }
80}