Trait CloneToUninit
unsafe trait CloneToUninit
A generalization of Clone to dynamically-sized types stored in arbitrary containers.
This trait is implemented for all types implementing Clone, slices of all
such types, and other dynamically-sized types in the standard library.
You may also implement this trait to enable cloning custom DSTs
(structures containing dynamically-sized fields), or use it as a supertrait to enable
cloning a trait object.
This trait is normally used via operations on container types which support DSTs,
so you should not typically need to call .clone_to_uninit() explicitly except when
implementing such a container or otherwise performing explicit management of an allocation,
or when implementing CloneToUninit itself.
Safety
Implementations must ensure that when .clone_to_uninit(dest) returns normally rather than
panicking, it always leaves *dest initialized as a valid value of type Self.
Examples
If you are defining a trait, you can add CloneToUninit as a supertrait to enable cloning of
dyn values of your trait:
use Rc;
let first: = new;
let mut second = first.clone;
make_mut.modify; // make_mut() will call clone_to_uninit()
assert_eq!;
assert_eq!;
The following is an example of implementing CloneToUninit for a custom DST.
(It is essentially a limited form of what derive(CloneToUninit) would do,
if such a derive macro existed.)
use CloneToUninit;
use offset_of;
use Rc;
unsafe
See Also
Clone::clone_fromis a safe function which may be used instead whenSelf: Sizedand the destination is already initialized; it may be able to reuse allocations owned by the destination, whereasclone_to_uninitcannot, since its destination is assumed to be uninitialized.ToOwned, which allocates a new destination container.
Required Methods
unsafe fn clone_to_uninit(self: &Self, dest: *mut u8)Performs copy-assignment from
selftodest.This is analogous to
std::ptr::write(dest.cast(), self.clone()), except thatSelfmay be a dynamically-sized type (!Sized).Before this function is called,
destmay point to uninitialized memory. After this function is called,destwill point to initialized memory; it will be sound to create a&Selfreference from the pointer with the pointer metadata fromself.Safety
Behavior is undefined if any of the following conditions are violated:
destmust be valid for writes forsize_of_val(self)bytes.destmust be properly aligned toalign_of_val(self).
Panics
This function may panic. (For example, it might panic if memory allocation for a clone of a value owned by
selffails.) If the call panics, then*destshould be treated as uninitialized memory; it must not be read or dropped, because even if it was previously valid, it may have been partially overwritten.The caller may wish to take care to deallocate the allocation pointed to by
dest, if applicable, to avoid a memory leak (but this is not a requirement).Implementors should avoid leaking values by, upon unwinding, dropping all component values that might have already been created. (For example, if a
[Foo]of length 3 is being cloned, and the second of the three calls toFoo::clone()unwinds, then the firstFoocloned should be dropped.)
Implementors
impl<T> CloneToUninit for vector_bool_intimpl<T> CloneToUninit for LayoutErrorimpl<T> CloneToUninit for Utf8Errorimpl<T> CloneToUninit for FlatMap<I, U, F>impl<T> CloneToUninit for Exclusive<T>impl<T> CloneToUninit for float16x4x2_timpl<T> CloneToUninit for int8x8x4_timpl<T> CloneToUninit for int16x8x3_timpl<T> CloneToUninit for boolimpl<T> CloneToUninit for poly16x4_timpl<T> CloneToUninit for u64impl<T> CloneToUninit for __m512impl<T> CloneToUninit for vector_signed_shortimpl<T> CloneToUninit for IntersperseWith<I, G>impl<T> CloneToUninit for uint64x2x2_timpl<T> CloneToUninit for RangeToInclusive<Idx>impl<T> CloneToUninit for Result<T, E>impl<T> CloneToUninit for Wrapping<T>impl<T> CloneToUninit for int16x8x4_timpl<T> CloneToUninit for FromIter<I>impl<T> CloneToUninit for uint32x2x3_timpl<T> CloneToUninit for Discriminant<T>impl<T> CloneToUninit for RangeInclusive<Idx>impl<T> CloneToUninit for RMatches<'a, P>impl<T> CloneToUninit for isizeimpl<T> CloneToUninit for Cycle<I>impl<T> CloneToUninit for Durationimpl<T> CloneToUninit for Arguments<'a>impl<T> CloneToUninit for SplitInclusive<'a, T, P>impl<T> CloneToUninit for uint32x2_timpl<T> CloneToUninit for __m128bhimpl<T> CloneToUninit for vector_bool_shortimpl<T> CloneToUninit for uint32x2x4_timpl<T> CloneToUninit for int64x2x3_timpl<T> CloneToUninit for HvxVectorimpl<T> CloneToUninit for EscapeDefaultimpl<T> CloneToUninit for f16impl<T> CloneToUninit for TypeIdimpl<T> CloneToUninit for Range<Idx>impl<T> CloneToUninit for Pin<Ptr>impl<T> CloneToUninit for GetDisjointMutErrorimpl<T> CloneToUninit for poly8x8x2_timpl<T> CloneToUninit for int64x2x4_timpl<T> CloneToUninit for int64x1_timpl<T> CloneToUninit for Bytes<'a>impl<T> CloneToUninit for __m512bhimpl<T> CloneToUninit for vector_unsigned_intimpl<T> CloneToUninit for LinesAny<'a>impl<T> CloneToUninit for Orderingimpl<T> CloneToUninit for HvxVectorPredimpl<T> CloneToUninit for IntoIter<T>impl<T> CloneToUninit for Utf8Pattern<'a>impl<T> CloneToUninit for poly16x8x2_timpl<T> CloneToUninit for IpAddrimpl<T> CloneToUninit for RepeatN<A>impl<T> CloneToUninit for RangeFrom<Idx>impl<T> CloneToUninit for uint8x8x3_timpl<T> CloneToUninit for Utf8Chunk<'a>impl<T> CloneToUninit for m256iimpl<T> CloneToUninit for DynMetadata<Dyn>impl<T> CloneToUninit for Ipv6Addrimpl<T> CloneToUninit for poly64x1_timpl<T> CloneToUninit for __m256himpl<T> CloneToUninit for vector_signed_long_longimpl<T> CloneToUninit for IntoIter<T, N>impl<T> CloneToUninit for MapWhile<I, P>impl<T> CloneToUninit for ()impl<T> CloneToUninit for OnceCell<T>impl<T> CloneToUninit for float32x2x2_timpl<T> CloneToUninit for uint8x8x4_timpl<T> CloneToUninit for m128impl<T> CloneToUninit for uint16x8x3_timpl<T> CloneToUninit for CharSearcher<'a>impl<T> CloneToUninit for Utf8Chunks<'a>impl CloneToUninit for strimpl<T> CloneToUninit for CpuidResultimpl<T> CloneToUninit for MaybeDangling<P>impl<T> CloneToUninit for m256dimpl<T> CloneToUninit for poly64x2x2_timpl<T> CloneToUninit for v128impl<T> CloneToUninit for RChunksExact<'a, T>impl<T> CloneToUninit for uint8x16_timpl<T> CloneToUninit for vector_bool_long_longimpl<T> CloneToUninit for uint16x8x4_timpl<T> CloneToUninit for EscapeDefaultimpl<T> CloneToUninit for float16x4x3_timpl<T> CloneToUninit for PhantomData<T>impl<T> CloneToUninit for Signimpl<T> CloneToUninit for Split<'a, T, P>impl<T> CloneToUninit for CharArrayRefSearcher<'a, 'b, N>impl<T> CloneToUninit for Take<I>impl<T> CloneToUninit for Zip<A, B>impl<T> CloneToUninit for SipHasherimpl<T> CloneToUninit for float16x4x4_timpl<T> CloneToUninit for DebugAsHeximpl<T> CloneToUninit for Ready<T>impl<T> CloneToUninit for uint64x2x3_timpl<T> CloneToUninit for NonNull<T>impl<T> CloneToUninit for FromFn<F>impl<T> CloneToUninit for int16x8_timpl<T> CloneToUninit for vector_doubleimpl<T> CloneToUninit for Inspect<I, F>impl<T> CloneToUninit for int16x4x2_timpl<T> CloneToUninit for FieldRepresentingType<T, VARIANT, FIELD>impl<T> CloneToUninit for CharPredicateSearcher<'a, F>impl<T> CloneToUninit for uint64x2x4_timpl<T> CloneToUninit for f64impl<T> CloneToUninit for i8impl<T> CloneToUninit for fn(_: T) -> Retimpl<T> CloneToUninit for f16x2impl<T> CloneToUninit for poly16x8_timpl<T> CloneToUninit for EscapeDefault<'a>impl<T> CloneToUninit for Mask<T, N>impl<T> CloneToUninit for int32x4x2_timpl<T> CloneToUninit for float64x2x2_timpl<T> CloneToUninit for RangeFrom<Idx>impl<T> CloneToUninit for Windows<'a, T>impl<T> CloneToUninit for RSplitN<'a, P>impl<T> CloneToUninit for IntoIter<A>impl<T> CloneToUninit for poly8x8x3_timpl<T> CloneToUninit for Iter<'a, T>impl<T> CloneToUninit for Range<Idx>impl<T> CloneToUninit for Copied<I>impl<T> CloneToUninit for int64x1x2_timpl<T> CloneToUninit for StepBy<I>impl<T> CloneToUninit for RSplit<'a, T, P>impl<T> CloneToUninit for Chunks<'a, T>impl<T> CloneToUninit for uint32x4_timpl<T> CloneToUninit for Chain<A, B>impl<T> CloneToUninit for poly8x8x4_timpl<T> CloneToUninit for poly16x8x3_timpl<T> CloneToUninit for vector_unsigned_longimpl<T> CloneToUninit for SocketAddrimpl<T> CloneToUninit for SearchStepimpl<T> CloneToUninit for Pending<T>impl<T> CloneToUninit for CharTryFromErrorimpl<T> CloneToUninit for u32impl<T> CloneToUninit for ArrayChunks<I, N>impl<T> CloneToUninit for vector_unsigned_charimpl<T> CloneToUninit for Source<'a>impl<T> CloneToUninit for poly16x8x4_timpl<T> CloneToUninit for float32x2x3_timpl CloneToUninit for ByteStrimpl<T> CloneToUninit for float64x2_timpl<T> CloneToUninit for ToLowercaseimpl<T> CloneToUninit for FromCoroutine<G>impl<T> CloneToUninit for int64x2_timpl<T> CloneToUninit for Option<T>impl<T> CloneToUninit for vector_doubleimpl<T> CloneToUninit for u8impl<T> CloneToUninit for RawWakerVTableimpl<T> CloneToUninit for RangeInclusiveIter<A>impl<T> CloneToUninit for Reverse<T>impl<T> CloneToUninit for int8x16x2_timpl<T> CloneToUninit for MapWindows<I, F, N>impl<T> CloneToUninit for float32x2x4_timpl<T> CloneToUninit for DecodeUtf16<I>impl<T> CloneToUninit for poly64x2x3_timpl<T> CloneToUninit for u16impl<T> CloneToUninit for __m128iimpl<T> CloneToUninit for TryFromIntErrorimpl<T> CloneToUninit for Chars<'a>impl<T> CloneToUninit for vector_signed_shortimpl<T> CloneToUninit for Ipv6MulticastScopeimpl<T> CloneToUninit for poly64x2_timpl<T> CloneToUninit for Cloned<I>impl<T> CloneToUninit for uint16x4x2_timpl<T> CloneToUninit for poly64x2x4_timpl<T> CloneToUninit for Map<I, F>impl<T> CloneToUninit for SkipWhile<I, P>impl<T> CloneToUninit for Simd<T, N>impl<T> CloneToUninit for RangeTo<Idx>impl<T> CloneToUninit for int8x8_timpl<T> CloneToUninit for __m128dimpl<T> CloneToUninit for SplitN<'a, P>impl<T> CloneToUninit for vector_bool_shortimpl<T> CloneToUninit for uint32x4x2_timpl<T> CloneToUninit for FromBytesUntilNulErrorimpl<T> CloneToUninit for float16x8_timpl<T> CloneToUninit for int16x4x3_timpl<T> CloneToUninit for HvxVectorPairimpl<T> CloneToUninit for StrSearcher<'a, 'b>impl<T> CloneToUninit for Peekable<I>impl<T> CloneToUninit for Scan<I, St, F>impl<T> CloneToUninit for i64impl<T> CloneToUninit for PhantomCovariant<T>impl<T> CloneToUninit for uint64x1x2_timpl<T> CloneToUninit for poly8x8_timpl<T> CloneToUninit for __m256impl<T> CloneToUninit for vector_signed_charimpl<T> CloneToUninit for EscapeUnicode<'a>impl<T> CloneToUninit for int16x4x4_timpl<T> CloneToUninit for AsciiCharimpl<T> CloneToUninit for vector_unsigned_intimpl<T> CloneToUninit for int32x4x3_timpl<T> CloneToUninit for charimpl<T> CloneToUninit for float64x2x3_timpl<T> CloneToUninit for Layoutimpl<T> CloneToUninit for MatchIndices<'a, P>impl<T> CloneToUninit for Fuse<I>impl<T> CloneToUninit for [MaybeUninit<T>; N]impl<T> CloneToUninit for int32x4x4_timpl<T> CloneToUninit for int64x1x3_timpl<T> CloneToUninit for EscapeAscii<'a>impl<T: Clone> CloneToUninit for [T]impl<T> CloneToUninit for float64x2x4_timpl<T> CloneToUninit for uint16x4_timpl<T> CloneToUninit for OnceWith<F>impl<T> CloneToUninit for __m512iimpl<T> CloneToUninit for vector_bool_charimpl<T> CloneToUninit for vector_floatimpl<T> CloneToUninit for PhantomContravariant<T>impl<T> CloneToUninit for EscapeUnicodeimpl<T> CloneToUninit for ParseBoolErrorimpl<T> CloneToUninit for uint8x16x2_timpl<T> CloneToUninit for BuildHasherDefault<H>impl<T> CloneToUninit for int64x1x4_timpl<T> CloneToUninit for LocalWakerimpl<T> CloneToUninit for ToUppercaseimpl<T> CloneToUninit for VaList<'a>impl<T> CloneToUninit for Filter<I, P>impl<T> CloneToUninit for int32x2_timpl<T> CloneToUninit for __m512dimpl<T> CloneToUninit for vector_unsigned_shortimpl<T> CloneToUninit for poly16x4x2_timpl<T> CloneToUninit for SocketAddrV4impl<T> CloneToUninit for RSplitTerminator<'a, P>impl<T> CloneToUninit for int8x16x3_timpl<T> CloneToUninit for FpCategoryimpl<T> CloneToUninit for PhantomInvariantLifetime<'a>impl<T> CloneToUninit for PhantomInvariant<T>impl<T> CloneToUninit for TryFromSliceErrorimpl<T> CloneToUninit for TryFromFloatSecsErrorimpl<T> CloneToUninit for float16x8x2_timpl<T> CloneToUninit for Cell<T>impl<T> CloneToUninit for (T)impl<T> CloneToUninit for float32x2_timpl<T> CloneToUninit for __m256bhimpl<T> CloneToUninit for vector_signed_intimpl<T> CloneToUninit for int8x16x4_timpl<T> CloneToUninit for uint16x4x3_timpl<T> CloneToUninit for HvxVectorPairimpl<T> CloneToUninit for ArrayWindows<'a, T, N>impl<T> CloneToUninit for i16impl<T> CloneToUninit for FilterMap<I, F>impl<T> CloneToUninit for poly64x1x2_timpl<T> CloneToUninit for Location<'a>impl<T> CloneToUninit for Enumerate<I>impl<T> CloneToUninit for uint16x4x4_timpl<T> CloneToUninit for uint32x4x3_timpl<T> CloneToUninit for RChunks<'a, T>impl<T> CloneToUninit for uint64x1_timpl<T> CloneToUninit for __m128himpl<T> CloneToUninit for vector_bool_intimpl<T> CloneToUninit for i128impl<T> CloneToUninit for EscapeDebugimpl<T> CloneToUninit for Orderingimpl<T> CloneToUninit for m128iimpl<T> CloneToUninit for uint32x4x4_timpl<T> CloneToUninit for uint64x1x3_timpl<T> CloneToUninit for TakeWhile<I, P>impl<T> CloneToUninit for Wakerimpl<T> CloneToUninit for ParseFloatErrorimpl<T> CloneToUninit for Localityimpl<T> CloneToUninit for RefCell<T>impl<T> CloneToUninit for m256impl<T> CloneToUninit for Skip<I>impl<T> CloneToUninit for RangeIter<A>impl<T> CloneToUninit for int8x16_timpl<T> CloneToUninit for __m512himpl<T> CloneToUninit for RMatchIndices<'a, P>impl<T> CloneToUninit for vector_unsigned_long_longimpl<T> CloneToUninit for poly8x16x2_timpl<T> CloneToUninit for PhantomContravariantLifetime<'a>impl<T> CloneToUninit for uint64x1x4_timpl<T> CloneToUninit for m128dimpl<T> CloneToUninit for CharArraySearcher<'a, N>impl<T> CloneToUninit for SplitTerminator<'a, P>impl<T> CloneToUninit for bf16impl<T> CloneToUninit for SplitInclusive<'a, P>impl<T> CloneToUninit for int32x2x2_timpl<T> CloneToUninit for neverimpl<T> CloneToUninit for float64x1x2_timpl<T> CloneToUninit for Bound<T>impl<T> CloneToUninit for poly8x16_timpl<T> CloneToUninit for vector_floatimpl<T> CloneToUninit for uint8x16x3_timpl<T> CloneToUninit for RangeInclusive<Idx>impl<T> CloneToUninit for Iter<'a, A>impl<T> CloneToUninit for EncodeUtf16<'a>impl<T> CloneToUninit for CharSliceSearcher<'a, 'b>impl<T> CloneToUninit for float32x4x2_timpl<T> CloneToUninit for RangeToInclusive<Idx>impl<T> CloneToUninit for uint8x16x4_timpl<T> CloneToUninit for poly16x4x3_timpl<T> CloneToUninit for Flatten<I>impl<T> CloneToUninit for uint16x8_timpl<T> CloneToUninit for IntErrorKindimpl<T> CloneToUninit for *const Timpl<T> CloneToUninit for ManuallyDrop<T>impl<T> CloneToUninit for AddrParseErrorimpl<T> CloneToUninit for Assumeimpl<T> CloneToUninit for poly16x4x4_timpl<T> CloneToUninit for float16x8x3_timpl<T> CloneToUninit for Once<T>impl<T> CloneToUninit for i32impl<T> CloneToUninit for Empty<T>impl<T> CloneToUninit for int32x4_timpl<T> CloneToUninit for int8x8x2_timpl<T> CloneToUninit for Infallibleimpl<T> CloneToUninit for vector_signed_longimpl<T> CloneToUninit for float16x8x4_timpl<T> CloneToUninit for Errorimpl<T> CloneToUninit for ParseCharErrorimpl<T> CloneToUninit for Poll<T>impl<T> CloneToUninit for poly64x1x3_timpl<T> CloneToUninit for Bytes<'a>impl<T> CloneToUninit for SocketAddrV6impl<T> CloneToUninit for Intersperse<I>impl<T> CloneToUninit for ControlFlow<B, C>impl<T> CloneToUninit for Alignmentimpl<T> CloneToUninit for int16x8x2_timpl<T> CloneToUninit for vector_signed_charimpl<T: Clone> CloneToUninit for Timpl<T> CloneToUninit for float64x1_timpl<T> CloneToUninit for poly64x1x4_timpl<T> CloneToUninit for f32impl<T> CloneToUninit for RSplit<'a, P>impl<T> CloneToUninit for float32x4_timpl<T> CloneToUninit for SplitAsciiWhitespace<'a>impl<T> CloneToUninit for vector_bool_longimpl CloneToUninit for CStrimpl<T> CloneToUninit for ParseIntErrorimpl<T> CloneToUninit for uint32x2x2_timpl<T> CloneToUninit for Rev<T>impl<T> CloneToUninit for AllocErrorimpl<T> CloneToUninit for Matches<'a, P>impl<T> CloneToUninit for poly8x16x3_timpl<T> CloneToUninit for vector_bool_charimpl<T> CloneToUninit for ChunksExact<'a, T>impl<T> CloneToUninit for RepeatWith<F>impl<T> CloneToUninit for uint64x2_timpl<T> CloneToUninit for u128impl<T> CloneToUninit for CoroutineState<Y, R>impl<T> CloneToUninit for int64x2x2_timpl<T> CloneToUninit for Ipv4Addrimpl<T> CloneToUninit for poly8x16x4_timpl<T> CloneToUninit for Saturating<T>impl<T> CloneToUninit for int32x2x3_timpl<T> CloneToUninit for NonZero<T>impl<T> CloneToUninit for float64x1x3_timpl<T> CloneToUninit for __m128impl<T> CloneToUninit for FromBytesWithNulErrorimpl<T> CloneToUninit for RangeFromIter<A>impl<T> CloneToUninit for Repeat<A>impl<T> CloneToUninit for Iter<'a, T>impl<T> CloneToUninit for vector_unsigned_shortimpl<T> CloneToUninit for usizeimpl<T> CloneToUninit for RangeFullimpl<T> CloneToUninit for ChunkBy<'a, T, P>impl<T> CloneToUninit for f128impl<T> CloneToUninit for CharIndices<'a>impl<T> CloneToUninit for MaybeUninit<T>impl<T> CloneToUninit for float16x4_timpl<T> CloneToUninit for Lines<'a>impl<T> CloneToUninit for EscapeDebug<'a>impl<T> CloneToUninit for HvxVectorimpl<T> CloneToUninit for int32x2x4_timpl<T> CloneToUninit for float32x4x3_timpl<T> CloneToUninit for Alignmentimpl<T> CloneToUninit for float64x1x4_timpl<T> CloneToUninit for DecodeUtf16Errorimpl<T> CloneToUninit for TryFromCharErrorimpl<T> CloneToUninit for Successors<T, F>impl<T> CloneToUninit for ToTitlecaseimpl<T> CloneToUninit for uint8x8_timpl<T> CloneToUninit for __m256iimpl<T> CloneToUninit for uint8x8x2_timpl<T> CloneToUninit for vector_signed_intimpl<T> CloneToUninit for PhantomCovariantLifetime<'a>impl<T> CloneToUninit for PhantomPinnedimpl<T> CloneToUninit for float32x4x4_timpl<T> CloneToUninit for HvxVectorPredimpl<T> CloneToUninit for FormattingOptionsimpl<T> CloneToUninit for CharCaseimpl<T> CloneToUninit for Split<'a, P>impl<T> CloneToUninit for SplitWhitespace<'a>impl<T> CloneToUninit for uint16x8x2_timpl<T> CloneToUninit for int16x4_timpl<T> CloneToUninit for __m256dimpl<T> CloneToUninit for vector_unsigned_charimpl<T> CloneToUninit for int8x8x3_timpl<T> CloneToUninit for OptionFlatten<A>