xref: /third_party/rust/crates/rustix/src/utils.rs (revision b8a62b91)
1/// Convert a `&T` into a `*const T` without using an `as`.
2#[inline]
3#[allow(dead_code)]
4pub(crate) const fn as_ptr<T>(t: &T) -> *const T {
5    t
6}
7
8/// Convert a `&mut T` into a `*mut T` without using an `as`.
9#[inline]
10#[allow(dead_code)]
11pub(crate) fn as_mut_ptr<T>(t: &mut T) -> *mut T {
12    t
13}
14
15/// Convert a `*mut c_void` to a `*mut T`, checking that it is not null,
16/// misaligned, or pointing to a region of memory that wraps around the address
17/// space.
18#[allow(dead_code)]
19pub(crate) fn check_raw_pointer<T>(value: *mut core::ffi::c_void) -> Option<core::ptr::NonNull<T>> {
20    if (value as usize)
21        .checked_add(core::mem::size_of::<T>())
22        .is_none()
23        || (value as usize) % core::mem::align_of::<T>() != 0
24    {
25        return None;
26    }
27
28    core::ptr::NonNull::new(value.cast())
29}
30