FlaggedPtr

Struct FlaggedPtr 

Source
pub struct FlaggedPtr<P, F, M>
where P: PtrMeta<M>, F: FlagMeta, M: Copy,
{ /* private fields */ }
Expand description

A pointer that stores flags within unused bits of the pointer representation.

This struct combines a pointer and flag information into a single usize value by utilizing unused bits in the pointer due to alignment requirements.

§Type Parameters

  • P: The pointer type (e.g., Box<T>, NonNull<T>, Rc<T>)
  • F: The flag type (must implement FlagMeta)
  • M: Metadata associated with the pointer

§Examples

use flagged_pointer::FlaggedPtr;
use enumflags2::{bitflags, BitFlags};

#[bitflags]
#[repr(u8)]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
enum Color {
    Red = 1 << 0,
    Blue = 1 << 1,
    Green = 1 << 2,
}

let boxed = Box::new("hello");
let flagged = FlaggedPtr::new(boxed, Color::Red | Color::Blue);

assert_eq!(*flagged, "hello");
assert_eq!(flagged.flag(), Color::Red | Color::Blue);

§Example with trait object

use flagged_pointer::alias::*;
use std::sync::Arc;
use ptr_meta::pointee;
use enumflags2::{bitflags,BitFlags};

#[bitflags]
#[repr(u8)]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
enum Color {
    Red = 1 << 0,
    Blue = 1 << 1,
    Green = 1 << 2,
}

#[ptr_meta::pointee]
trait MyTrait {
   fn method(&self);
}

impl MyTrait for i64 {
   fn method(&self) {
       println!("i32 method");
   }
}

impl MyTrait for String {
   fn method(&self) {
       println!("String method");
   }
}

let trait_obj: FlaggedBoxDyn<dyn MyTrait, BitFlags<Color>> = FlaggedBoxDyn::new(Box::new(42_i64), Color::Red | Color::Blue);
trait_obj.method();
let trait_obj: FlaggedArcDyn<dyn MyTrait, BitFlags<Color>> = FlaggedArcDyn::new(Arc::new("hello".to_string()), Color::Red | Color::Blue);
trait_obj.method();

Implementations§

Source§

impl<P, F, M> FlaggedPtr<P, F, M>
where P: PtrMeta<M>, F: FlagMeta, M: Copy,

Source

pub fn new(ptr: P, flag: F) -> Self

Creates a new FlaggedPtr from a pointer and flags.

§Arguments
  • ptr: The pointer to store
  • flag: The flags to encode in the unused bits
§Examples
use flagged_pointer::FlaggedPtr;
use enumflags2::bitflags;
use std::ptr::NonNull;

#[bitflags]
#[repr(u8)]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
enum MyFlags {
    A = 1 << 0,
    B = 1 << 1,
}

let boxed = Box::new(42);
let flagged = FlaggedPtr::new(boxed, MyFlags::A | MyFlags::B);
assert_eq!(*flagged, 42);
§Panics

Panics if the pointer and flag bits overlap, which should not happen for properly aligned pointers and reasonable flag values.

Source§

impl<P, F, M> FlaggedPtr<P, F, M>
where P: PtrMeta<M>, F: FlagMeta, M: Copy,

Source

pub fn flag(&self) -> F

Returns the flags stored in this pointer.

§Examples
use flagged_pointer::FlaggedPtr;
use enumflags2::bitflags;

#[bitflags]
#[repr(u8)]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
enum MyFlags {
    A = 1 << 0,
    B = 1 << 1,
}

let boxed = Box::new(123);
let flagged = FlaggedPtr::new(boxed, MyFlags::A | MyFlags::B);
assert_eq!(flagged.flag(), MyFlags::A | MyFlags::B);
Source

pub fn set_flag(&mut self, flag: F)

Sets new flags for this pointer.

§Arguments
  • flag: The new flags to set
§Examples
use flagged_pointer::FlaggedPtr;
use enumflags2::bitflags;

#[bitflags]
#[repr(u8)]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
enum MyFlags {
    A = 1 << 0,
    B = 1 << 1,
}

let boxed = Box::new(123);
let mut flagged = FlaggedPtr::new(boxed, MyFlags::A | MyFlags::B);
flagged.set_flag(MyFlags::B.into());
assert_eq!(flagged.flag(), MyFlags::B);
Source

pub fn dissolve(self) -> (P, F)

Consumes this FlaggedPtr and returns the original pointer and flags.

This is the inverse operation of new().

§Returns

A tuple containing (original_pointer, flags)

§Examples
use flagged_pointer::FlaggedPtr;
use enumflags2::bitflags;

#[bitflags]
#[repr(u8)]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
enum MyFlags {
    A = 1 << 0,
    B = 1 << 1,
}

let boxed = Box::new(42);
let flagged = FlaggedPtr::new(boxed, MyFlags::A | MyFlags::B);
let (recovered_box, flags) = flagged.dissolve();

assert_eq!(*recovered_box, 42);
assert_eq!(flags, MyFlags::A | MyFlags::B);
Source

pub fn as_ptr(&self) -> NonNull<P::Pointee>

Returns a raw pointer to the pointee.

§Safety

The caller must ensure that the pointer is valid for the lifetime of self.

§Examples
use flagged_pointer::FlaggedPtr;
use enumflags2::bitflags;

#[bitflags]
#[repr(u8)]
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
enum MyFlags {
    A = 1 << 0,
    B = 1 << 1,
}

let boxed = Box::new(123);
let flagged = FlaggedPtr::new(boxed, MyFlags::A | MyFlags::B);
let ptr = flagged.as_ptr();
assert_eq!(unsafe { *ptr.as_ref() }, 123);

Trait Implementations§

Source§

impl<P, F, M> Clone for FlaggedPtr<P, F, M>
where P: PtrMeta<M> + Clone, F: FlagMeta, M: Copy,

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<P, F, M> Deref for FlaggedPtr<P, F, M>
where P: PtrMeta<M> + Deref<Target = P::Pointee>, F: FlagMeta, M: Copy,

Source§

type Target = <P as PtrMeta<M>>::Pointee

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl<P, F, M> DerefMut for FlaggedPtr<P, F, M>
where P: PtrMeta<M> + DerefMut<Target = P::Pointee>, F: FlagMeta, M: Copy,

Source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
Source§

impl<P, F, M> Drop for FlaggedPtr<P, F, M>
where P: PtrMeta<M>, F: FlagMeta, M: Copy,

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<P, F, M> Send for FlaggedPtr<P, F, M>
where P: PtrMeta<M> + Send, F: FlagMeta + Send, M: Send + Copy,

Source§

impl<P, F, M> Sync for FlaggedPtr<P, F, M>
where P: PtrMeta<M> + Sync, F: FlagMeta + Sync, M: Sync + Copy,

Auto Trait Implementations§

§

impl<P, F, M> Freeze for FlaggedPtr<P, F, M>
where M: Freeze,

§

impl<P, F, M> RefUnwindSafe for FlaggedPtr<P, F, M>

§

impl<P, F, M> Unpin for FlaggedPtr<P, F, M>
where M: Unpin, P: Unpin, F: Unpin,

§

impl<P, F, M> UnwindSafe for FlaggedPtr<P, F, M>
where M: UnwindSafe, P: UnwindSafe, F: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Pointee for T

Source§

type Metadata = ()

The metadata type for pointers and references to this type.
Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.