1use std::collections::vec_deque::{Iter, IterMut};
2use std::collections::VecDeque;
3
4#[derive(Debug, PartialEq, Eq)]
5pub struct TimerEntry<T> {
6 time: u64,
7 inner: VecDeque<T>,
8}
9
10impl<T> TimerEntry<T> {
11 pub fn new(time: u64) -> Self {
12 TimerEntry {
13 time,
14 inner: VecDeque::new(),
15 }
16 }
17
18 pub fn len(&self) -> usize {
19 self.inner.len()
20 }
21
22 pub fn is_empty(&self) -> bool {
23 self.inner.is_empty()
24 }
25
26 pub fn get_time(&self) -> u64 {
27 self.time
28 }
29
30 pub fn pop_front(&mut self) -> Option<T> {
31 self.inner.pop_front()
32 }
33
34 pub fn push_back(&mut self, t: T) {
35 self.inner.push_back(t)
36 }
37
38 pub fn remove(&mut self, t: T) -> Option<T>
39 where
40 T: Ord,
41 {
42 let index = self
43 .inner
44 .binary_search_by(|x| x.cmp(&t))
45 .unwrap_or_else(|x| x);
46 self.inner.remove(index)
47 }
48
49 pub fn iter_mut(&mut self) -> IterMut<'_, T> {
50 self.inner.iter_mut()
51 }
52
53 pub fn iter(&self) -> Iter<'_, T> {
54 self.inner.iter()
55 }
56}
57
58#[repr(C)]
59#[derive(Debug, PartialEq, Eq)]
60pub struct TimerList<T> {
61 dequeue: VecDeque<TimerEntry<T>>,
62}
63
64impl<T> TimerList<T> {
65 pub fn new() -> Self {
66 TimerList {
67 dequeue: VecDeque::new(),
68 }
69 }
70
71 pub fn len(&self) -> usize {
72 self.dequeue.len()
73 }
74
75 pub fn insert(&mut self, time: u64, t: T) {
76 let index = self
77 .dequeue
78 .binary_search_by(|x| x.time.cmp(&time))
79 .unwrap_or_else(|x| x);
80 match self.dequeue.get_mut(index) {
81 Some(entry) => {
82 entry.push_back(t);
83 }
84 None => {
85 let mut entry = TimerEntry::new(time);
86 entry.push_back(t);
87 self.dequeue.insert(index, entry);
88 }
89 }
90 }
91
92 pub fn front(&self) -> Option<&TimerEntry<T>> {
93 self.dequeue.front()
94 }
95
96 pub fn pop_front(&mut self) -> Option<TimerEntry<T>> {
97 self.dequeue.pop_front()
98 }
99
100 pub fn is_empty(&self) -> bool {
101 self.dequeue.is_empty()
102 }
103
104 pub fn get_entry(&mut self, time: u64) -> Option<&mut TimerEntry<T>> {
105 let index = self
106 .dequeue
107 .binary_search_by(|x| x.time.cmp(&time))
108 .unwrap_or_else(|x| x);
109 self.dequeue.get_mut(index)
110 }
111
112 pub fn iter_mut(&mut self) -> IterMut<'_, TimerEntry<T>> {
113 self.dequeue.iter_mut()
114 }
115
116 pub fn iter(&self) -> Iter<'_, TimerEntry<T>> {
117 self.dequeue.iter()
118 }
119}
120
121impl<T> Default for TimerList<T> {
122 fn default() -> Self {
123 Self::new()
124 }
125}
126
127#[cfg(test)]
128mod tests {
129 use super::TimerList;
130
131 #[test]
132 fn timer_list() {
133 let mut list = TimerList::new();
134 assert_eq!(list.len(), 0);
135 list.insert(1, String::from("data can be everything"));
136 assert_eq!(list.len(), 1);
137
138 let mut entry = list.pop_front().unwrap();
139 assert_eq!(entry.len(), 1);
140 let string = entry.pop_front().unwrap();
141 assert_eq!(string, String::from("data can be everything"));
142 }
143}