shadow_rs/core/work/
event_queue.rs1use std::cmp::Reverse;
2use std::collections::binary_heap::BinaryHeap;
3
4use shadow_shim_helper_rs::emulated_time::EmulatedTime;
5
6use super::event::Event;
7
8#[derive(Debug)]
10pub struct EventQueue {
11    queue: BinaryHeap<Reverse<PanickingOrd<Event>>>,
12    last_popped_event_time: EmulatedTime,
13}
14
15impl EventQueue {
16    pub fn new() -> Self {
17        Self {
18            queue: BinaryHeap::new(),
19            last_popped_event_time: EmulatedTime::SIMULATION_START,
20        }
21    }
22
23    pub fn push(&mut self, event: Event) {
32        assert!(event.time() >= self.last_popped_event_time);
34
35        self.queue.push(Reverse(event.into()));
36    }
37
38    pub fn pop(&mut self) -> Option<Event> {
40        let event = self.queue.pop().map(|x| x.0.into_inner());
41
42        if let Some(ref event) = event {
44            assert!(event.time() >= self.last_popped_event_time);
45            self.last_popped_event_time = event.time();
46        }
47
48        event
49    }
50
51    pub fn next_event_time(&self) -> Option<EmulatedTime> {
53        self.queue.peek().map(|x| x.0.time())
54    }
55}
56
57impl Default for EventQueue {
58    fn default() -> Self {
59        Self::new()
60    }
61}
62
63#[derive(Debug, Default, Copy, Clone, PartialEq, Eq)]
67struct PanickingOrd<T: PartialOrd + Eq>(T);
68
69impl<T: PartialOrd + Eq> PanickingOrd<T> {
70    pub fn into_inner(self) -> T {
71        self.0
72    }
73}
74
75impl<T: PartialOrd + Eq> std::convert::From<T> for PanickingOrd<T> {
76    fn from(x: T) -> Self {
77        PanickingOrd(x)
78    }
79}
80
81impl<T: PartialOrd + Eq> PartialOrd for PanickingOrd<T> {
82    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
83        Some(self.cmp(other))
84    }
85}
86
87impl<T: PartialOrd + Eq> Ord for PanickingOrd<T> {
88    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
89        self.0.partial_cmp(&other.0).unwrap()
90    }
91}
92
93impl<T: PartialOrd + Eq> std::ops::Deref for PanickingOrd<T> {
94    type Target = T;
95
96    fn deref(&self) -> &Self::Target {
97        &self.0
98    }
99}
100
101impl<T: PartialOrd + Eq> std::ops::DerefMut for PanickingOrd<T> {
102    fn deref_mut(&mut self) -> &mut Self::Target {
103        &mut self.0
104    }
105}