#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct State(u64);
impl State {
pub const SEQ_BITS: u32 = 16;
pub const SEQ_MASK: u64 = (1 << Self::SEQ_BITS) - 1;
#[inline(always)]
pub const fn new(timestamp: u64, sequence: u16) -> Self {
Self((timestamp << Self::SEQ_BITS) | (sequence as u64))
}
#[inline(always)]
pub const fn timestamp(self) -> u64 {
self.0 >> Self::SEQ_BITS
}
#[inline(always)]
pub const fn sequence(self) -> u16 {
(self.0 & Self::SEQ_MASK) as u16
}
#[inline(always)]
pub const fn raw(self) -> u64 {
self.0
}
#[inline(always)]
pub const fn from_raw(raw: u64) -> Self {
Self(raw)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_state_roundtrip() {
let ts = 123456789u64;
let seq = 4095u16;
let state = State::new(ts, seq);
assert_eq!(state.timestamp(), ts);
assert_eq!(state.sequence(), seq);
}
#[test]
fn test_state_max_values() {
let max_ts = (1u64 << 48) - 1;
let max_seq = u16::MAX;
let state = State::new(max_ts, max_seq);
assert_eq!(state.timestamp(), max_ts);
assert_eq!(state.sequence(), max_seq);
}
#[test]
fn test_state_zero() {
let state = State::new(0, 0);
assert_eq!(state.raw(), 0);
assert_eq!(state.timestamp(), 0);
assert_eq!(state.sequence(), 0);
}
}