pasture_core/math/
arithmetic.rs

1/// Trait for aligning a numeric value to a given byte boundary
2///
3/// # Example
4/// ```
5/// # use pasture_core::math::*;
6/// assert_eq!(8, 5_u32.align_to(8));
7/// ```
8pub trait Alignable {
9    /// Align the associated value to an `alignment` bytes boundary
10    fn align_to(&self, alignment: Self) -> Self;
11}
12
13impl Alignable for u8 {
14    fn align_to(&self, alignment: Self) -> Self {
15        if alignment == 0 {
16            *self
17        } else {
18            ((self + alignment - 1) / alignment) * alignment
19        }
20    }
21}
22
23impl Alignable for u16 {
24    fn align_to(&self, alignment: Self) -> Self {
25        if alignment == 0 {
26            *self
27        } else {
28            ((self + alignment - 1) / alignment) * alignment
29        }
30    }
31}
32
33impl Alignable for u32 {
34    fn align_to(&self, alignment: Self) -> Self {
35        if alignment == 0 {
36            *self
37        } else {
38            ((self + alignment - 1) / alignment) * alignment
39        }
40    }
41}
42
43impl Alignable for u64 {
44    fn align_to(&self, alignment: Self) -> Self {
45        if alignment == 0 {
46            *self
47        } else {
48            ((self + alignment - 1) / alignment) * alignment
49        }
50    }
51}
52
53impl Alignable for u128 {
54    fn align_to(&self, alignment: Self) -> Self {
55        if alignment == 0 {
56            *self
57        } else {
58            ((self + alignment - 1) / alignment) * alignment
59        }
60    }
61}
62
63impl Alignable for usize {
64    fn align_to(&self, alignment: Self) -> Self {
65        if alignment == 0 {
66            *self
67        } else {
68            ((self + alignment - 1) / alignment) * alignment
69        }
70    }
71}
72
73#[cfg(test)]
74mod tests {
75    use super::Alignable;
76
77    #[test]
78    fn test_align_to() {
79        assert_eq!(1_u32.align_to(0), 1);
80        assert_eq!(1_u32.align_to(2), 2);
81        assert_eq!(0_u32.align_to(2), 0);
82        assert_eq!(4_u32.align_to(8), 8);
83        assert_eq!(27_u32.align_to(8), 32);
84        assert_eq!(8_u32.align_to(8), 8);
85    }
86}