Trait Unpin
auto trait Unpin
Types that do not require any pinning guarantees.
For information on what "pinning" is, see the pin module documentation.
Implementing the Unpin trait for T expresses the fact that T is pinning-agnostic:
it shall not expose nor rely on any pinning guarantees. This, in turn, means that a
Pin-wrapped pointer to such a type can feature a fully unrestricted API.
In other words, if T: Unpin, a value of type T will not be bound by the invariants
which pinning otherwise offers, even when "pinned" by a Pin<Ptr> pointing at it.
When a value of type T is pointed at by a Pin<Ptr>, Pin will not restrict access
to the pointee value like it normally would, thus allowing the user to do anything that they
normally could with a non-Pin-wrapped Ptr to that value.
The idea of this trait is to alleviate the reduced ergonomics of APIs that require the use
of Pin for soundness for some types, but which also want to be used by other types that
don't care about pinning. The prime example of such an API is Future::poll. There are many
Future types that don't care about pinning. These futures can implement Unpin and
therefore get around the pinning related restrictions in the API, while still allowing the
subset of Futures which do require pinning to be implemented soundly.
For more discussion on the consequences of Unpin within the wider scope of the pinning
system, see the section about Unpin in the pin module.
Unpin has no consequence at all for non-pinned data. In particular, mem::replace happily
moves !Unpin data, which would be immovable when pinned (mem::replace works for any
&mut T, not just when T: Unpin).
However, you cannot use mem::replace on !Unpin data which is pinned by being wrapped
inside a Pin<Ptr> pointing at it. This is because you cannot (safely) use a
Pin<Ptr> to get a &mut T to its pointee value, which you would need to call
mem::replace, and that is what makes this system work.
So this, for example, can only be done on types implementing Unpin:
#
use mem;
use Pin;
let mut string = "this".to_string;
let mut pinned_string = new;
// We need a mutable reference to call `mem::replace`.
// We can obtain such a reference by (implicitly) invoking `Pin::deref_mut`,
// but that is only possible because `String` implements `Unpin`.
replace;
This trait is automatically implemented for almost every type. The compiler is free
to take the conservative stance of marking types as Unpin so long as all of the types that
compose its fields are also Unpin. This is because if a type implements Unpin, then it
is unsound for that type's implementation to rely on pinning-related guarantees for soundness,
even when viewed through a "pinning" pointer! It is the responsibility of the implementor of
a type that relies upon pinning for soundness to ensure that type is not marked as Unpin
by adding PhantomPinned field. For more details, see the pin module docs.
Implementors
impl<'a, P> Unpin for RMatches<'a, P>impl Unpin for isizeimpl<T> Unpin for Yeet<T>impl Unpin for int64x2_timpl Unpin for ParseIntErrorimpl<I> Unpin for Peekable<I>impl Unpin for float16x4x2_timpl<T> Unpin for PhantomContravariant<T>impl Unpin for AtomicU8impl<T> Unpin for Reverse<T>impl Unpin for float64x2x3_timpl Unpin for ParseBoolErrorimpl Unpin for f32impl Unpin for float32x2_timpl<I> Unpin for Cycle<I>impl Unpin for poly16x8x4_timpl<A> Unpin for RangeFromIter<A>impl Unpin for __m128bhimpl<'a, T> Unpin for Chunks<'a, T>impl<T, N: usize> Unpin for Simd<T, N>impl<'a> Unpin for ContextBuilder<'a>impl Unpin for Fieldimpl Unpin for CStrimpl Unpin for int16x8x3_timpl<'a, A> Unpin for Iter<'a, A>impl Unpin for poly64x2x2_timpl<'a, T> Unpin for Iter<'a, T>impl Unpin for vector_signed_shortimpl<'a, 'b, N: usize> Unpin for CharArrayRefSearcher<'a, 'b, N>impl Unpin for LocalWakerimpl Unpin for SimdAlignimpl<'b, T> Unpin for RefMut<'b, T>impl Unpin for uint8x16x2_timpl<A> Unpin for Repeat<A>impl Unpin for int64x1x4_timpl<'a, 'b> Unpin for DebugMap<'a, 'b>impl Unpin for vector_unsigned_longimpl<'a> Unpin for Lines<'a>impl Unpin for usizeimpl Unpin for TypeIdimpl Unpin for uint64x2_timpl<T> Unpin for Rev<T>impl Unpin for float16x4x3_timpl Unpin for AtomicI16impl Unpin for float64x2x4_timpl<'a> Unpin for Chars<'a>impl Unpin for f64impl Unpin for int64x1_timpl<I> Unpin for Enumerate<I>impl Unpin for int32x2x2_timpl<Idx> Unpin for Range<Idx>impl Unpin for __m256bhimpl<'a, T> Unpin for ChunksMut<'a, T>impl Unpin for boolimpl Unpin for Layoutimpl Unpin for FromBytesWithNulErrorimpl Unpin for int16x8x4_timpl<'a, A> Unpin for IterMut<'a, A>impl Unpin for Orderingimpl Unpin for poly64x2x3_timpl<'a, T> Unpin for IterMut<'a, T>impl Unpin for vector_unsigned_shortimpl<'a, 'b> Unpin for CharSliceSearcher<'a, 'b>impl<T> Unpin for UnsafeCell<T>impl Unpin for uint8x16x3_timpl<'a> Unpin for Source<'a>impl<A> Unpin for RepeatN<A>impl Unpin for int64x2x2_timpl<F> Unpin for FromFn<F>impl Unpin for vector_bool_longimpl<'a> Unpin for LinesAny<'a>impl<Ret, T> Unpin for fn(_: T) -> Retimpl<T, N: usize> Unpin for IntoIter<T, N>impl Unpin for poly64x2_timpl<'a> Unpin for Request<'a>impl<I, St, F> Unpin for Scan<I, St, F>impl Unpin for float16x4x4_timpl Unpin for AtomicU16impl Unpin for v128impl Unpin for ReturnToArgimpl<'a> Unpin for CharIndices<'a>impl Unpin for f128impl Unpin for uint64x1_timpl<I, P> Unpin for Filter<I, P>impl Unpin for int32x2x3_timpl<Idx> Unpin for RangeInclusive<Idx>impl Unpin for __m512bhimpl<'a, T> Unpin for ChunksExact<'a, T>impl Unpin for neverimpl Unpin for LayoutErrorimpl Unpin for FromBytesUntilNulErrorimpl Unpin for uint16x4x2_timpl<A> Unpin for IntoIter<A>impl Unpin for poly64x2x4_timpl<'a, T, P> Unpin for Split<'a, T, P>impl Unpin for vector_bool_shortimpl<'a, F> Unpin for CharPredicateSearcher<'a, F>impl<T> Unpin for SyncUnsafeCell<T>impl Unpin for uint8x16x4_timpl<F> Unpin for RepeatWith<F>impl Unpin for int64x2x3_timpl<T> Unpin for NumBuffer<T>impl Unpin for vector_doubleimpl<'a> Unpin for SplitWhitespace<'a>impl Unpin for PhantomPinnedimpl Unpin for TryFromSliceErrorimpl Unpin for float16x4_timpl<I> Unpin for Skip<I>impl Unpin for float16x8x2_timpl Unpin for AtomicI32impl Unpin for vector_signed_charimpl<'a> Unpin for Bytes<'a>impl Unpin for i8impl Unpin for TryFromIntErrorimpl<B, C> Unpin for ControlFlow<B, C>impl Unpin for poly64x1_timpl<I, F> Unpin for FilterMap<I, F>impl Unpin for int32x2x4_timpl<Idx> Unpin for RangeFrom<Idx>impl Unpin for __m128himpl<'a, T> Unpin for ChunksExactMut<'a, T>impl Unpin for charimpl Unpin for AllocErrorimpl<'a> Unpin for Bytes<'a>impl Unpin for uint16x4x3_timpl<T> Unpin for PhantomCovariant<T>impl Unpin for IntErrorKindimpl<A> Unpin for OptionFlatten<A>impl Unpin for CpuidResultimpl<'a, T, P> Unpin for SplitInclusive<'a, T, P>impl Unpin for vector_signed_intimpl<'a, 'b> Unpin for StrSearcher<'a, 'b>impl Unpin for ParseCharErrorimpl Unpin for poly8x8x2_timpl<T, F> Unpin for Successors<T, F>impl Unpin for int64x2x4_timpl Unpin for Alignmentimpl Unpin for f16x2impl<'a> Unpin for SplitAsciiWhitespace<'a>impl<T: PointeeSized> Unpin for &Timpl Unpin for AsciiCharimpl Unpin for float16x8_timpl<I, P> Unpin for SkipWhile<I, P>impl Unpin for float16x8x3_timpl Unpin for AtomicU32impl Unpin for vector_unsigned_charimpl<'a, P> Unpin for Split<'a, P>impl Unpin for i16impl<Y, R> Unpin for CoroutineState<Y, R>impl Unpin for int8x16_timpl Unpin for Arrayimpl<I, U, F> Unpin for FlatMap<I, U, F>impl Unpin for int32x4x2_timpl<Idx> Unpin for RangeToInclusive<Idx>impl Unpin for __m256himpl<'a, T, N: usize> Unpin for ArrayWindows<'a, T, N>impl Unpin for ()impl Unpin for SYimpl<'a> Unpin for VaList<'a>impl Unpin for uint16x4x4_timpl Unpin for AtomicOrderingimpl Unpin for objc_classimpl Unpin for __m128iimpl<'a, T, P> Unpin for SplitMut<'a, T, P>impl Unpin for vector_unsigned_intimpl<'a> Unpin for Utf8Chunk<'a>impl Unpin for CharTryFromErrorimpl Unpin for poly8x8x3_timpl Unpin for IpAddrimpl Unpin for uint64x1x2_timpl Unpin for Errorimpl Unpin for m256iimpl<'a, P> Unpin for SplitInclusive<'a, P>impl<T: PointeeSized> Unpin for &mut Timpl Unpin for EscapeDefaultimpl Unpin for int8x8x2_timpl<I> Unpin for StepBy<I>impl Unpin for float16x8x4_timpl Unpin for BasicBlockimpl Unpin for AtomicI64impl Unpin for vector_bool_charimpl<'a, P> Unpin for RSplit<'a, P>impl Unpin for i32impl Unpin for RangeFullimpl Unpin for uint8x16_timpl<I> Unpin for Flatten<I>impl Unpin for int32x4x3_timpl<T, E> Unpin for Result<T, E>impl Unpin for __m512himpl<'a, T> Unpin for RChunks<'a, T>impl<T, N: usize> Unpin for [MaybeUninit<T>; N]impl Unpin for int8x8_timpl Unpin for c_voidimpl Unpin for uint16x8x2_timpl Unpin for objc_selectorimpl Unpin for __m128impl<'a, T, P> Unpin for SplitInclusiveMut<'a, T, P>impl Unpin for vector_bool_intimpl<'a> Unpin for Utf8Chunks<'a>impl<I> Unpin for DecodeUtf16<I>impl Unpin for poly8x8x4_timpl Unpin for Ipv4Addrimpl Unpin for uint64x1x3_timpl Unpin for Signimpl Unpin for m256impl<'a> Unpin for EncodeUtf16<'a>impl<T: PointeeSized> Unpin for *const Timpl Unpin for ByteStrimpl Unpin for int8x8x3_timpl<'a> Unpin for PhantomInvariantLifetime<'a>impl<I> Unpin for Take<I>impl Unpin for float32x2x2_timpl Unpin for AtomicU64impl Unpin for vector_signed_shortimpl Unpin for FpCategoryimpl<'a, P> Unpin for SplitTerminator<'a, P>impl Unpin for i64impl Unpin for TypeKindimpl<Idx> Unpin for Range<Idx>impl Unpin for poly8x16_timpl<I> Unpin for Fuse<I>impl Unpin for int32x4x4_timpl<'a, T> Unpin for Iter<'a, T>impl Unpin for bf16impl<'a, T> Unpin for RChunksMut<'a, T>impl<N: usize> Unpin for [u8; N]impl Unpin for Infallibleimpl Unpin for Lastimpl Unpin for uint8x8_timpl<'data> Unpin for BorrowedBuf<'data>impl Unpin for uint16x8x3_timpl<'a> Unpin for Location<'a>impl Unpin for __m128dimpl<'a, T, P> Unpin for RSplit<'a, T, P>impl Unpin for vector_signed_long_longimpl Unpin for Durationimpl Unpin for DecodeUtf16Errorimpl Unpin for poly8x16x2_timpl Unpin for Ipv6Addrimpl Unpin for uint64x1x4_timpl Unpin for DebugAsHeximpl Unpin for m256dimpl<'a> Unpin for EscapeDebug<'a>impl<T: PointeeSized> Unpin for *mut Timpl<T, F> Unpin for LazyCell<T, F>impl Unpin for int8x8x4_timpl<I, P> Unpin for TakeWhile<I, P>impl Unpin for float32x2x3_timpl Unpin for AtomicIsizeimpl Unpin for vector_unsigned_shortimpl<T, F> Unpin for DropGuard<T, F>impl<'a, P> Unpin for RSplitTerminator<'a, P>impl Unpin for i128impl<Idx> Unpin for RangeFrom<Idx>impl Unpin for int16x8_timpl<I, F> Unpin for Inspect<I, F>impl Unpin for uint32x2x2_timpl<'a, T> Unpin for IterMut<'a, T>impl Unpin for float64x1_timpl<'a, T> Unpin for RChunksExact<'a, T>impl<T, N: usize> Unpin for [T; N]impl Unpin for Localityimpl Unpin for poly8x8_timpl<'a> Unpin for BorrowedCursor<'a>impl Unpin for uint16x8x4_timpl<'a> Unpin for PanicInfo<'a>impl Unpin for __m256iimpl<'a, T, P> Unpin for RSplitMut<'a, T, P>impl Unpin for vector_unsigned_long_longimpl Unpin for TryFromFloatSecsErrorimpl Unpin for EscapeUnicodeimpl Unpin for poly8x16x3_timpl Unpin for Ipv6MulticastScopeimpl Unpin for uint64x2x2_timpl Unpin for UnwindTerminateReasonimpl Unpin for FormattingOptionsimpl Unpin for m128iimpl<'a> Unpin for EscapeDefault<'a>impl<T> Unpin for Saturating<T>impl<I> Unpin for FromIter<I>impl<T> Unpin for OnceCell<T>impl Unpin for int8x16x2_timpl<A, B> Unpin for Zip<A, B>impl Unpin for float32x2x4_timpl Unpin for AtomicUsizeimpl Unpin for vector_bool_shortimpl<'a, P> Unpin for SplitN<'a, P>impl Unpin for u8impl<Idx> Unpin for RangeTo<Idx>impl Unpin for uint16x8_timpl<I> Unpin for Intersperse<I>impl Unpin for uint32x2x3_timpl<Idx> Unpin for Clamp<Idx>impl<T> Unpin for IntoIter<T>impl Unpin for float64x2_timpl<'a, T> Unpin for RChunksExactMut<'a, T>impl<T, N: usize> Unpin for [Option<T>; N]impl Unpin for int16x4_timpl<'a> Unpin for PhantomContravariantLifetime<'a>impl<I, N: usize> Unpin for ArrayChunks<I, N>impl Unpin for poly16x4x2_timpl<'a> Unpin for PanicMessage<'a>impl Unpin for __m256impl<'a, T, P> Unpin for SplitN<'a, T, P>impl Unpin for vector_bool_long_longimpl<T> Unpin for Pending<T>impl Unpin for EscapeDefaultimpl Unpin for poly8x16x4_timpl Unpin for AddrParseErrorimpl Unpin for uint64x2x3_timpl<'a> Unpin for Formatter<'a>impl Unpin for m128impl<'a> Unpin for EscapeUnicode<'a>impl<T: PointeeSized> Unpin for *const T: TyPat { hir_id: HirId(DefId(0:11123 ~ core[fa69]::pat::{impl#3}).12), kind: NotNull, span: library/core/src/pat.rs:87:59: 87:64 (#0) }impl<T> Unpin for Cell<T>impl Unpin for int8x16x3_timpl<T> Unpin for Empty<T>impl Unpin for float32x4x2_timpl<T> Unpin for Exclusive<T>impl Unpin for vector_signed_intimpl<'a, P> Unpin for RSplitN<'a, P>impl Unpin for u16impl<Idx> Unpin for RangeInclusive<Idx>impl Unpin for poly16x8_timpl<I, G> Unpin for IntersperseWith<I, G>impl Unpin for uint32x2x4_timpl Unpin for AtomicBoolimpl Unpin for float64x1x2_timpl<'a, T, P> Unpin for ChunkBy<'a, T, P>impl<T> Unpin for [T]impl Unpin for uint16x4_timpl<'a, I> Unpin for ByRefSized<'a, I>impl Unpin for poly16x4x3_timpl<T> Unpin for AssertUnwindSafe<T>impl Unpin for __m256dimpl<'a, T, P> Unpin for RSplitN<'a, T, P>impl Unpin for vector_floatimpl Unpin for Typeimpl<T> Unpin for Poll<T>impl Unpin for EscapeDebugimpl Unpin for int16x4x2_timpl Unpin for SocketAddrimpl Unpin for uint64x2x4_timpl Unpin for Assumeimpl<T> Unpin for PhantomInvariant<T>impl<'a> Unpin for Arguments<'a>impl Unpin for m128dimpl<Dyn: PointeeSized> Unpin for DynMetadata<Dyn>impl<'a> Unpin for Utf8Pattern<'a>impl<T: ?Sized> Unpin for UnsafePinned<T>impl<'a> Unpin for PhantomCovariantLifetime<'a>impl Unpin for Tupleimpl<T> Unpin for RefCell<T>impl Unpin for int8x16x4_timpl<T> Unpin for MaybeUninit<T>impl<G> Unpin for FromCoroutine<G>impl Unpin for float32x4x3_timpl<'a, 'b> Unpin for DebugStruct<'a, 'b>impl Unpin for vector_unsigned_intimpl<'a, P> Unpin for MatchIndices<'a, P>impl Unpin for u32impl<Idx> Unpin for RangeToInclusive<Idx>impl Unpin for int32x4_timpl<T> Unpin for NonNull<T>impl<I, F> Unpin for Map<I, F>impl Unpin for uint32x4x2_timpl<T> Unpin for AtomicPtr<T>impl Unpin for float64x1x3_timpl<'a, T, P> Unpin for ChunkByMut<'a, T, P>impl Unpin for strimpl Unpin for poly16x4_timpl<A, B> Unpin for Chain<A, B>impl Unpin for poly16x4x4_timpl<Ptr> Unpin for Pin<Ptr>impl Unpin for __m512iimpl Unpin for UnwindActionArgimpl<'a, T, P> Unpin for SplitNMut<'a, T, P>impl Unpin for vector_doubleimpl Unpin for RawWakerimpl Unpin for ToLowercaseimpl Unpin for int16x4x3_timpl Unpin for SocketAddrV4impl Unpin for poly64x1x2_timpl Unpin for SipHasherimpl Unpin for vector_signed_charimpl Unpin for SearchStepimpl<F: Unpin> Unpin for PollFn<F>impl<T> Unpin for NonZero<T>impl Unpin for BorrowErrorimpl Unpin for uint8x8x2_timpl<F> Unpin for FromFn<F>impl Unpin for float32x4x4_timpl<'a, 'b> Unpin for DebugTuple<'a, 'b>impl Unpin for vector_bool_intimpl<'a, P> Unpin for RMatchIndices<'a, P>impl Unpin for u64impl<T> Unpin for ManuallyDrop<T>impl<T> Unpin for PhantomData<T>impl<T> Unpin for Bound<T>impl Unpin for uint32x4_timpl<I, P> Unpin for MapWhile<I, P>impl Unpin for uint32x4x3_timpl Unpin for Orderingimpl Unpin for float64x1x4_timpl Unpin for GetDisjointMutErrorimpl<T> Unpin for (T)impl Unpin for int32x2_timpl<I> Unpin for Cloned<I>impl Unpin for poly16x8x2_timpl<P> Unpin for MaybeDangling<P>impl<A> Unpin for RangeIter<A>impl Unpin for __m512impl<T> Unpin for Wrapping<T>impl<'a, T, P> Unpin for RSplitNMut<'a, T, P>impl<N: usize> Unpin for LaneCount<N>impl Unpin for RawWakerVTableimpl Unpin for ToUppercaseimpl Unpin for int16x4x4_timpl Unpin for SocketAddrV6impl Unpin for poly64x1x3_timpl<H> Unpin for BuildHasherDefault<H>impl Unpin for vector_unsigned_charimpl<'a> Unpin for CharSearcher<'a>impl<T> Unpin for Ready<T>impl Unpin for BorrowMutErrorimpl Unpin for uint8x8x3_timpl<T> Unpin for Once<T>impl Unpin for int64x1x2_timpl<'a, 'b> Unpin for DebugSet<'a, 'b>impl Unpin for vector_floatimpl<'a, P> Unpin for Matches<'a, P>impl Unpin for u128impl Unpin for OneSidedRangeBoundimpl Unpin for float32x4_timpl<I, F, N: usize> Unpin for MapWindows<I, F, N>impl Unpin for uint32x4x4_timpl Unpin for AtomicI8impl Unpin for float64x2x2_timpl Unpin for Utf8Errorimpl Unpin for f16impl Unpin for uint32x2_timpl<I> Unpin for Copied<I>impl Unpin for poly16x8x3_timpl<A> Unpin for RangeInclusiveIter<A>impl Unpin for __m512dimpl<'a, T> Unpin for Windows<'a, T>impl<T, N: usize> Unpin for Mask<T, N>impl<'a> Unpin for Context<'a>impl Unpin for TryFromCharErrorimpl Unpin for int16x8x2_timpl<T> Unpin for Discriminant<T>impl<T> Unpin for Option<T>impl Unpin for poly64x1x4_timpl<'a> Unpin for EscapeAscii<'a>impl Unpin for vector_bool_charimpl<'a, N: usize> Unpin for CharArraySearcher<'a, N>impl Unpin for Wakerimpl<'b, T> Unpin for Ref<'b, T>impl Unpin for uint8x8x4_timpl<F> Unpin for OnceWith<F>impl Unpin for int64x1x3_timpl Unpin for Alignmentimpl<'a, 'b> Unpin for DebugList<'a, 'b>impl Unpin for vector_signed_long