use std::time::{SystemTime, UNIX_EPOCH};
use crate::core::types::{Msec, Usec};
pub fn usec_now() -> Usec {
SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| {
let micros = d.as_micros();
if micros > u128::from(Usec::MAX) {
Usec::MAX
} else {
#[allow(clippy::cast_possible_truncation)]
{
micros as Usec
}
}
})
.unwrap_or(0)
}
pub fn msec_now() -> Msec {
usec_now() / 1000
}
pub fn count_digits(arg: u64) -> u32 {
if arg == 0 {
1
} else {
arg.ilog10() + 1
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn msec_is_monotone_non_decreasing() {
let a = msec_now();
for _ in 0..16 {
let b = msec_now();
assert!(b >= a);
}
}
#[test]
fn msec_is_within_usec_to_msec_factor() {
let m = msec_now();
let u = usec_now();
assert!(u / 1000 >= m);
assert!(u / 1000 <= m + 50);
}
#[test]
fn digit_table_matches_ten_powers() {
for d in 1u32..=18 {
let n = 10u64.pow(d);
assert_eq!(count_digits(n), d + 1);
assert_eq!(count_digits(n - 1), d);
}
}
}