#[cfg(kani)]
mod proofs;
mod wire;
pub use wire::{DecodeError, KAIROS_WIRE_LEN};
pub trait ToU16 {
fn to_u16(&self) -> u16;
}
impl ToU16 for u16 {
fn to_u16(&self) -> u16 {
*self
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Kairos(u128);
impl Kairos {
#[must_use]
#[allow(
clippy::needless_pass_by_value,
reason = "kairotic is converted via ToU16::to_u16; by-value keeps the generic API ergonomic for Copy tags"
)]
pub fn new<T: ToU16>(physical: u64, logical: u16, station_id: u32, kairotic: T) -> Self {
let kairotic_u16 = kairotic.to_u16();
let value = (u128::from(physical) << 64)
| (u128::from(logical) << 48)
| (u128::from(kairotic_u16) << 32)
| u128::from(station_id);
Self(value)
}
#[must_use]
pub const fn physical(&self) -> u64 {
(self.0 >> 64) as u64
}
#[must_use]
pub const fn logical(&self) -> u16 {
((self.0 >> 48) & 0xFFFF) as u16
}
#[must_use]
pub const fn kairotic(&self) -> u16 {
((self.0 >> 32) & 0xFFFF) as u16
}
#[must_use]
pub const fn station_id(&self) -> u32 {
(self.0 & ((1 << 32) - 1)) as u32
}
}