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