equal
deleted
inserted
replaced
21 pub struct TimedEvents<Data, const MAX_TIMEOUT: usize> { |
21 pub struct TimedEvents<Data, const MAX_TIMEOUT: usize> { |
22 events: [Slab<Event<Data>>; MAX_TIMEOUT], |
22 events: [Slab<Event<Data>>; MAX_TIMEOUT], |
23 current_time: Instant, |
23 current_time: Instant, |
24 current_tick_index: u32, |
24 current_tick_index: u32, |
25 next_event_id: u32, |
25 next_event_id: u32, |
|
26 events_count: u32, |
26 } |
27 } |
27 |
28 |
28 impl<Data, const MAX_TIMEOUT: usize> TimedEvents<Data, MAX_TIMEOUT> { |
29 impl<Data, const MAX_TIMEOUT: usize> TimedEvents<Data, MAX_TIMEOUT> { |
29 pub fn new() -> Self { |
30 pub fn new() -> Self { |
30 Self { |
31 Self { |
35 .ok() |
36 .ok() |
36 .unwrap(), |
37 .unwrap(), |
37 current_time: Instant::now(), |
38 current_time: Instant::now(), |
38 current_tick_index: 0, |
39 current_tick_index: 0, |
39 next_event_id: 0, |
40 next_event_id: 0, |
|
41 events_count: 0, |
40 } |
42 } |
41 } |
43 } |
42 |
44 |
43 pub fn set_timeout(&mut self, seconds_delay: NonZeroU32, data: Data) -> Timeout { |
45 pub fn set_timeout(&mut self, seconds_delay: NonZeroU32, data: Data) -> Timeout { |
44 let tick_index = (self.current_tick_index |
46 let tick_index = (self.current_tick_index |
49 let event = Event { event_id, data }; |
51 let event = Event { event_id, data }; |
50 |
52 |
51 let entry = self.events[tick_index as usize].vacant_entry(); |
53 let entry = self.events[tick_index as usize].vacant_entry(); |
52 let event_index = entry.key() as u32; |
54 let event_index = entry.key() as u32; |
53 entry.insert(event); |
55 entry.insert(event); |
|
56 |
|
57 self.events_count += 1; |
|
58 |
54 Timeout { |
59 Timeout { |
55 tick_index, |
60 tick_index, |
56 event_index, |
61 event_index, |
57 event_id, |
62 event_id, |
58 } |
63 } |
60 |
65 |
61 pub fn cancel_timeout(&mut self, timeout: Timeout) -> Option<Data> { |
66 pub fn cancel_timeout(&mut self, timeout: Timeout) -> Option<Data> { |
62 let events = &mut self.events[timeout.tick_index as usize]; |
67 let events = &mut self.events[timeout.tick_index as usize]; |
63 if matches!(events.get(timeout.event_index as usize), Some(Event { event_id: id, ..}) if *id == timeout.event_id) |
68 if matches!(events.get(timeout.event_index as usize), Some(Event { event_id: id, ..}) if *id == timeout.event_id) |
64 { |
69 { |
|
70 self.events_count -= 1; |
65 Some(events.remove(timeout.event_index as usize).data) |
71 Some(events.remove(timeout.event_index as usize).data) |
66 } else { |
72 } else { |
67 None |
73 None |
68 } |
74 } |
69 } |
75 } |
78 self.events[self.current_tick_index as usize] |
84 self.events[self.current_tick_index as usize] |
79 .drain() |
85 .drain() |
80 .map(|e| e.data), |
86 .map(|e| e.data), |
81 ); |
87 ); |
82 } |
88 } |
|
89 self.events_count -= result.len() as u32; |
83 result |
90 result |
|
91 } |
|
92 |
|
93 pub fn is_empty(&self) -> bool { |
|
94 self.events_count == 0 |
84 } |
95 } |
85 } |
96 } |
86 |
97 |
87 mod test { |
98 mod test { |
88 use super::TimedEvents; |
99 use super::TimedEvents; |