bern_units/
memory_size.rs

1//! Units representing memory sizes.
2
3use derive_more::{Add, Sub, Mul, Div};
4
5#[derive(PartialEq, PartialOrd, Clone, Copy, Debug, Add, Sub, Mul, Div)]
6pub struct Byte(pub u32);
7
8#[derive(PartialEq, PartialOrd, Clone, Copy, Debug, Add, Sub, Mul, Div)]
9pub struct KiloByte(pub u32);
10
11#[derive(PartialEq, PartialOrd, Clone, Copy, Debug, Add, Sub, Mul, Div)]
12pub struct MegaByte(pub u32);
13
14#[derive(PartialEq, PartialOrd, Clone, Copy, Debug, Add, Sub, Mul, Div)]
15pub struct GigaByte(pub u32);
16
17/// Byte is implemented specifically because const trait implementations are not
18/// stable yet.
19#[allow(non_snake_case)]
20impl Byte {
21    pub const fn from_kB(kb: u32) -> Self {
22        Byte(kb * 1_024)
23    }
24
25    pub const fn from_MB(mb: u32) -> Self {
26        Byte(mb * 1_024 * 1_024)
27    }
28
29    pub const fn from_GB(gb: u32) -> Self {
30        Byte(gb * 1_024 * 1_024 * 1_024)
31    }
32}
33
34/// Extension trait that adds convenience methods to the `u32` type
35#[allow(non_snake_case)]
36pub trait ExtByte {
37    /// Wrap in `Byte`
38    fn B(self) -> Byte;
39
40    /// Wrap in `KiloByte`
41    fn kB(self) -> KiloByte;
42
43    /// Wrap in `MegaByte`
44    fn MB(self) -> MegaByte;
45
46    /// Wrap in `GigaByte`
47    fn GB(self) -> GigaByte;
48}
49
50#[allow(non_snake_case)]
51impl ExtByte for u32 {
52    fn B(self) -> Byte {
53        Byte(self)
54    }
55
56    fn kB(self) -> KiloByte {
57        KiloByte(self)
58    }
59
60    fn MB(self) -> MegaByte {
61        MegaByte(self)
62    }
63
64    fn GB(self) -> GigaByte {
65        GigaByte(self)
66    }
67}
68
69impl Into<u32> for Byte {
70    fn into(self) -> u32 {
71        self.0
72    }
73}
74
75impl Into<usize> for Byte {
76    fn into(self) -> usize {
77        self.0 as usize
78    }
79}
80
81
82impl From<u32> for Byte {
83    fn from(b: u32) -> Self {
84        b.B()
85    }
86}
87
88
89impl From<KiloByte> for Byte {
90    fn from(kb: KiloByte) -> Self {
91        Self(kb.0 * 1_024)
92    }
93}
94
95
96impl From<MegaByte> for Byte {
97    fn from(mb: MegaByte) -> Self {
98        Self(mb.0 * 1_024 * 1_024)
99    }
100}
101
102impl From<MegaByte> for KiloByte {
103    fn from(mb: MegaByte) -> Self {
104        Self(mb.0 * 1_024)
105    }
106}
107
108
109impl From<GigaByte> for Byte {
110    fn from(gb: GigaByte) -> Self {
111        Self(gb.0 * 1_024 * 1_024 * 1_024)
112    }
113}
114
115impl From<GigaByte> for KiloByte {
116    fn from(gb: GigaByte) -> Self {
117        Self(gb.0 * 1_024 * 1_024)
118    }
119}
120
121impl From<GigaByte> for MegaByte {
122    fn from(gb: GigaByte) -> Self {
123        Self(gb.0 * 1_024)
124    }
125}