rendy_memory/
util.rs

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}