pub(crate) trait NoCrossLaneAliasing {}
pub(crate) trait AtMostOnceCommit {}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub(crate) struct IncreasingGen;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct One;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Many;
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct Lane(u8);
impl Lane {
pub const fn new(id: u32) -> Self {
assert!(id <= u8::MAX as u32, "lane id must be <= 255");
Self(id as u8)
}
pub const fn try_new(id: u32) -> Option<Self> {
if id <= u8::MAX as u32 {
Some(Self(id as u8))
} else {
None
}
}
pub const fn raw(self) -> u32 {
self.0 as u32
}
pub const fn as_wire(self) -> u8 {
self.0
}
}
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct Generation(pub u16);
impl Generation {
pub const ZERO: Self = Self(0);
pub const fn new(value: u16) -> Self {
Self(value)
}
pub const fn raw(self) -> u16 {
self.0
}
pub const fn as_wire(self) -> u16 {
self.0
}
pub fn bump(self) -> Self {
Self(self.0.saturating_add(1))
}
}
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct SessionId(pub u32);
impl SessionId {
pub const fn new(id: u32) -> Self {
Self(id)
}
pub const fn raw(self) -> u32 {
self.0
}
}
#[repr(transparent)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
pub struct RendezvousId(pub u16);
impl RendezvousId {
pub const fn new(id: u16) -> Self {
Self(id)
}
pub const fn raw(self) -> u16 {
self.0
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_gen_bump() {
let generation = Generation::ZERO;
assert_eq!(generation.bump(), Generation::new(1));
assert_eq!(generation.bump().bump(), Generation::new(2));
let max_gen = Generation::new(u16::MAX);
assert_eq!(max_gen.bump(), max_gen);
}
}