1pub const fn lsb_mask_usize(n: usize) -> usize {
2 if n != 0 {
3 usize::MAX >> (size_of::<usize>() * 8 - n)
4 } else {
5 0
6 }
7}
8
9pub const fn lsb_mask32(n: u32) -> usize {
10 if size_of::<u32>() < size_of::<usize>() {
11 (1 << n as usize) - 1
12 } else {
13 if n != 0 {
14 u32::MAX as usize >> (size_of::<u32>() * 8 - n as usize)
15 } else {
16 0
17 }
18 }
19}
20
21pub const fn lsb_mask64(n: u64) -> usize {
22 if size_of::<u64>() < size_of::<usize>() {
23 (1 << n as usize) - 1
24 } else {
25 if n != 0 {
26 u64::MAX as usize >> (size_of::<u64>() * 8 - n as usize)
27 } else {
28 0
29 }
30 }
31}
32
33pub fn bitmask_from_bool(src: bool) -> u32 {
34 0u32.wrapping_sub(src as u32)
35}
36
37pub fn align_up_usize(addr: usize, align: usize) -> usize {
38 let mask = align - 1;
39 (addr + mask) & !mask
40}
41
42pub fn is_between<T>(x: T, a: T, b: T) -> bool
43where
44 T: PartialOrd + Ord,
45{
46 x >= a && x <= b
47}
48
49#[cfg(not(windows))]
50pub fn lookup_with_dlsym(name: &str) -> *const u8 {
51 use alloc::ffi::CString;
52 use core::ptr::null;
53
54 let c_str = CString::new(name).unwrap();
55 let c_str_ptr = c_str.as_ptr();
56 let sym = unsafe { libc::dlsym(libc::RTLD_DEFAULT, c_str_ptr) };
57 if sym.is_null() {
58 null()
59 } else {
60 sym as *const u8
61 }
62}