pasture_core/math/
arithmetic.rs1pub trait Alignable {
9 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}