#[cfg(not(target_arch = "wasm32"))]
use std::time::Instant;
use crate::error::{BacktraceError, ErrorMessage};
#[cfg(target_arch = "wasm32")]
use crate::web::{WebPerformance, WebWindow};
pub struct Stopwatch
{
clock: TimeClock,
start: TimeInstant
}
impl Stopwatch
{
#[inline]
pub fn new() -> Result<Self, BacktraceError<ErrorMessage>>
{
let clock = TimeClock::new()?;
let start = clock.now();
Ok(Self { clock, start })
}
#[inline]
pub fn secs_elapsed(&self) -> f64
{
self.clock.secs_elapsed_since(&self.start)
}
}
#[derive(Clone)]
struct TimeClock
{
#[cfg(target_arch = "wasm32")]
performance: WebPerformance
}
impl TimeClock
{
pub fn new() -> Result<Self, BacktraceError<ErrorMessage>>
{
#[cfg(target_arch = "wasm32")]
return Ok(Self {
performance: WebWindow::new()?.performance()?
});
#[cfg(not(target_arch = "wasm32"))]
return Ok(Self {});
}
#[inline]
pub fn now(&self) -> TimeInstant
{
#[cfg(target_arch = "wasm32")]
return TimeInstant {
value: self.performance.now()
};
#[cfg(not(target_arch = "wasm32"))]
return TimeInstant {
value: Instant::now()
};
}
#[inline]
pub fn secs_elapsed_since(&self, start: &TimeInstant) -> f64
{
#[cfg(target_arch = "wasm32")]
return (self.now().value - start.value) / 1000.0;
#[cfg(not(target_arch = "wasm32"))]
return start.value.elapsed().as_secs_f64();
}
}
struct TimeInstant
{
#[cfg(target_arch = "wasm32")]
value: f64,
#[cfg(not(target_arch = "wasm32"))]
value: Instant
}