Skip to main content

memento_cache/core/
byte_size.rs

1/// Extension trait for convenient byte size conversions.
2///
3/// # Examples
4///
5/// ```rust,ignore
6/// use memento_cache::ByteSize;
7///
8/// let max_cache = 50.mb();
9/// let max_entry = 512.kb();
10/// let total = 1.gb();
11/// ```
12pub trait ByteSize {
13    /// Convert to bytes (identity for usize)
14    fn bytes(self) -> usize;
15    /// Convert kilobytes to bytes
16    fn kb(self) -> usize;
17    /// Convert megabytes to bytes
18    fn mb(self) -> usize;
19    /// Convert gigabytes to bytes
20    fn gb(self) -> usize;
21}
22
23impl ByteSize for usize {
24    fn bytes(self) -> usize {
25        self
26    }
27
28    fn kb(self) -> usize {
29        self * 1024
30    }
31
32    fn mb(self) -> usize {
33        self * 1024 * 1024
34    }
35
36    fn gb(self) -> usize {
37        self * 1024 * 1024 * 1024
38    }
39}
40
41impl ByteSize for u64 {
42    fn bytes(self) -> usize {
43        self as usize
44    }
45
46    fn kb(self) -> usize {
47        (self * 1024) as usize
48    }
49
50    fn mb(self) -> usize {
51        (self * 1024 * 1024) as usize
52    }
53
54    fn gb(self) -> usize {
55        (self * 1024 * 1024 * 1024) as usize
56    }
57}
58
59impl ByteSize for i32 {
60    fn bytes(self) -> usize {
61        self as usize
62    }
63
64    fn kb(self) -> usize {
65        (self as usize) * 1024
66    }
67
68    fn mb(self) -> usize {
69        (self as usize) * 1024 * 1024
70    }
71
72    fn gb(self) -> usize {
73        (self as usize) * 1024 * 1024 * 1024
74    }
75}
76
77#[cfg(test)]
78mod tests {
79    use super::*;
80
81    #[test]
82    fn test_byte_size_usize() {
83        assert_eq!(1.bytes(), 1);
84        assert_eq!(1.kb(), 1024);
85        assert_eq!(1.mb(), 1024 * 1024);
86        assert_eq!(1.gb(), 1024 * 1024 * 1024);
87
88        assert_eq!(50.mb(), 50 * 1024 * 1024);
89        assert_eq!(512.kb(), 512 * 1024);
90    }
91
92    #[test]
93    fn test_byte_size_u64() {
94        assert_eq!(1u64.kb(), 1024);
95        assert_eq!(50u64.mb(), 50 * 1024 * 1024);
96    }
97
98    #[test]
99    fn test_byte_size_i32() {
100        assert_eq!(1i32.kb(), 1024);
101        assert_eq!(50i32.mb(), 50 * 1024 * 1024);
102    }
103}