use core::num::NonZeroU64;
use windows_sys::Win32::Foundation::FILETIME;
use windows_sys::Win32::System::SystemInformation::{
GetSystemTimeAsFileTime, GetSystemTimePreciseAsFileTime,
};
use crate::clock::Clock;
use crate::timeline::{HUNDRED_NANOSECOND_TICKS, TimePoint, Timeline};
#[cfg(test)]
mod tests;
pub enum FileTime {}
impl Timeline for FileTime {
fn ticks_per_second() -> NonZeroU64 {
HUNDRED_NANOSECOND_TICKS
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct CoarseSystemClock;
impl Clock for CoarseSystemClock {
type Timeline = FileTime;
fn now(&self) -> TimePoint<FileTime> {
let mut time = FILETIME::default();
unsafe { GetSystemTimeAsFileTime(&mut time) };
point(time)
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
pub struct PreciseSystemClock;
impl Clock for PreciseSystemClock {
type Timeline = FileTime;
fn now(&self) -> TimePoint<FileTime> {
let mut time = FILETIME::default();
unsafe { GetSystemTimePreciseAsFileTime(&mut time) };
point(time)
}
}
fn point(time: FILETIME) -> TimePoint<FileTime> {
TimePoint::from_ticks((u64::from(time.dwHighDateTime) << 32) | u64::from(time.dwLowDateTime))
}