Add pointer masking convenience functions
This commit adds the following functions all of which have a signature `pointer, usize -> pointer`: - `<*mut T>::mask` - `<*const T>::mask` - `intrinsics::ptr_mask` These functions are equivalent to `.map_addr(|a| a & mask)` but they utilize `llvm.ptrmask` llvm intrinsic. *masks your pointers*
This commit is contained in:
parent
48853a361a
commit
10270f4b44
8 changed files with 65 additions and 1 deletions
|
@ -575,6 +575,21 @@ impl<T: ?Sized> *mut T {
|
|||
)
|
||||
}
|
||||
|
||||
/// Masks out bits of the pointer according to a mask.
|
||||
///
|
||||
/// This is convenience for `ptr.map_addr(|a| a & mask)`.
|
||||
///
|
||||
/// For non-`Sized` pointees this operation changes only the data pointer,
|
||||
/// leaving the metadata untouched.
|
||||
#[cfg(not(bootstrap))]
|
||||
#[unstable(feature = "ptr_mask", issue = "none")]
|
||||
#[must_use = "returns a new pointer rather than modifying its argument"]
|
||||
#[inline(always)]
|
||||
pub fn mask(self, mask: usize) -> *mut T {
|
||||
let this = intrinsics::ptr_mask(self.cast::<()>(), mask) as *mut ();
|
||||
from_raw_parts_mut::<T>(this, metadata(self))
|
||||
}
|
||||
|
||||
/// Returns `None` if the pointer is null, or else returns a unique reference to
|
||||
/// the value wrapped in `Some`. If the value may be uninitialized, [`as_uninit_mut`]
|
||||
/// must be used instead.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue