use core::num::NonZeroU64;
use windows_sys::Win32::System::WindowsProgramming::{
QueryInterruptTime, QueryInterruptTimePrecise, QueryUnbiasedInterruptTime,
QueryUnbiasedInterruptTimePrecise,
};
use crate::clock::{Clock, Steady};
use crate::timeline::{HUNDRED_NANOSECOND_TICKS, TimePoint, Timeline};
#[cfg(test)]
mod tests;
pub enum InterruptTime {}
impl Timeline for InterruptTime {
fn ticks_per_second() -> NonZeroU64 {
HUNDRED_NANOSECOND_TICKS
}
}
pub enum UnbiasedInterruptTime {}
impl Timeline for UnbiasedInterruptTime {
fn ticks_per_second() -> NonZeroU64 {
HUNDRED_NANOSECOND_TICKS
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct InterruptClock;
impl Clock for InterruptClock {
type Timeline = InterruptTime;
fn now(&self) -> TimePoint<InterruptTime> {
let mut ticks = 0;
unsafe { QueryInterruptTime(&mut ticks) };
TimePoint::from_ticks(ticks)
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct PreciseInterruptClock;
impl Clock for PreciseInterruptClock {
type Timeline = InterruptTime;
fn now(&self) -> TimePoint<InterruptTime> {
let mut ticks = 0;
unsafe { QueryInterruptTimePrecise(&mut ticks) };
TimePoint::from_ticks(ticks)
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct UnbiasedInterruptClock;
impl Clock for UnbiasedInterruptClock {
type Timeline = UnbiasedInterruptTime;
fn now(&self) -> TimePoint<UnbiasedInterruptTime> {
let mut ticks = 0;
let succeeded = unsafe { QueryUnbiasedInterruptTime(&mut ticks) };
debug_assert_ne!(succeeded, 0, "QueryUnbiasedInterruptTime failed");
TimePoint::from_ticks(ticks)
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct PreciseUnbiasedInterruptClock;
impl Clock for PreciseUnbiasedInterruptClock {
type Timeline = UnbiasedInterruptTime;
fn now(&self) -> TimePoint<UnbiasedInterruptTime> {
let mut ticks = 0;
unsafe { QueryUnbiasedInterruptTimePrecise(&mut ticks) };
TimePoint::from_ticks(ticks)
}
}
impl Steady for InterruptClock {}
impl Steady for PreciseInterruptClock {}
impl Steady for UnbiasedInterruptClock {}
impl Steady for PreciseUnbiasedInterruptClock {}