SendPtr<T>: Send wrapper around NonNull<T>

This commit is contained in:
Janis 2025-02-21 20:03:47 +01:00
parent 52fea2e306
commit cd4c5467ba

View file

@ -4,6 +4,7 @@ mod util {
marker::PhantomData, marker::PhantomData,
mem::ManuallyDrop, mem::ManuallyDrop,
num::NonZero, num::NonZero,
ops::{Deref, DerefMut},
ptr::NonNull, ptr::NonNull,
sync::atomic::{AtomicPtr, Ordering}, sync::atomic::{AtomicPtr, Ordering},
}; };
@ -30,6 +31,41 @@ mod util {
} }
} }
#[repr(transparent)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct SendPtr<T>(NonNull<T>);
impl<T> std::fmt::Pointer for SendPtr<T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
<NonNull<T> as core::fmt::Pointer>::fmt(&self.0, f)
}
}
unsafe impl<T> Send for SendPtr<T> {}
impl<T> Deref for SendPtr<T> {
type Target = NonNull<T>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<T> DerefMut for SendPtr<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
impl<T> SendPtr<T> {
pub fn new(ptr: *mut T) -> Option<Self> {
NonNull::new(ptr).map(Self)
}
pub unsafe fn new_unchecked(ptr: *mut T) -> Self {
unsafe { Self(NonNull::new_unchecked(ptr)) }
}
}
#[repr(transparent)] #[repr(transparent)]
pub struct TaggedAtomicPtr<T, const BITS: usize>(AtomicPtr<()>, PhantomData<T>); pub struct TaggedAtomicPtr<T, const BITS: usize>(AtomicPtr<()>, PhantomData<T>);