tracexec_core/event/
id.rs1use std::ops::{
2 Add,
3 Sub,
4};
5
6use nutype::nutype;
7
8#[nutype(derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize))]
9pub struct EventId(u64);
10
11impl Add<u64> for EventId {
12 type Output = Self;
13
14 fn add(self, rhs: u64) -> Self::Output {
15 Self::new(self.into_inner() + rhs)
16 }
17}
18
19impl Sub<u64> for EventId {
20 type Output = Self;
21
22 fn sub(self, rhs: u64) -> Self::Output {
23 Self::new(self.into_inner().saturating_sub(rhs))
24 }
25}
26
27impl EventId {
28 pub fn zero() -> Self {
29 Self::new(0)
30 }
31}
32
33#[cfg(test)]
34mod tests {
35 use test_that::prelude::*;
36
37 use super::EventId;
38
39 #[test]
40 fn test_zero() {
41 let zero = EventId::zero();
42 assert_eq!(zero.into_inner(), 0);
43 }
44
45 #[test]
46 fn test_add() {
47 let id = EventId::new(10);
48 let new_id = id + 5;
49 assert_eq!(new_id.into_inner(), 15);
50
51 assert_eq!(id.into_inner(), 10);
53 }
54
55 #[test]
56 fn test_sub() {
57 let id = EventId::new(10);
58 let new_id = id - 3;
59 assert_eq!(new_id.into_inner(), 7);
60
61 assert_eq!(id.into_inner(), 10);
63 }
64
65 #[test]
66 fn test_sub_saturating() {
67 let id = EventId::new(5);
68 let new_id = id - 10; assert_eq!(new_id.into_inner(), 0);
70 }
71
72 #[test]
73 fn test_equality_and_ordering() {
74 let a = EventId::new(1);
75 let b = EventId::new(2);
76 assert_that!(a, lt(b));
77 assert_that!(b, gt(a));
78 assert_eq!(a, EventId::new(1));
79 }
80
81 #[test]
82 #[allow(clippy::clone_on_copy)]
83 fn test_clone_copy() {
84 let id = EventId::new(42);
85 let c1 = id;
86 let c2 = id.clone();
87 assert_eq!(c1, c2);
88 }
89}