tracexec_core/event/
id.rs

1use 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    // Original should not change
50    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    // Original should not change
60    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; // Should saturate to 0
67    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}