use std::time::{Duration, SystemTime};
use crate::State;
const FIDELITY: Duration = Duration::from_nanos(100);
impl State {
pub fn next(&mut self, timestamp: SystemTime) -> (SystemTime, u16) {
if timestamp <= self.last_ts + FIDELITY {
self.seq = (self.seq.wrapping_add(1)) & 0x3FFF;
}
self.last_ts = timestamp;
(timestamp, self.seq)
}
}
#[cfg(test)]
mod tests {
use std::time::SystemTime;
use crate::STATE;
#[test]
fn always_increments() {
let mut guard = STATE.lock_arc();
let mut previous = guard.next(SystemTime::now());
for _ in 0..99999 {
let next = guard.next(SystemTime::now());
assert!(
next > previous,
"Next timestamp or sequence number must be greater."
);
previous = next;
}
drop(guard);
}
}