codeq/span/
size.rs

1use std::ops::Deref;
2
3use derive_more::Add;
4use derive_more::AddAssign;
5use derive_more::Display;
6use derive_more::From;
7use derive_more::Sub;
8use derive_more::SubAssign;
9
10/// Represents a size in bytes.
11///
12/// This type wraps a `u64` to provide type safety and prevent accidental mixing
13/// of sizes with other numeric values. It supports basic arithmetic operations
14/// and comparison.
15///
16/// # Examples
17/// ```rust
18/// use codeq::Size;
19///
20/// let size = Size(1024);
21/// let doubled = size + size;
22/// assert_eq!(doubled, Size(2048));
23///
24/// // Sizes can be compared
25/// assert!(Size(100) > Size(50));
26///
27/// // Can be created from u64
28/// let size = Size::from(2048u64);
29/// ```
30#[derive(Debug, Clone, Copy, Default)]
31#[derive(PartialEq, Eq, PartialOrd, Ord)]
32#[derive(From)]
33#[derive(Add, AddAssign, Sub, SubAssign)]
34#[derive(Display)]
35#[display("Size({_0})")]
36pub struct Size(pub u64);
37
38impl Deref for Size {
39    type Target = u64;
40
41    fn deref(&self) -> &Self::Target {
42        &self.0
43    }
44}
45
46#[cfg(test)]
47mod tests {
48    use super::Size;
49
50    #[test]
51    fn test_display() {
52        assert_eq!(format!("{:?}", Size(42)), "Size(42)");
53        assert_eq!(format!("{}", Size(42)), "Size(42)");
54    }
55
56    #[allow(clippy::clone_on_copy)]
57    #[test]
58    fn test_calculation() {
59        let mut a = Size(42);
60        let b = Size(10);
61
62        // Add Sub
63
64        assert_eq!(a + b, Size(52));
65        assert_eq!(a - b, Size(32));
66
67        a += b;
68        assert_eq!(a, Size(52));
69        a -= b;
70        assert_eq!(a, Size(42));
71
72        // Eq, Ord
73
74        assert_eq!(a, Size(42));
75        assert!(a > b);
76
77        // From
78
79        let c = Size::from(1u64);
80
81        // Clone Copy
82
83        let d = c.clone();
84        assert_eq!(d, c);
85
86        let d = c;
87        assert_eq!(d, c);
88
89        // Default
90
91        assert_eq!(Size::default(), Size(0));
92
93        // Deref
94
95        assert_eq!(*Size(1u64), 1u64);
96    }
97}