Struct tagged_pointer::TaggedPtr
source · #[repr(transparent)]pub struct TaggedPtr<T, const BITS: usize>(_);
Expand description
A tagged pointer: a space-efficient representation of a pointer and integer tag.
This type stores a pointer and an integer tag without taking up more space than a normal pointer (unless the fallback implementation is used; see the crate documentation).
The tagged pointer conceptually holds a NonNull<T>
and a
certain number of bits of an integer tag.
BITS
specifies how many bits are used for the tag. The alignment of T
must be large enough to store this many bits; see Self::new
.
Implementations§
source§impl<T, const BITS: usize> TaggedPtr<T, BITS>
impl<T, const BITS: usize> TaggedPtr<T, BITS>
sourcepub fn new(ptr: NonNull<T>, tag: usize) -> Self
pub fn new(ptr: NonNull<T>, tag: usize) -> Self
Creates a new tagged pointer. Only the lower BITS
bits of tag
are
stored.
A check is performed at compile time to ensure that the alignment of
T
is not less than 2BITS
(1 << BITS
). This ensures
that all properly aligned pointers to T
will be aligned enough to
store the specified number of bits of the tag.
Panics
ptr
should be “dereferenceable” in the sense defined by
core::ptr
.1 If it is not, this function or
methods of TaggedPtr
may panic.
It is recommended that ptr
be properly aligned (i.e., aligned to at
least mem::align_of::<T>()
), but it may have a
smaller alignment. However, if its alignment is not at least
2BITS
, this function may panic.
It is permissible for only the first 2
BITS
bytes ofptr
to be dereferenceable. ↩
sourcepub fn get(self) -> (NonNull<T>, usize)
pub fn get(self) -> (NonNull<T>, usize)
Gets the pointer and tag stored by the tagged pointer. If you need
both the pointer and tag, this method may be more efficient than
calling Self::ptr
and Self::tag
separately.
Panics
If the pointer provided to Self::new
wasn’t
“dereferenceable”, this method may panic.
sourcepub fn ptr(self) -> NonNull<T>
pub fn ptr(self) -> NonNull<T>
Gets the pointer stored by the tagged pointer, without the tag.
Equivalent to self.get().0
.
Panics
If the pointer provided to Self::new
wasn’t
“dereferenceable”, this method may panic.
sourcepub fn tag(self) -> usize
pub fn tag(self) -> usize
Gets the tag stored by the tagged pointer. Equivalent to
self.get().1
.
Panics
If the pointer provided to Self::new
wasn’t
“dereferenceable”, this method may panic.
Trait Implementations§
source§impl<T, const BITS: usize> Ord for TaggedPtr<T, BITS>
impl<T, const BITS: usize> Ord for TaggedPtr<T, BITS>
source§impl<T, const BITS: usize> PartialEq<TaggedPtr<T, BITS>> for TaggedPtr<T, BITS>
impl<T, const BITS: usize> PartialEq<TaggedPtr<T, BITS>> for TaggedPtr<T, BITS>
source§impl<T, const BITS: usize> PartialOrd<TaggedPtr<T, BITS>> for TaggedPtr<T, BITS>
impl<T, const BITS: usize> PartialOrd<TaggedPtr<T, BITS>> for TaggedPtr<T, BITS>
1.0.0 · source§fn le(&self, other: &Rhs) -> bool
fn le(&self, other: &Rhs) -> bool
self
and other
) and is used by the <=
operator. Read more