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_signed_shortimpl<T> CloneToUninit for DebugAsHeximpl<T> CloneToUninit for PhantomData<T>impl<T> CloneToUninit for AddrParseErrorimpl<T> CloneToUninit for Chain<A, B>impl<T> CloneToUninit for uint32x4x4_timpl<T> CloneToUninit for Durationimpl<T> CloneToUninit for int32x4x4_timpl<T> CloneToUninit for PhantomContravariant<T>impl<T> CloneToUninit for Iter<'a, T>impl<T> CloneToUninit for HvxVectorimpl<T> CloneToUninit for vector_bool_shortimpl<T> CloneToUninit for uint32x4_timpl<T> CloneToUninit for poly16x8x4_timpl<T> CloneToUninit for poly64x2x3_timpl<T> CloneToUninit for vector_signed_intimpl<T> CloneToUninit for SocketAddrimpl<T> CloneToUninit for FilterMap<I, F>impl<T> CloneToUninit for Result<T, E>impl<T> CloneToUninit for uint16x8x4_timpl<T> CloneToUninit for uint64x2x3_timpl<T> CloneToUninit for m128iimpl<T> CloneToUninit for LocalWakerimpl<T> CloneToUninit for __m128iimpl<T> CloneToUninit for RepeatN<A>impl<T> CloneToUninit for int16x8x4_timpl<T> CloneToUninit for int64x2x3_timpl<T> CloneToUninit for MapWindows<I, F, N>impl<T> CloneToUninit for EncodeUtf16<'a>impl<T> CloneToUninit for Copied<I>impl<T> CloneToUninit for RangeInclusive<Idx>impl<T> CloneToUninit for vector_bool_intimpl<T> CloneToUninit for uint64x2_timpl<T> CloneToUninit for RSplitN<'a, P>impl<T> CloneToUninit for poly8x16x4_timpl<T> CloneToUninit for float32x4x3_timpl<T> CloneToUninit for vector_signed_long_longimpl<T> CloneToUninit for Orderingimpl<T> CloneToUninit for Ready<T>impl<T> CloneToUninit for RangeFromIter<A>impl<T> CloneToUninit for uint8x16x4_timpl<T> CloneToUninit for CharSearcher<'a>impl<T> CloneToUninit for float16x8x3_timpl<T> CloneToUninit for Signimpl<T> CloneToUninit for SplitN<'a, P>impl<T> CloneToUninit for __m256iimpl<T> CloneToUninit for FromBytesUntilNulErrorimpl<T> CloneToUninit for int8x16x4_timpl<T> CloneToUninit for uint32x4x3_timpl<T> CloneToUninit for FromIter<I>impl<T> CloneToUninit for u32impl<T> CloneToUninit for RSplitTerminator<'a, P>impl<T> CloneToUninit for Bound<T>impl<T> CloneToUninit for int8x8_timpl<T> CloneToUninit for float16x8_timpl<T> CloneToUninit for int32x4x3_timpl<T> CloneToUninit for vector_floatimpl CloneToUninit for strimpl<T> CloneToUninit for SplitTerminator<'a, P>impl<T> CloneToUninit for poly16x8x3_timpl<T> CloneToUninit for CharSliceSearcher<'a, 'b>impl<T> CloneToUninit for RangeToInclusive<Idx>impl<T> CloneToUninit for __m512iimpl<T> CloneToUninit for uint16x8x3_timpl<T> CloneToUninit for RSplit<'a, P>impl<T> CloneToUninit for NonNull<T>impl<T> CloneToUninit for DecodeUtf16<I>impl<T> CloneToUninit for int16x4_timpl<T> CloneToUninit for int16x8x3_timpl<T> CloneToUninit for f128impl<T> CloneToUninit for float64x2x4_timpl<T> CloneToUninit for FlatMap<I, U, F>impl<T> CloneToUninit for Simd<T, N>impl<T> CloneToUninit for SplitInclusive<'a, P>impl<T> CloneToUninit for TakeWhile<I, P>impl<T> CloneToUninit for Split<'a, P>impl<T> CloneToUninit for MaybeUninit<T>impl<T> CloneToUninit for poly8x16x3_timpl<T> CloneToUninit for float64x2_timpl<T> CloneToUninit for IntersperseWith<I, G>impl<T> CloneToUninit for __m128bhimpl<T> CloneToUninit for SplitAsciiWhitespace<'a>impl<T> CloneToUninit for ManuallyDrop<T>impl<T> CloneToUninit for Bytes<'a>impl<T> CloneToUninit for uint8x16x3_timpl<T> CloneToUninit for Iter<'a, A>impl<T> CloneToUninit for i8impl<T> CloneToUninit for Pending<T>impl<T> CloneToUninit for int32x2_timpl<T> CloneToUninit for int8x16x3_timpl<T> CloneToUninit for SplitWhitespace<'a>impl<T> CloneToUninit for Range<Idx>impl<T> CloneToUninit for Zip<A, B>impl<T> CloneToUninit for FromFn<F>impl<T> CloneToUninit for poly64x2x2_timpl<T> CloneToUninit for i64impl<T> CloneToUninit for Assumeimpl<T> CloneToUninit for PhantomCovariant<T>impl<T> CloneToUninit for Alignmentimpl<T> CloneToUninit for GetDisjointMutErrorimpl<T> CloneToUninit for LinesAny<'a>impl<T> CloneToUninit for Utf8Pattern<'a>impl<T> CloneToUninit for __m128himpl<T> CloneToUninit for boolimpl<T> CloneToUninit for Chars<'a>impl<T> CloneToUninit for uint64x2x2_timpl<T> CloneToUninit for i16impl<T> CloneToUninit for PhantomPinnedimpl<T> CloneToUninit for ToUppercaseimpl<T> CloneToUninit for IntoIter<A>impl<T> CloneToUninit for SocketAddrV4impl<T> CloneToUninit for int64x2x2_timpl<T> CloneToUninit for int64x1_timpl<T> CloneToUninit for ParseBoolErrorimpl<T> CloneToUninit for SplitInclusive<'a, T, P>impl<T> CloneToUninit for float32x4x2_timpl<T> CloneToUninit for Pin<Ptr>impl<T> CloneToUninit for float64x2x3_timpl<T> CloneToUninit for BuildHasherDefault<H>impl<T> CloneToUninit for float16x8x2_timpl<T> CloneToUninit for Split<'a, T, P>impl<T> CloneToUninit for TypeIdimpl<T> CloneToUninit for MaybeDangling<P>impl CloneToUninit for CStrimpl<T> CloneToUninit for uint32x4x2_timpl<T> CloneToUninit for VaList<'a>impl<T> CloneToUninit for vector_signed_longimpl<T> CloneToUninit for int8x16_timpl<T> CloneToUninit for SipHasherimpl<T> CloneToUninit for OptionFlatten<A>impl<T> CloneToUninit for int32x4x2_timpl<T> CloneToUninit for u64impl<T> CloneToUninit for m256impl<T> CloneToUninit for Successors<T, F>impl<T> CloneToUninit for poly16x8x2_timpl<T> CloneToUninit for RangeTo<Idx>impl<T> CloneToUninit for HvxVectorPredimpl<T> CloneToUninit for Bytes<'a>impl<T> CloneToUninit for uint16x8x2_timpl<T> CloneToUninit for i128impl<T> CloneToUninit for vector_unsigned_charimpl<T> CloneToUninit for vector_doubleimpl<T> CloneToUninit for RChunks<'a, T>impl<T> CloneToUninit for int16x8_timpl<T> CloneToUninit for vector_bool_charimpl<T> CloneToUninit for ChunkBy<'a, T, P>impl<T> CloneToUninit for PhantomInvariantLifetime<'a>impl<T> CloneToUninit for int16x8x2_timpl<T> CloneToUninit for i32impl<T> CloneToUninit for MapWhile<I, P>impl<T> CloneToUninit for IntErrorKindimpl<T> CloneToUninit for Peekable<I>impl<T> CloneToUninit for poly8x16x2_timpl<T> CloneToUninit for StepBy<I>impl<T> CloneToUninit for CharIndices<'a>impl<T> CloneToUninit for uint8x16x2_timpl<T> CloneToUninit for vector_unsigned_shortimpl<T> CloneToUninit for RChunksExact<'a, T>impl<T> CloneToUninit for int32x4_timpl<T> CloneToUninit for vector_bool_shortimpl<T> CloneToUninit for Intersperse<I>impl<T> CloneToUninit for fn(_: T) -> Retimpl<T> CloneToUninit for int8x16x2_timpl<T> CloneToUninit for Lines<'a>impl<T> CloneToUninit for RefCell<T>impl<T> CloneToUninit for HvxVectorPredimpl<T> CloneToUninit for u128impl<T> CloneToUninit for vector_unsigned_intimpl<T> CloneToUninit for int64x2_timpl<T> CloneToUninit for vector_bool_intimpl<T> CloneToUninit for ArrayChunks<I, N>impl<T> CloneToUninit for RMatches<'a, P>impl<T> CloneToUninit for Chunks<'a, T>impl<T> CloneToUninit for ArrayWindows<'a, T, N>impl<T> CloneToUninit for m128dimpl<T> CloneToUninit for FormattingOptionsimpl<T> CloneToUninit for __m128dimpl<T> CloneToUninit for AllocErrorimpl<T> CloneToUninit for float64x2x2_timpl<T> CloneToUninit for PhantomContravariantLifetime<'a>impl<T> CloneToUninit for float16x4_timpl<T> CloneToUninit for EscapeDefaultimpl<T> CloneToUninit for vector_bool_long_longimpl<T> CloneToUninit for LayoutErrorimpl<T> CloneToUninit for ChunksExact<'a, T>impl<T> CloneToUninit for CharArrayRefSearcher<'a, 'b, N>impl<T> CloneToUninit for poly64x1x4_timpl<T> CloneToUninit for SkipWhile<I, P>impl<T> CloneToUninit for __m256dimpl<T> CloneToUninit for uint64x1x4_timpl<T> CloneToUninit for PhantomCovariantLifetime<'a>impl<T> CloneToUninit for AsciiCharimpl<T> CloneToUninit for poly8x8_timpl<T> CloneToUninit for int64x1x4_timpl<T> CloneToUninit for NonZero<T>impl<T> CloneToUninit for RepeatWith<F>impl<T> CloneToUninit for [MaybeUninit<T>; N]impl<T> CloneToUninit for bf16impl<T> CloneToUninit for EscapeUnicode<'a>impl<T> CloneToUninit for float32x2x4_timpl<T> CloneToUninit for float64x1_timpl CloneToUninit for ByteStrimpl<T> CloneToUninit for __m512dimpl<T> CloneToUninit for Windows<'a, T>impl<T> CloneToUninit for Range<Idx>impl<T> CloneToUninit for SearchStepimpl<T> CloneToUninit for isizeimpl<T> CloneToUninit for Mask<T, N>impl<T> CloneToUninit for RangeToInclusive<Idx>impl<T> CloneToUninit for float16x4x4_timpl<T> CloneToUninit for poly16x4_timpl<T> CloneToUninit for *const Timpl<T> CloneToUninit for uint32x2x4_timpl<T> CloneToUninit for int32x2x4_timpl<T> CloneToUninit for IntoIter<T, N>impl<T> CloneToUninit for __m512bhimpl<T> CloneToUninit for Alignmentimpl<T> CloneToUninit for poly16x4x4_timpl<T> CloneToUninit for poly64x1x3_timpl<T> CloneToUninit for TryFromSliceErrorimpl<T> CloneToUninit for float32x2_timpl<T> CloneToUninit for Utf8Errorimpl<T> CloneToUninit for uint16x4x4_timpl<T> CloneToUninit for uint64x1x3_timpl<T> CloneToUninit for OnceCell<T>impl<T> CloneToUninit for Matches<'a, P>impl<T> CloneToUninit for int16x4x4_timpl<T> CloneToUninit for int64x1x3_timpl<T> CloneToUninit for Saturating<T>impl<T> CloneToUninit for Poll<T>impl<T> CloneToUninit for Flatten<I>impl<T> CloneToUninit for __m512himpl<T> CloneToUninit for poly8x8x4_timpl<T> CloneToUninit for float32x2x3_timpl<T> CloneToUninit for Skip<I>impl<T> CloneToUninit for Cell<T>impl<T> CloneToUninit for Arguments<'a>impl<T> CloneToUninit for Location<'a>impl<T> CloneToUninit for poly64x1_timpl<T> CloneToUninit for uint8x8x4_timpl<T> CloneToUninit for float16x4x3_timpl<T> CloneToUninit for ()impl<T> CloneToUninit for RangeFullimpl<T> CloneToUninit for Utf8Chunks<'a>impl<T> CloneToUninit for usizeimpl<T> CloneToUninit for m256iimpl<T> CloneToUninit for int8x8x4_timpl<T> CloneToUninit for uint32x2x3_timpl<T> CloneToUninit for RawWakerVTableimpl<T> CloneToUninit for Wakerimpl<T> CloneToUninit for int32x2x3_timpl<T> CloneToUninit for Source<'a>impl<T> CloneToUninit for ControlFlow<B, C>impl<T> CloneToUninit for HvxVectorPairimpl<T> CloneToUninit for vector_signed_charimpl<T> CloneToUninit for vector_bool_longimpl<T> CloneToUninit for poly8x16_timpl<T> CloneToUninit for poly16x4x3_timpl<T> CloneToUninit for vector_unsigned_charimpl<T> CloneToUninit for StrSearcher<'a, 'b>impl<T> CloneToUninit for uint16x4x3_timpl<T> CloneToUninit for EscapeDefault<'a>impl<T> CloneToUninit for ToLowercaseimpl<T> CloneToUninit for f16x2impl<T> CloneToUninit for ParseCharErrorimpl<T> CloneToUninit for int16x4x3_timpl<T> CloneToUninit for float64x1x4_timpl<T> CloneToUninit for vector_signed_shortimpl<T> CloneToUninit for poly16x8_timpl<T> CloneToUninit for poly8x8x3_timpl<T> CloneToUninit for vector_unsigned_shortimpl<T> CloneToUninit for TryFromIntErrorimpl<T> CloneToUninit for (T)impl<T> CloneToUninit for EscapeUnicodeimpl<T> CloneToUninit for Take<I>impl<T> CloneToUninit for EscapeAscii<'a>impl<T> CloneToUninit for uint8x8x3_timpl<T> CloneToUninit for TryFromFloatSecsErrorimpl<T> CloneToUninit for Utf8Chunk<'a>impl<T> CloneToUninit for int8x8x3_timpl<T> CloneToUninit for HvxVectorPairimpl<T> CloneToUninit for poly64x1x2_timpl<T> CloneToUninit for Exclusive<T>impl<T> CloneToUninit for vector_signed_intimpl<T> CloneToUninit for float32x4_timpl<T> CloneToUninit for vector_unsigned_intimpl<T> CloneToUninit for TryFromCharErrorimpl<T> CloneToUninit for v128impl<T> CloneToUninit for uint64x1x2_timpl<T> CloneToUninit for EscapeDefaultimpl<T> CloneToUninit for Cloned<I>impl<T> CloneToUninit for Empty<T>impl<T> CloneToUninit for Ipv4Addrimpl<T> CloneToUninit for m128impl<T> CloneToUninit for __m128impl<T> CloneToUninit for RMatchIndices<'a, P>impl<T> CloneToUninit for int64x1x2_timpl<T> CloneToUninit for DecodeUtf16Errorimpl<T> CloneToUninit for float32x2x2_timpl<T> CloneToUninit for vector_floatimpl<T> CloneToUninit for OnceWith<F>impl<T> CloneToUninit for poly64x2_timpl<T> CloneToUninit for FpCategoryimpl<T> CloneToUninit for vector_unsigned_long_longimpl<T> CloneToUninit for Layoutimpl<T> CloneToUninit for float64x1x3_timpl<T> CloneToUninit for RangeInclusive<Idx>impl<T> CloneToUninit for float16x4x2_timpl<T> CloneToUninit for EscapeDebugimpl<T> CloneToUninit for IntoIter<T>impl<T> CloneToUninit for FromCoroutine<G>impl<T> CloneToUninit for RangeFrom<Idx>impl<T> CloneToUninit for CharArraySearcher<'a, N>impl<T> CloneToUninit for Filter<I, P>impl<T> CloneToUninit for __m256impl<T> CloneToUninit for uint32x2x2_timpl<T> CloneToUninit for CpuidResultimpl<T> CloneToUninit for Once<T>impl<T> CloneToUninit for Ipv6MulticastScopeimpl<T> CloneToUninit for int32x2x2_timpl<T> CloneToUninit for CharTryFromErrorimpl<T> CloneToUninit for RangeFrom<Idx>impl<T> CloneToUninit for uint8x8_timpl<T> CloneToUninit for vector_doubleimpl<T> CloneToUninit for poly16x4x2_timpl<T> CloneToUninit for CharPredicateSearcher<'a, F>impl<T: Clone> CloneToUninit for Timpl<T> CloneToUninit for Reverse<T>impl<T> CloneToUninit for __m512impl<T> CloneToUninit for uint16x4x2_timpl<T> CloneToUninit for neverimpl<T> CloneToUninit for Infallibleimpl<T> CloneToUninit for Ipv6Addrimpl<T> CloneToUninit for int16x4x2_timpl<T> CloneToUninit for uint16x4_timpl<T> CloneToUninit for PhantomInvariant<T>impl<T> CloneToUninit for poly8x8x2_timpl<T> CloneToUninit for Scan<I, St, F>impl<T> CloneToUninit for Orderingimpl<T> CloneToUninit for u8impl<T> CloneToUninit for __m256bhimpl<T> CloneToUninit for IpAddrimpl<T> CloneToUninit for uint8x8x2_timpl<T> CloneToUninit for Inspect<I, F>impl<T> CloneToUninit for Repeat<A>impl<T> CloneToUninit for int8x8x2_timpl<T> CloneToUninit for uint32x2_timpl<T> CloneToUninit for SocketAddrV6impl<T> CloneToUninit for Discriminant<T>impl<T> CloneToUninit for u16impl<T> CloneToUninit for RSplit<'a, T, P>impl<T> CloneToUninit for CoroutineState<Y, R>impl<T> CloneToUninit for RangeIter<A>impl<T> CloneToUninit for __m256himpl<T> CloneToUninit for EscapeDebug<'a>impl<T> CloneToUninit for Rev<T>impl<T> CloneToUninit for MatchIndices<'a, P>impl<T> CloneToUninit for Map<I, F>impl<T> CloneToUninit for DynMetadata<Dyn>impl<T> CloneToUninit for uint64x1_timpl<T> CloneToUninit for Iter<'a, T>impl<T> CloneToUninit for f32impl<T> CloneToUninit for Wrapping<T>impl<T> CloneToUninit for float64x1x2_timpl<T> CloneToUninit for Localityimpl<T> CloneToUninit for Cycle<I>impl<T> CloneToUninit for f64impl<T> CloneToUninit for poly64x2x4_timpl<T> CloneToUninit for HvxVectorimpl<T> CloneToUninit for RangeInclusiveIter<A>impl<T> CloneToUninit for vector_unsigned_longimpl<T> CloneToUninit for uint8x16_timpl<T> CloneToUninit for uint64x2x4_timpl<T> CloneToUninit for vector_signed_charimpl<T> CloneToUninit for FromBytesWithNulErrorimpl<T> CloneToUninit for m256dimpl<T: Clone> CloneToUninit for [T]impl<T> CloneToUninit for int64x2x4_timpl<T> CloneToUninit for f16impl<T> CloneToUninit for Errorimpl<T> CloneToUninit for Option<T>impl<T> CloneToUninit for Enumerate<I>impl<T> CloneToUninit for float32x4x4_timpl<T> CloneToUninit for ParseIntErrorimpl<T> CloneToUninit for Fuse<I>impl<T> CloneToUninit for vector_bool_charimpl<T> CloneToUninit for uint16x8_timpl<T> CloneToUninit for charimpl<T> CloneToUninit for float16x8x4_t