Remove WeakRef and NonNullPtr impl for Weak<T>
This commit is contained in:
parent
b46a02463b
commit
c4e8bf2c21
|
|
@ -5,7 +5,6 @@
|
|||
|
||||
mod either;
|
||||
|
||||
use alloc::sync::Weak;
|
||||
use core::{marker::PhantomData, mem::ManuallyDrop, ops::Deref, ptr::NonNull};
|
||||
|
||||
use crate::prelude::*;
|
||||
|
|
@ -202,59 +201,3 @@ unsafe impl<T: 'static> NonNullPtr for Arc<T> {
|
|||
NonNullPtr::into_raw(ManuallyDrop::into_inner(ptr_ref.inner))
|
||||
}
|
||||
}
|
||||
|
||||
/// A type that represents `&'a Weak<T>`.
|
||||
#[derive(Debug)]
|
||||
pub struct WeakRef<'a, T> {
|
||||
inner: ManuallyDrop<Weak<T>>,
|
||||
_marker: PhantomData<&'a Weak<T>>,
|
||||
}
|
||||
|
||||
impl<T> Deref for WeakRef<'_, T> {
|
||||
type Target = Weak<T>;
|
||||
|
||||
fn deref(&self) -> &Self::Target {
|
||||
&self.inner
|
||||
}
|
||||
}
|
||||
|
||||
unsafe impl<T: 'static> NonNullPtr for Weak<T> {
|
||||
type Target = T;
|
||||
|
||||
type Ref<'a>
|
||||
= WeakRef<'a, T>
|
||||
where
|
||||
Self: 'a;
|
||||
|
||||
// The alignment of `Weak<T>` is 1 instead of `align_of::<T>()`.
|
||||
// This is because `Weak::new()` uses a dangling pointer that is _not_ aligned.
|
||||
const ALIGN_BITS: u32 = 0;
|
||||
|
||||
fn into_raw(self) -> NonNull<Self::Target> {
|
||||
let ptr = Weak::into_raw(self).cast_mut();
|
||||
|
||||
// SAFETY: The pointer representing an `Weak` can never be NULL.
|
||||
unsafe { NonNull::new_unchecked(ptr) }
|
||||
}
|
||||
|
||||
unsafe fn from_raw(ptr: NonNull<Self::Target>) -> Self {
|
||||
let ptr = ptr.as_ptr().cast_const();
|
||||
|
||||
// SAFETY: The safety is upheld by the caller.
|
||||
unsafe { Weak::from_raw(ptr) }
|
||||
}
|
||||
|
||||
unsafe fn raw_as_ref<'a>(raw: NonNull<Self::Target>) -> Self::Ref<'a> {
|
||||
// SAFETY: The safety is upheld by the caller.
|
||||
unsafe {
|
||||
WeakRef {
|
||||
inner: ManuallyDrop::new(Weak::from_raw(raw.as_ptr())),
|
||||
_marker: PhantomData,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn ref_as_raw(ptr_ref: Self::Ref<'_>) -> NonNull<Self::Target> {
|
||||
NonNullPtr::into_raw(ManuallyDrop::into_inner(ptr_ref.inner))
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue