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<G> Unpin for FromCoroutine<G>impl<'a, T> Unpin for ChunksMut<'a, T>impl Unpin for uint16x8_timpl Unpin for int64x2x2_timpl Unpin for vector_bool_long_longimpl<P> Unpin for MaybeDangling<P>impl<T> Unpin for Bound<T>impl<F> Unpin for RepeatWith<F>impl<'a, T> Unpin for RChunksExact<'a, T>impl Unpin for uint64x2_timpl Unpin for uint64x2x2_timpl Unpin for HvxVectorimpl Unpin for AsciiCharimpl Unpin for AddrParseErrorimpl Unpin for ParseBoolErrorimpl Unpin for int8x8x4_timpl Unpin for poly64x2x2_timpl Unpin for neverimpl Unpin for Pointerimpl<T> Unpin for PhantomData<T>impl<T> Unpin for RefCell<T>impl<'a, A> Unpin for IterMut<'a, A>impl<'a, P> Unpin for SplitTerminator<'a, P>impl Unpin for Enumimpl Unpin for uint8x8x4_timpl Unpin for __m128dimpl<T, N: usize> Unpin for [Option<T>; N]impl<T> Unpin for SyncUnsafeCell<T>impl<'a> Unpin for PanicInfo<'a>impl<'a, P> Unpin for Matches<'a, P>impl Unpin for poly8x8x4_timpl Unpin for __m512dimpl Unpin for f64impl Unpin for EscapeDefaultimpl<A> Unpin for RangeFromIter<A>impl<'a, P> Unpin for SplitInclusive<'a, P>impl Unpin for int16x4x4_timpl Unpin for __m512himpl Unpin for i128impl Unpin for CharCaseimpl<'a, T> Unpin for Iter<'a, T>impl Unpin for SearchStepimpl<T, VARIANT: u32, FIELD: u32> Unpin for FieldRepresentingType<T, VARIANT, FIELD>impl Unpin for uint16x4x4_timpl Unpin for float64x1x4_timpl Unpin for isizeimpl Unpin for c_voidimpl<'a, 'b> Unpin for DebugStruct<'a, 'b>impl<'a, 'b> Unpin for StrSearcher<'a, 'b>impl Unpin for poly16x4x4_timpl Unpin for vector_unsigned_charimpl<T: PointeeSized> Unpin for *const Timpl<I> Unpin for Cloned<I>impl<T> Unpin for NumBuffer<T>impl<T> Unpin for Poll<T>impl Unpin for int32x2x4_timpl Unpin for vector_unsigned_intimpl<T> Unpin for Ready<T>impl<I, U, F> Unpin for FlatMap<I, U, F>impl<'a> Unpin for Formatter<'a>impl Unpin for LayoutErrorimpl Unpin for uint32x2x4_timpl Unpin for vector_doubleimpl Unpin for Abiimpl<T> Unpin for TraitImpl<T>impl<I, F> Unpin for Map<I, F>impl<'a, T> Unpin for IterMut<'a, T>impl Unpin for int16x4_timpl<Idx> Unpin for Clamp<Idx>impl Unpin for float16x4x4_timpl Unpin for m128impl<I> Unpin for Skip<I>impl<'a, T, P> Unpin for RSplitMut<'a, T, P>impl Unpin for int64x1_timpl Unpin for float32x2x4_timpl Unpin for vector_unsigned_shortimpl<Y, R> Unpin for CoroutineState<Y, R>impl<T> Unpin for Empty<T>impl<'a, T> Unpin for Chunks<'a, T>impl Unpin for int16x8_timpl Unpin for int64x1x4_timpl Unpin for BasicBlockimpl Unpin for vector_unsigned_long_longimpl<Idx> Unpin for RangeToInclusive<Idx>impl<A> Unpin for RepeatN<A>impl<'a, T> Unpin for RChunksMut<'a, T>impl<'a> Unpin for Source<'a>impl Unpin for int64x2_timpl Unpin for Lifetimeimpl Unpin for uint64x1x4_timpl Unpin for HvxVectorPredimpl Unpin for TryFromSliceErrorimpl Unpin for Ipv6MulticastScopeimpl Unpin for Utf8Errorimpl Unpin for int8x8x3_timpl Unpin for poly64x1x4_timpl Unpin for boolimpl<T> Unpin for Reverse<T>impl<T> Unpin for Cell<T>impl Unpin for Fieldimpl<'a, A> Unpin for Iter<'a, A>impl<'a, P> Unpin for RSplit<'a, P>impl Unpin for uint8x8x3_timpl Unpin for __m128impl<T, N: usize> Unpin for [T; N]impl<T> Unpin for UnsafeCell<T>impl<'a> Unpin for Location<'a>impl<'a, P> Unpin for RMatchIndices<'a, P>impl Unpin for poly8x8x3_timpl Unpin for __m512impl Unpin for f32impl Unpin for EscapeUnicodeimpl<A> Unpin for RangeInclusiveIter<A>impl<'a> Unpin for SplitAsciiWhitespace<'a>impl Unpin for int16x4x3_timpl Unpin for __m256himpl Unpin for i64impl Unpin for TryFromCharErrorimpl Unpin for Arrayimpl<T, E> Unpin for Result<T, E>impl<'a> Unpin for Utf8Pattern<'a>impl Unpin for uint16x4x3_timpl Unpin for float64x1x3_timpl Unpin for u128impl<'a> Unpin for VaList<'a>impl<T> Unpin for Exclusive<T>impl<'a, F> Unpin for CharPredicateSearcher<'a, F>impl Unpin for poly16x4x3_timpl Unpin for vector_signed_charimpl<T: PointeeSized> Unpin for &mut Timpl<A, B> Unpin for Chain<A, B>impl<F> Unpin for FromFn<F>impl<T> Unpin for Pending<T>impl Unpin for int32x2x3_timpl Unpin for vector_signed_intimpl<F: Unpin> Unpin for PollFn<F>impl Unpin for TypeKindimpl<I, F> Unpin for FilterMap<I, F>impl Unpin for FormattingOptionsimpl Unpin for Structimpl Unpin for Layoutimpl Unpin for uint32x2x3_timpl Unpin for vector_bool_longimpl<T> Unpin for PhantomCovariant<T>impl<I, G> Unpin for IntersperseWith<I, G>impl<'a, T> Unpin for Iter<'a, T>impl Unpin for poly8x8_timpl Unpin for float16x4x3_timpl Unpin for m128iimpl Unpin for AtomicOrderingimpl<I, St, F> Unpin for Scan<I, St, F>impl<'a, T, P> Unpin for RSplit<'a, T, P>impl Unpin for float32x2_timpl Unpin for float32x2x3_timpl Unpin for vector_signed_shortimpl<B, C> Unpin for ControlFlow<B, C>impl Unpin for Tupleimpl<A, B> Unpin for Zip<A, B>impl<'a, T> Unpin for Windows<'a, T>impl Unpin for Unionimpl Unpin for poly8x16_timpl Unpin for int64x1x3_timpl Unpin for Charimpl Unpin for vector_signed_long_longimpl<Idx> Unpin for RangeInclusive<Idx>impl<A> Unpin for Repeat<A>impl<'a, T> Unpin for RChunks<'a, T>impl Unpin for float32x4_timpl Unpin for uint64x1x3_timpl Unpin for HvxVectorPairimpl<T> Unpin for PhantomContravariant<T>impl<T, F> Unpin for DropGuard<T, F>impl<T, N: usize> Unpin for IntoIter<T, N>impl Unpin for Ipv6Addrimpl Unpin for GetDisjointMutErrorimpl Unpin for int8x8x2_timpl Unpin for poly64x1x3_timpl<T, N: usize> Unpin for Simd<T, N>impl Unpin for TryFromIntErrorimpl<T> Unpin for OnceCell<T>impl<T> Unpin for Option<T>impl<'a, P> Unpin for Split<'a, P>impl Unpin for uint8x8x2_timpl Unpin for __m128iimpl Unpin for Intimpl Unpin for UnwindTerminateReasonimpl<N: usize> Unpin for [u8; N]impl<'b, T> Unpin for RefMut<'b, T>impl Unpin for objc_selectorimpl<'a, P> Unpin for MatchIndices<'a, P>impl Unpin for poly8x8x2_timpl Unpin for GenericTypeimpl Unpin for __m512iimpl Unpin for f16impl Unpin for DecodeUtf16Errorimpl<A> Unpin for RangeIter<A>impl Unpin for FpCategoryimpl<'a> Unpin for SplitWhitespace<'a>impl Unpin for int16x4x2_timpl Unpin for __m128himpl Unpin for i32impl<'a> Unpin for PhantomInvariantLifetime<'a>impl<T> Unpin for PhantomInvariant<T>impl Unpin for ToLowercaseimpl<Idx> Unpin for RangeToInclusive<Idx>impl<'a> Unpin for EscapeUnicode<'a>impl Unpin for uint16x4x2_timpl Unpin for float64x1x2_timpl Unpin for u64impl Unpin for FnPtrimpl Unpin for Typeimpl<'a> Unpin for Bytes<'a>impl Unpin for Orderingimpl<'a, 'b> Unpin for CharSliceSearcher<'a, 'b>impl Unpin for poly16x4x2_timpl Unpin for v128impl<T: PointeeSized> Unpin for &Timpl<'a, I> Unpin for ByRefSized<'a, I>impl<'a, 'b> Unpin for DebugMap<'a, 'b>impl Unpin for TryFromFloatSecsErrorimpl Unpin for int32x2x2_timpl Unpin for vector_bool_shortimpl<T: ?Sized> Unpin for UnsafePinned<T>impl<I, P> Unpin for Filter<I, P>impl Unpin for Sliceimpl Unpin for DebugAsHeximpl<'a> Unpin for ContextBuilder<'a>impl Unpin for uint32x2x2_timpl Unpin for vector_unsigned_longimpl Unpin for ReturnToArgimpl<I> Unpin for Intersperse<I>impl<'a> Unpin for EscapeAscii<'a>impl Unpin for uint8x8_timpl Unpin for float16x4x2_timpl Unpin for m256dimpl Unpin for Orderingimpl<T> Unpin for Rev<T>impl<'a, T, P> Unpin for SplitInclusiveMut<'a, T, P>impl<'a> Unpin for Request<'a>impl Unpin for uint32x2_timpl Unpin for float32x2x2_timpl Unpin for vector_bool_charimpl Unpin for ParseFloatErrorimpl<I, P> Unpin for TakeWhile<I, P>impl Unpin for DynTraitimpl<'a, T, P> Unpin for RSplitNMut<'a, T, P>impl Unpin for Localityimpl Unpin for uint8x16_timpl Unpin for int64x1x2_timpl Unpin for vector_bool_intimpl<Idx> Unpin for RangeTo<Idx>impl<F> Unpin for OnceWith<F>impl<'a, T, N: usize> Unpin for ArrayWindows<'a, T, N>impl Unpin for uint32x4_timpl Unpin for uint64x1x2_timpl Unpin for HvxVectorimpl<'a> Unpin for PhantomContravariantLifetime<'a>impl<Dyn: PointeeSized> Unpin for DynMetadata<Dyn>impl Unpin for TypeIdimpl Unpin for Ipv4Addrimpl<'a, T, P> Unpin for ChunkByMut<'a, T, P>impl Unpin for float16x8_timpl Unpin for poly64x1x2_timpl<T, N: usize> Unpin for Mask<T, N>impl<T, F> Unpin for LazyCell<T, F>impl Unpin for SocketAddrV6impl Unpin for DynTraitPredicateimpl<'a> Unpin for Bytes<'a>impl Unpin for int8x16x4_timpl Unpin for CpuidResultimpl<T, N: usize> Unpin for [MaybeUninit<T>; N]impl<'b, T> Unpin for Ref<'b, T>impl Unpin for objc_classimpl<'a, P> Unpin for RSplitN<'a, P>impl Unpin for uint8x16x4_timpl Unpin for __m256dimpl<T> Unpin for (T)impl<I> Unpin for DecodeUtf16<I>impl<Ptr> Unpin for Pin<Ptr>impl<'a> Unpin for LinesAny<'a>impl Unpin for poly8x16x4_timpl Unpin for __m512bhimpl Unpin for i16impl Unpin for ToTitlecaseimpl<Idx> Unpin for RangeFrom<Idx>impl Unpin for Traitimpl<'a> Unpin for EscapeDefault<'a>impl Unpin for int16x8x4_timpl Unpin for float64x2_timpl Unpin for Floatimpl Unpin for UnwindActionArgimpl Unpin for u32impl Unpin for IntErrorKindimpl Unpin for FromBytesUntilNulErrorimpl<T> Unpin for Atomic<T>impl<'a, 'b, N: usize> Unpin for CharArrayRefSearcher<'a, 'b, N>impl Unpin for uint16x8x4_timpl Unpin for Constimpl Unpin for float64x2x4_timpl Unpin for PhantomPinnedimpl<T> Unpin for ManuallyDrop<T>impl Unpin for Assumeimpl<I, N: usize> Unpin for ArrayChunks<I, N>impl<'a, 'b> Unpin for DebugList<'a, 'b>impl Unpin for Durationimpl Unpin for poly16x8x4_timpl Unpin for vector_unsigned_shortimpl<T: PointeeSized> Unpin for *const T: TyPat { hir_id: HirId(DefId(0:11279 ~ core[1801]::pat::{impl#3}).12), kind: NotNull, span: library/core/src/pat.rs:87:59: 87:64 (#0) }impl<I> Unpin for Enumerate<I>impl Unpin for Signimpl<'a> Unpin for Context<'a>impl Unpin for int32x4x4_timpl Unpin for vector_signed_longimpl Unpin for Infallibleimpl<I, F> Unpin for Inspect<I, F>impl<H> Unpin for BuildHasherDefault<H>impl Unpin for int8x8_timpl Unpin for uint32x4x4_timpl Unpin for m256impl<I> Unpin for Peekable<I>impl<'a, T, P> Unpin for SplitMut<'a, T, P>impl Unpin for int32x2_timpl Unpin for float16x8x4_timpl Unpin for vector_unsigned_charimpl Unpin for Alignmentimpl<I> Unpin for Take<I>impl<'a, T, P> Unpin for SplitNMut<'a, T, P>impl Unpin for int8x16_timpl Unpin for float32x4x4_timpl Unpin for vector_unsigned_intimpl<T> Unpin for NonZero<T>impl<Idx> Unpin for RangeFrom<Idx>impl<T> Unpin for Once<T>impl<'a, T> Unpin for ChunksExactMut<'a, T>impl Unpin for int32x4_timpl Unpin for int64x2x4_timpl Unpin for vector_doubleimpl Unpin for ParseIntErrorimpl<T> Unpin for Yeet<T>impl Unpin for IpAddrimpl<'a, T, P> Unpin for ChunkBy<'a, T, P>impl Unpin for float16x4_timpl Unpin for uint64x2x4_timpl Unpin for HvxVectorPredimpl Unpin for ByteStrimpl Unpin for SocketAddrV4impl<'a> Unpin for CharIndices<'a>impl Unpin for int8x16x3_timpl Unpin for poly64x2x4_timpl Unpin for ()impl Unpin for BorrowMutErrorimpl<A> Unpin for OptionFlatten<A>impl<'a, P> Unpin for SplitN<'a, P>impl Unpin for uint8x16x3_timpl Unpin for __m256impl Unpin for strimpl Unpin for CharTryFromErrorimpl<T> Unpin for Saturating<T>impl<T> Unpin for AssertUnwindSafe<T>impl<'a> Unpin for Lines<'a>impl Unpin for poly8x16x3_timpl Unpin for __m256bhimpl Unpin for i8impl Unpin for ToUppercaseimpl<Idx> Unpin for RangeInclusive<Idx>impl<'a> Unpin for EscapeDebug<'a>impl Unpin for int16x8x3_timpl Unpin for float64x1_timpl Unpin for u16impl<T> Unpin for MaybeUninit<T>impl Unpin for FromBytesWithNulErrorimpl<T> Unpin for IntoIter<T>impl<'a, N: usize> Unpin for CharArraySearcher<'a, N>impl Unpin for uint16x8x3_timpl Unpin for float64x2x3_timpl<Ret, T> Unpin for fn(_: T) -> Retimpl<'a> Unpin for BorrowedCursor<'a>impl<'a, 'b> Unpin for DebugSet<'a, 'b>impl<'a> Unpin for Utf8Chunks<'a>impl Unpin for poly16x8x3_timpl Unpin for vector_signed_shortimpl<I> Unpin for FromIter<I>impl<I> Unpin for Cycle<I>impl Unpin for Errorimpl Unpin for RawWakerVTableimpl Unpin for int32x4x3_timpl Unpin for vector_floatimpl<'a> Unpin for PhantomCovariantLifetime<'a>impl Unpin for LocalWakerimpl<I> Unpin for Fuse<I>impl Unpin for SipHasherimpl Unpin for SYimpl Unpin for uint32x4x3_timpl Unpin for m256iimpl<I, F, N: usize> Unpin for MapWindows<I, F, N>impl<'a, T, P> Unpin for SplitInclusive<'a, T, P>impl Unpin for poly16x4_timpl Unpin for Genericimpl Unpin for float16x8x3_timpl Unpin for vector_signed_charimpl<I> Unpin for StepBy<I>impl<'a, T, P> Unpin for RSplitN<'a, T, P>impl Unpin for poly64x1_timpl Unpin for float32x4x3_timpl Unpin for vector_signed_intimpl<Idx> Unpin for Range<Idx>impl<F> Unpin for FromFn<F>impl<'a, T> Unpin for ChunksExact<'a, T>impl Unpin for poly16x8_timpl Unpin for int64x2x3_timpl Unpin for vector_floatimpl Unpin for OneSidedRangeBoundimpl<T, F> Unpin for Successors<T, F>impl<'a, T> Unpin for RChunksExactMut<'a, T>impl Unpin for poly64x2_timpl Unpin for uint64x2x3_timpl Unpin for HvxVectorPairimpl Unpin for EscapeDefaultimpl Unpin for SocketAddrimpl<'a> Unpin for Chars<'a>impl Unpin for int8x16x2_timpl Unpin for poly64x2x3_timpl Unpin for charimpl<T> Unpin for Wrapping<T>impl Unpin for BorrowErrorimpl<A> Unpin for IntoIter<A>impl<'a, P> Unpin for RSplitTerminator<'a, P>impl Unpin for uint8x16x2_timpl Unpin for __m256iimpl Unpin for Lastimpl<T> Unpin for [T]impl<T> Unpin for Discriminant<T>impl Unpin for ParseCharErrorimpl<'a> Unpin for PanicMessage<'a>impl<'a, P> Unpin for RMatches<'a, P>impl Unpin for poly8x16x2_timpl Unpin for __m128bhimpl Unpin for f128impl<T> Unpin for NonNull<T>impl Unpin for EscapeDebugimpl<Idx> Unpin for Range<Idx>impl<'a> Unpin for EncodeUtf16<'a>impl Unpin for int16x8x2_timpl Unpin for bf16impl Unpin for u8impl Unpin for CStrimpl<'a, T> Unpin for IterMut<'a, T>impl<'a> Unpin for CharSearcher<'a>impl Unpin for Variantimpl Unpin for uint16x8x2_timpl Unpin for float64x2x2_timpl Unpin for usizeimpl<'data> Unpin for BorrowedBuf<'data>impl<'a, 'b> Unpin for DebugTuple<'a, 'b>impl<'a> Unpin for Utf8Chunk<'a>impl Unpin for poly16x8x2_timpl Unpin for vector_bool_charimpl<T: PointeeSized> Unpin for *mut Timpl<I> Unpin for Copied<I>impl Unpin for Alignmentimpl Unpin for RawWakerimpl Unpin for int32x4x2_timpl Unpin for vector_bool_intimpl Unpin for Strimpl Unpin for Wakerimpl<I> Unpin for Flatten<I>impl<'a> Unpin for Arguments<'a>impl Unpin for AllocErrorimpl Unpin for uint32x4x2_timpl Unpin for Boolimpl Unpin for f16x2impl<I, P> Unpin for MapWhile<I, P>impl<'a, T, P> Unpin for Split<'a, T, P>impl Unpin for uint16x4_timpl Unpin for float16x8x2_timpl Unpin for m128dimpl Unpin for SimdAlignimpl<I, P> Unpin for SkipWhile<I, P>impl<'a, T, P> Unpin for SplitN<'a, T, P>impl Unpin for uint64x1_timpl Unpin for float32x4x2_timpl Unpin for vector_bool_shortimpl Unpin for Referenceimpl Unpin for RangeFull