SendPtr<T>: Send wrapper around NonNull<T>
This commit is contained in:
parent
52fea2e306
commit
cd4c5467ba
|
@ -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>);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue