Trait rustc_data_structures::tagged_ptr::Pointer
source · pub unsafe trait Pointer: Deref {
const BITS: usize;
fn into_usize(self) -> usize;
unsafe fn from_usize(ptr: usize) -> Self;
unsafe fn with_ref<R, F: FnOnce(&Self) -> R>(ptr: usize, f: F) -> R;
}
Expand description
This describes the pointer type encapsulated by TaggedPtr.
Safety
The usize returned from into_usize
must be a valid, dereferenceable,
pointer to <Self as Deref>::Target
. Note that pointers to Pointee
must
be thin, even though Pointee
may not be sized.
Note that the returned pointer from into_usize
should be castable to &mut <Self as Deref>::Target
if Pointer: DerefMut
.
The BITS constant must be correct. At least BITS
bits, least-significant,
must be zero on all returned pointers from into_usize
.
For example, if the alignment of Pointee
is 2, then BITS
should be 1.
Required Associated Constants§
sourceconst BITS: usize
const BITS: usize
Most likely the value you want to use here is the following, unless
your Pointee type is unsized (e.g., ty::List<T>
in rustc) in which
case you’ll need to manually figure out what the right type to pass to
align_of is.
std::mem::align_of::<<Self as Deref>::Target>().trailing_zeros() as usize;
Required Methods§
fn into_usize(self) -> usize
sourceunsafe fn from_usize(ptr: usize) -> Self
unsafe fn from_usize(ptr: usize) -> Self
Safety
The passed ptr
must be returned from into_usize
.
This acts as ptr::read
semantically, it should not be called more than
once on non-Copy
Pointer
s.
sourceunsafe fn with_ref<R, F: FnOnce(&Self) -> R>(ptr: usize, f: F) -> R
unsafe fn with_ref<R, F: FnOnce(&Self) -> R>(ptr: usize, f: F) -> R
This provides a reference to the Pointer
itself, rather than the
Deref::Target
. It is used for cases where we want to call methods that
may be implement differently for the Pointer than the Pointee (e.g.,
Rc::clone
vs cloning the inner value).
Safety
The passed ptr
must be returned from into_usize
.