vihaco_stdlib/clock/
types.rs1use super::ClockFault;
5
6#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
8pub struct GlobalTick(pub u64);
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
12pub struct GlobalDuration(pub u64);
13
14#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
16pub struct LocalCycles(pub u64);
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
20pub struct GlobalTicksPerLocalCycle(pub u64);
21
22#[derive(Debug, PartialEq, Eq)]
24pub struct Schedule<E> {
25 pub at: GlobalTick,
26 pub event: E,
27}
28
29impl GlobalTick {
30 pub const ZERO: Self = Self(0);
31
32 pub fn checked_add(self, duration: GlobalDuration) -> Result<Self, ClockFault> {
33 self.0
34 .checked_add(duration.0)
35 .map(Self)
36 .ok_or(ClockFault::GlobalTickOverflow)
37 }
38}
39
40impl LocalCycles {
41 pub const ONE: Self = Self(1);
42
43 pub fn checked_add(self, other: Self) -> Result<Self, ClockFault> {
44 self.0
45 .checked_add(other.0)
46 .map(Self)
47 .ok_or(ClockFault::LocalCycleOverflow)
48 }
49
50 pub fn checked_mul(
51 self,
52 ratio: GlobalTicksPerLocalCycle,
53 ) -> Result<GlobalDuration, ClockFault> {
54 self.0
55 .checked_mul(ratio.0)
56 .map(GlobalDuration)
57 .ok_or(ClockFault::DurationOverflow)
58 }
59}
60
61impl GlobalTicksPerLocalCycle {
62 pub fn new(value: u64) -> Result<Self, ClockFault> {
63 (value != 0)
64 .then_some(Self(value))
65 .ok_or(ClockFault::ZeroTickRatio)
66 }
67}