1pub(crate) fn aligned(value: u64, align: u64) -> u64 {
2 debug_assert_ne!(align, 0);
3 debug_assert_eq!(align.count_ones(), 1);
4 if value == 0 {
5 0
6 } else {
7 1u64 + ((value - 1u64) | (align - 1u64))
8 }
9}
10
11pub(crate) trait IntegerFitting {
12 fn fits_usize(self) -> bool;
13 fn fits_isize(self) -> bool;
14
15 fn usize_fits(value: usize) -> bool;
16 fn isize_fits(value: isize) -> bool;
17}
18
19#[cfg(any(target_pointer_width = "16", target_pointer_width = "32"))]
20impl IntegerFitting for u64 {
21 fn fits_usize(self) -> bool {
22 self <= usize::max_value() as u64
23 }
24 fn fits_isize(self) -> bool {
25 self <= isize::max_value() as u64
26 }
27 fn usize_fits(_value: usize) -> bool {
28 true
29 }
30 fn isize_fits(value: isize) -> bool {
31 value >= 0
32 }
33}
34
35#[cfg(target_pointer_width = "64")]
36impl IntegerFitting for u64 {
37 fn fits_usize(self) -> bool {
38 true
39 }
40 fn fits_isize(self) -> bool {
41 self <= isize::max_value() as u64
42 }
43 fn usize_fits(_value: usize) -> bool {
44 true
45 }
46 fn isize_fits(value: isize) -> bool {
47 value >= 0
48 }
49}
50
51#[cfg(not(any(
52 target_pointer_width = "16",
53 target_pointer_width = "32",
54 target_pointer_width = "64"
55)))]
56impl IntegerFitting for u64 {
57 fn fits_usize(self) -> bool {
58 true
59 }
60 fn fits_isize(self) -> bool {
61 true
62 }
63 fn usize_fits(value: usize) -> bool {
64 value <= u64::max_value() as usize
65 }
66 fn isize_fits(value: isize) -> bool {
67 value >= 0 && value <= u64::max_value() as isize
68 }
69}
70
71#[cfg(target_pointer_width = "16")]
72impl IntegerFitting for u32 {
73 fn fits_usize(self) -> bool {
74 self <= usize::max_value() as u32
75 }
76 fn fits_isize(self) -> bool {
77 self <= isize::max_value() as u32
78 }
79 fn usize_fits(_value: usize) -> bool {
80 true
81 }
82 fn isize_fits(value: isize) -> bool {
83 value >= 0
84 }
85}
86
87#[cfg(target_pointer_width = "32")]
88impl IntegerFitting for u32 {
89 fn fits_usize(self) -> bool {
90 true
91 }
92 fn fits_isize(self) -> bool {
93 self <= isize::max_value() as u32
94 }
95 fn usize_fits(_value: usize) -> bool {
96 true
97 }
98 fn isize_fits(value: isize) -> bool {
99 value >= 0
100 }
101}
102
103#[cfg(not(any(target_pointer_width = "16", target_pointer_width = "32")))]
104impl IntegerFitting for u32 {
105 fn fits_usize(self) -> bool {
106 true
107 }
108 fn fits_isize(self) -> bool {
109 true
110 }
111 fn usize_fits(value: usize) -> bool {
112 value <= u32::max_value() as usize
113 }
114 fn isize_fits(value: isize) -> bool {
115 value >= 0 && value <= u32::max_value() as isize
116 }
117}
118
119pub(crate) fn fits_usize<T: IntegerFitting>(value: T) -> bool {
120 value.fits_usize()
121}
122
123pub(crate) fn fits_u32(value: usize) -> bool {
124 u32::usize_fits(value)
125}