rust/hedgewars-server/src/core/events.rs
changeset 15822 6af892a0a4b8
parent 15821 ed3b510b860c
child 15840 0c21cdbc5207
equal deleted inserted replaced
15821:ed3b510b860c 15822:6af892a0a4b8
    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;