pub struct UnsafePinned<T>where
T: ?Sized,{ /* private fields */ }unsafe_pinned)Expand description
This type provides a way to entirely opt-out of typical aliasing rules;
specifically, &mut UnsafePinned<T> is not guaranteed to be a unique pointer.
This also subsumes the effects of UnsafeCell, i.e., &UnsafePinned<T> may point to data
that is being mutated.
However, even if you define your type like pub struct Wrapper(UnsafePinned<...>), it is still
very risky to have an &mut Wrapper that aliases anything else. Many functions that work
generically on &mut T assume that the memory that stores T is uniquely owned (such as
mem::swap). In other words, while having aliasing with &mut Wrapper is not immediate
Undefined Behavior, it is still unsound to expose such a mutable reference to code you do not
control! Techniques such as pinning via Pin are needed to ensure soundness.
Similar to UnsafeCell, UnsafePinned will not usually show up in
the public API of a library. It is an internal implementation detail of libraries that need to
support aliasing mutable references.
This type blocks niches the same way UnsafeCell does.
Implementationsยง
Sourceยงimpl<T> UnsafePinned<T>
impl<T> UnsafePinned<T>
Sourcepub const fn new(value: T) -> UnsafePinned<T>
๐ฌThis is a nightly-only experimental API. (unsafe_pinned)Available on crate feature std only.
pub const fn new(value: T) -> UnsafePinned<T>
unsafe_pinned)std only.Constructs a new instance of UnsafePinned which will wrap the specified value.
All access to the inner value through &UnsafePinned<T> or &mut UnsafePinned<T> or
Pin<&mut UnsafePinned<T>> requires unsafe code.
Sourcepub const fn into_inner(self) -> T
๐ฌThis is a nightly-only experimental API. (unsafe_pinned)Available on crate feature std only.
pub const fn into_inner(self) -> T
unsafe_pinned)std only.Unwraps the value, consuming this UnsafePinned.
Sourceยงimpl<T> UnsafePinned<T>where
T: ?Sized,
impl<T> UnsafePinned<T>where
T: ?Sized,
Sourcepub const fn get_mut_pinned(self: Pin<&mut UnsafePinned<T>>) -> *mut T
๐ฌThis is a nightly-only experimental API. (unsafe_pinned)Available on crate feature std only.
pub const fn get_mut_pinned(self: Pin<&mut UnsafePinned<T>>) -> *mut T
unsafe_pinned)std only.Get read-write access to the contents of a pinned UnsafePinned.
Sourcepub const fn get_mut_unchecked(&mut self) -> *mut T
๐ฌThis is a nightly-only experimental API. (unsafe_pinned)Available on crate feature std only.
pub const fn get_mut_unchecked(&mut self) -> *mut T
unsafe_pinned)std only.Get read-write access to the contents of an UnsafePinned.
You should usually be using get_mut_pinned instead to explicitly track the fact that this
memory is โpinnedโ due to there being aliases.
Sourcepub const fn get(&self) -> *mut T
๐ฌThis is a nightly-only experimental API. (unsafe_pinned)Available on crate feature std only.
pub const fn get(&self) -> *mut T
unsafe_pinned)std only.Get mutable access to the contents of a shared UnsafePinned.
This can be cast to a pointer of any kind. When creating references, you must uphold the
aliasing rules; see UnsafeCell for more discussion and caveats.
#![feature(unsafe_pinned)]
use std::pin::UnsafePinned;
unsafe {
let mut x = UnsafePinned::new(0);
let ptr = x.get();
x.get_mut_unchecked().write(1);
assert_eq!(ptr.read(), 1);
}Sourcepub const fn raw_get(this: *const UnsafePinned<T>) -> *const T
๐ฌThis is a nightly-only experimental API. (unsafe_pinned)Available on crate feature std only.
pub const fn raw_get(this: *const UnsafePinned<T>) -> *const T
unsafe_pinned)std only.Gets an immutable pointer to the wrapped value.
The difference from get is that this function accepts a raw pointer, which is useful to
avoid the creation of temporary references.
Sourcepub const fn raw_get_mut(this: *mut UnsafePinned<T>) -> *mut T
๐ฌThis is a nightly-only experimental API. (unsafe_pinned)Available on crate feature std only.
pub const fn raw_get_mut(this: *mut UnsafePinned<T>) -> *mut T
unsafe_pinned)std only.Gets a mutable pointer to the wrapped value.
The difference from get_mut_pinned and get_mut_unchecked is that this function
accepts a raw pointer, which is useful to avoid the creation of temporary references.
Trait Implementationsยง
Sourceยงimpl<T> Debug for UnsafePinned<T>where
T: ?Sized,
impl<T> Debug for UnsafePinned<T>where
T: ?Sized,
Sourceยงimpl<T> Default for UnsafePinned<T>where
T: Default,
impl<T> Default for UnsafePinned<T>where
T: Default,
Sourceยงfn default() -> UnsafePinned<T>
fn default() -> UnsafePinned<T>
Creates an UnsafePinned, with the Default value for T.
Sourceยงimpl<T> From<T> for UnsafePinned<T>
impl<T> From<T> for UnsafePinned<T>
Sourceยงfn from(value: T) -> UnsafePinned<T>
fn from(value: T) -> UnsafePinned<T>
Creates a new UnsafePinned<T> containing the given value.
impl<T, U> CoerceUnsized<UnsafePinned<U>> for UnsafePinned<T>where
T: CoerceUnsized<U>,
impl<T, U> DispatchFromDyn<UnsafePinned<U>> for UnsafePinned<T>where
T: DispatchFromDyn<U>,
impl<T> Sync for UnsafePinned<T>
impl<T> !Unpin for UnsafePinned<T>where
T: ?Sized,
When this type is used, that almost certainly means safe APIs need to use pinning to avoid the
aliases from becoming invalidated. Therefore letโs mark this as !Unpin. You can always opt
back in to Unpin with an impl block, provided your API is still sound while unpinned.
Auto Trait Implementationsยง
impl<T> !Freeze for UnsafePinned<T>
impl<T> !RefUnwindSafe for UnsafePinned<T>
impl<T> Send for UnsafePinned<T>
impl<T> UnwindSafe for UnsafePinned<T>where
T: UnwindSafe + ?Sized,
Blanket Implementationsยง
Sourceยงimpl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Sourceยงfn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Sourceยงimpl<T> ByteSized for T
impl<T> ByteSized for T
Sourceยงconst BYTE_ALIGN: usize = _
const BYTE_ALIGN: usize = _
Sourceยงfn byte_align(&self) -> usize
fn byte_align(&self) -> usize
Sourceยงfn ptr_size_ratio(&self) -> [usize; 2]
fn ptr_size_ratio(&self) -> [usize; 2]
Sourceยงimpl<T, R> Chain<R> for Twhere
T: ?Sized,
impl<T, R> Chain<R> for Twhere
T: ?Sized,
Sourceยงimpl<T> ExtAny for T
impl<T> ExtAny for T
Sourceยงfn type_hash_with<H: Hasher>(&self, hasher: H) -> u64
fn type_hash_with<H: Hasher>(&self, hasher: H) -> u64
TypeId of Self using a custom hasher.Sourceยงfn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
fn as_any_mut(&mut self) -> &mut dyn Anywhere
Self: Sized,
Sourceยงimpl<T> ExtMem for Twhere
T: ?Sized,
impl<T> ExtMem for Twhere
T: ?Sized,
Sourceยงconst NEEDS_DROP: bool = _
const NEEDS_DROP: bool = _
Sourceยงfn mem_align_of<T>() -> usize
fn mem_align_of<T>() -> usize
Sourceยงfn mem_align_of_val(&self) -> usize
fn mem_align_of_val(&self) -> usize
Sourceยงfn mem_size_of<T>() -> usize
fn mem_size_of<T>() -> usize
Sourceยงfn mem_size_of_val(&self) -> usize
fn mem_size_of_val(&self) -> usize
Sourceยงfn mem_needs_drop(&self) -> bool
fn mem_needs_drop(&self) -> bool
true if dropping values of this type matters. Read moreSourceยงfn mem_forget(self)where
Self: Sized,
fn mem_forget(self)where
Self: Sized,
self without running its destructor. Read moreSourceยงfn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
fn mem_replace(&mut self, other: Self) -> Selfwhere
Self: Sized,
Sourceยงunsafe fn mem_zeroed<T>() -> T
unsafe fn mem_zeroed<T>() -> T
unsafe_layout only.T represented by the all-zero byte-pattern. Read moreSourceยงunsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe fn mem_transmute_copy<Src, Dst>(src: &Src) -> Dst
unsafe_layout only.T represented by the all-zero byte-pattern. Read moreSourceยงfn mem_as_bytes(&self) -> &[u8] โ
fn mem_as_bytes(&self) -> &[u8] โ
unsafe_slice only.ยงimpl<S> FromSample<S> for S
impl<S> FromSample<S> for S
fn from_sample_(s: S) -> S
Sourceยงimpl<T> Hook for T
impl<T> Hook for T
Sourceยงimpl<T> IntoEither for T
impl<T> IntoEither for T
Sourceยงfn into_either(self, into_left: bool) -> Either<Self, Self> โ
fn into_either(self, into_left: bool) -> Either<Self, Self> โ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSourceยงfn into_either_with<F>(self, into_left: F) -> Either<Self, Self> โ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> โ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more