use crate::window::TimerToken;
use std::collections::BTreeSet;
use std::time::Instant;
pub struct TimerSlots {
next_fresh_id: usize,
free_slots: BTreeSet<usize>,
}
impl TimerSlots {
pub fn new(starting_ix: usize) -> TimerSlots {
TimerSlots {
next_fresh_id: starting_ix,
free_slots: Default::default(),
}
}
pub fn alloc(&mut self) -> TimerToken {
if let Some(first) = self.free_slots.iter().next().cloned() {
self.free_slots.remove(&first);
TimerToken::new(first)
} else {
let result = self.next_fresh_id;
self.next_fresh_id += 1;
TimerToken::new(result)
}
}
pub fn free(&mut self, token: TimerToken) {
let id = token.get_raw();
if self.next_fresh_id == id + 1 {
self.next_fresh_id -= 1;
} else {
self.free_slots.insert(id);
}
}
pub fn compute_elapsed(&self, deadline: Instant) -> u32 {
let now = Instant::now();
if now >= deadline {
0
} else {
deadline.duration_since(now).as_millis() as u32
}
}
}