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 super::EventId;
36
37 #[test]
38 fn test_zero() {
39 let zero = EventId::zero();
40 assert_eq!(zero.into_inner(), 0);
41 }
42
43 #[test]
44 fn test_add() {
45 let id = EventId::new(10);
46 let new_id = id + 5;
47 assert_eq!(new_id.into_inner(), 15);
48
49 assert_eq!(id.into_inner(), 10);
51 }
52
53 #[test]
54 fn test_sub() {
55 let id = EventId::new(10);
56 let new_id = id - 3;
57 assert_eq!(new_id.into_inner(), 7);
58
59 assert_eq!(id.into_inner(), 10);
61 }
62
63 #[test]
64 fn test_sub_saturating() {
65 let id = EventId::new(5);
66 let new_id = id - 10; assert_eq!(new_id.into_inner(), 0);
68 }
69
70 #[test]
71 fn test_equality_and_ordering() {
72 let a = EventId::new(1);
73 let b = EventId::new(2);
74 assert!(a < b);
75 assert!(b > a);
76 assert_eq!(a, EventId::new(1));
77 }
78
79 #[test]
80 fn test_clone_copy() {
81 let id = EventId::new(42);
82 let c1 = id;
83 let c2 = id.clone();
84 assert_eq!(c1, c2);
85 }
86}