Trait origin_studio::std::marker::Copy

1.0.0 · source ·
pub trait Copy: Clone { }
Expand description

Types whose values can be duplicated simply by copying bits.

By default, variable bindings have ‘move semantics.’ In other words:

#[derive(Debug)]
struct Foo;

let x = Foo;

let y = x;

// `x` has moved into `y`, and so cannot be used

// println!("{x:?}"); // error: use of moved value

However, if a type implements Copy, it instead has ‘copy semantics’:

// We can derive a `Copy` implementation. `Clone` is also required, as it's
// a supertrait of `Copy`.
#[derive(Debug, Copy, Clone)]
struct Foo;

let x = Foo;

let y = x;

// `y` is a copy of `x`

println!("{x:?}"); // A-OK!

It’s important to note that in these two examples, the only difference is whether you are allowed to access x after the assignment. Under the hood, both a copy and a move can result in bits being copied in memory, although this is sometimes optimized away.

How can I implement Copy?

There are two ways to implement Copy on your type. The simplest is to use derive:

#[derive(Copy, Clone)]
struct MyStruct;

You can also implement Copy and Clone manually:

struct MyStruct;

impl Copy for MyStruct { }

impl Clone for MyStruct {
    fn clone(&self) -> MyStruct {
        *self
    }
}

There is a small difference between the two: the derive strategy will also place a Copy bound on type parameters, which isn’t always desired.

What’s the difference between Copy and Clone?

Copies happen implicitly, for example as part of an assignment y = x. The behavior of Copy is not overloadable; it is always a simple bit-wise copy.

Cloning is an explicit action, x.clone(). The implementation of Clone can provide any type-specific behavior necessary to duplicate values safely. For example, the implementation of Clone for String needs to copy the pointed-to string buffer in the heap. A simple bitwise copy of String values would merely copy the pointer, leading to a double free down the line. For this reason, String is Clone but not Copy.

Clone is a supertrait of Copy, so everything which is Copy must also implement Clone. If a type is Copy then its Clone implementation only needs to return *self (see the example above).

When can my type be Copy?

A type can implement Copy if all of its components implement Copy. For example, this struct can be Copy:

#[derive(Copy, Clone)]
struct Point {
   x: i32,
   y: i32,
}

A struct can be Copy, and i32 is Copy, therefore Point is eligible to be Copy. By contrast, consider

struct PointList {
    points: Vec<Point>,
}

The struct PointList cannot implement Copy, because Vec<T> is not Copy. If we attempt to derive a Copy implementation, we’ll get an error:

the trait `Copy` cannot be implemented for this type; field `points` does not implement `Copy`

Shared references (&T) are also Copy, so a type can be Copy, even when it holds shared references of types T that are not Copy. Consider the following struct, which can implement Copy, because it only holds a shared reference to our non-Copy type PointList from above:

#[derive(Copy, Clone)]
struct PointListWrapper<'a> {
    point_list_ref: &'a PointList,
}

When can’t my type be Copy?

Some types can’t be copied safely. For example, copying &mut T would create an aliased mutable reference. Copying String would duplicate responsibility for managing the String’s buffer, leading to a double free.

Generalizing the latter case, any type implementing Drop can’t be Copy, because it’s managing some resource besides its own size_of::<T> bytes.

If you try to implement Copy on a struct or enum containing non-Copy data, you will get the error E0204.

When should my type be Copy?

Generally speaking, if your type can implement Copy, it should. Keep in mind, though, that implementing Copy is part of the public API of your type. If the type might become non-Copy in the future, it could be prudent to omit the Copy implementation now, to avoid a breaking API change.

Additional implementors

In addition to the implementors listed below, the following types also implement Copy:

  • Function item types (i.e., the distinct types defined for each function)
  • Function pointer types (e.g., fn() -> i32)
  • Closure types, if they capture no value from the environment or if all such captured values implement Copy themselves. Note that variables captured by shared reference always implement Copy (even if the referent doesn’t), while variables captured by mutable reference never implement Copy.

Implementors§

source§

impl Copy for AsciiChar

source§

impl Copy for origin_studio::std::cmp::Ordering

1.34.0 · source§

impl Copy for Infallible

source§

impl Copy for VarError

1.28.0 · source§

impl Copy for origin_studio::std::fmt::Alignment

1.7.0 · source§

impl Copy for IpAddr

source§

impl Copy for Ipv6MulticastScope

source§

impl Copy for SocketAddr

source§

impl Copy for FpCategory

source§

impl Copy for Which

source§

impl Copy for SearchStep

source§

impl Copy for origin_studio::std::sync::atomic::Ordering

source§

impl Copy for rustix::backend::fs::types::Advice

source§

impl Copy for FileType

source§

impl Copy for FlockOperation

source§

impl Copy for rustix::backend::mm::types::Advice

source§

impl Copy for MembarrierCommand

source§

impl Copy for Resource

source§

impl Copy for FutexOperation

source§

impl Copy for TimerfdClockId

source§

impl Copy for ClockId

source§

impl Copy for SeekFrom

source§

impl Copy for Direction

source§

impl Copy for DumpableBehavior

source§

impl Copy for EndianMode

source§

impl Copy for FloatingPointMode

source§

impl Copy for MachineCheckMemoryCorruptionKillPolicy

source§

impl Copy for PTracer

source§

impl Copy for SpeculationFeature

source§

impl Copy for TimeStampCounterReadability

source§

impl Copy for TimingMethod

source§

impl Copy for VirtualMemoryMapAddress

source§

impl Copy for Signal

source§

impl Copy for Capability

source§

impl Copy for CoreSchedulingScope

source§

impl Copy for SecureComputingMode

source§

impl Copy for SysCallUserDispatchFastSwitch

source§

impl Copy for LinkNameSpaceType

source§

impl Copy for bool

source§

impl Copy for char

source§

impl Copy for f32

source§

impl Copy for f64

source§

impl Copy for i8

source§

impl Copy for i16

source§

impl Copy for i32

source§

impl Copy for i64

source§

impl Copy for i128

source§

impl Copy for isize

source§

impl Copy for !

source§

impl Copy for u8

source§

impl Copy for u16

source§

impl Copy for u32

source§

impl Copy for u64

source§

impl Copy for u128

source§

impl Copy for usize

source§

impl Copy for AllocError

source§

impl Copy for Global

1.28.0 · source§

impl Copy for Layout

source§

impl Copy for TypeId

1.27.0 · source§

impl Copy for CpuidResult

1.27.0 · source§

impl Copy for __m128

source§

impl Copy for __m128bh

1.27.0 · source§

impl Copy for __m128d

1.27.0 · source§

impl Copy for __m128i

1.27.0 · source§

impl Copy for __m256

source§

impl Copy for __m256bh

1.27.0 · source§

impl Copy for __m256d

1.27.0 · source§

impl Copy for __m256i

1.74.0-nightly · source§

impl Copy for __m512

source§

impl Copy for __m512bh

1.74.0-nightly · source§

impl Copy for __m512d

1.74.0-nightly · source§

impl Copy for __m512i

1.34.0 · source§

impl Copy for TryFromSliceError

1.34.0 · source§

impl Copy for CharTryFromError

1.59.0 · source§

impl Copy for TryFromCharError

source§

impl Copy for origin_studio::std::fmt::Error

source§

impl Copy for Assume

source§

impl Copy for Ipv4Addr

source§

impl Copy for Ipv6Addr

source§

impl Copy for SocketAddrV4

source§

impl Copy for SocketAddrV6

1.34.0 · source§

impl Copy for NonZeroI8

1.34.0 · source§

impl Copy for NonZeroI16

1.34.0 · source§

impl Copy for NonZeroI32

1.34.0 · source§

impl Copy for NonZeroI64

1.34.0 · source§

impl Copy for NonZeroI128

1.34.0 · source§

impl Copy for NonZeroIsize

1.28.0 · source§

impl Copy for NonZeroU8

1.28.0 · source§

impl Copy for NonZeroU16

1.28.0 · source§

impl Copy for NonZeroU32

1.28.0 · source§

impl Copy for NonZeroU64

1.28.0 · source§

impl Copy for NonZeroU128

1.28.0 · source§

impl Copy for NonZeroUsize

1.34.0 · source§

impl Copy for TryFromIntError

source§

impl Copy for RangeFull

source§

impl Copy for origin_studio::std::ptr::Alignment

source§

impl Copy for Utf8Error

1.3.0 · source§

impl Copy for Duration

source§

impl Copy for TimSortRun

1.36.0 · source§

impl Copy for RawWakerVTable

source§

impl Copy for Thread

source§

impl Copy for CreateFlags

source§

impl Copy for WatchFlags

source§

impl Copy for Access

source§

impl Copy for AtFlags

source§

impl Copy for FallocateFlags

source§

impl Copy for MemfdFlags

source§

impl Copy for Mode

source§

impl Copy for OFlags

source§

impl Copy for RenameFlags

source§

impl Copy for ResolveFlags

source§

impl Copy for SealFlags

source§

impl Copy for Stat

source§

impl Copy for StatVfsMountFlags

source§

impl Copy for StatxFlags

source§

impl Copy for Errno

source§

impl Copy for DupFlags

source§

impl Copy for FdFlags

source§

impl Copy for ReadWriteFlags

source§

impl Copy for MapFlags

source§

impl Copy for MlockFlags

source§

impl Copy for MprotectFlags

source§

impl Copy for MremapFlags

source§

impl Copy for MsyncFlags

source§

impl Copy for ProtFlags

source§

impl Copy for UserfaultfdFlags

source§

impl Copy for MountFlags

source§

impl Copy for MountPropagationFlags

source§

impl Copy for UnmountFlags

source§

impl Copy for PipeFlags

source§

impl Copy for SpliceFlags

source§

impl Copy for FutexFlags

source§

impl Copy for TimerfdFlags

source§

impl Copy for TimerfdTimerFlags

source§

impl Copy for XattrFlags

source§

impl Copy for Opcode

source§

impl Copy for Pid

source§

impl Copy for Cpuid

source§

impl Copy for MembarrierQuery

source§

impl Copy for PidfdFlags

source§

impl Copy for PidfdGetfdFlags

source§

impl Copy for FloatingPointEmulationControl

source§

impl Copy for FloatingPointExceptionMode

source§

impl Copy for SpeculationFeatureControl

source§

impl Copy for SpeculationFeatureState

source§

impl Copy for UnalignedAccessControl

source§

impl Copy for CpuSet

source§

impl Copy for WaitOptions

source§

impl Copy for WaitStatus

source§

impl Copy for WaitidOptions

source§

impl Copy for WaitidStatus

source§

impl Copy for CapabilityFlags

source§

impl Copy for CapabilitySets

source§

impl Copy for CapabilitiesSecureBits

source§

impl Copy for SVEVectorLengthConfig

source§

impl Copy for TaggedAddressMode

source§

impl Copy for ThreadNameSpaceType

source§

impl Copy for UnshareFlags

source§

impl Copy for Gid

source§

impl Copy for Uid

1.33.0 · source§

impl Copy for PhantomPinned

§

impl Copy for AArch64

§

impl Copy for Arm

§

impl Copy for Augmentation

§

impl Copy for BigEndian

§

impl Copy for DebugTypeSignature

§

impl Copy for DwAccess

§

impl Copy for DwAddr

§

impl Copy for DwAt

§

impl Copy for DwAte

§

impl Copy for DwCc

§

impl Copy for DwCfa

§

impl Copy for DwChildren

§

impl Copy for DwDefaulted

§

impl Copy for DwDs

§

impl Copy for DwDsc

§

impl Copy for DwEhPe

§

impl Copy for DwEnd

§

impl Copy for DwForm

§

impl Copy for DwId

§

impl Copy for DwIdx

§

impl Copy for DwInl

§

impl Copy for DwLang

§

impl Copy for DwLle

§

impl Copy for DwLnct

§

impl Copy for DwLne

§

impl Copy for DwLns

§

impl Copy for DwMacro

§

impl Copy for DwOp

§

impl Copy for DwOrd

§

impl Copy for DwRle

§

impl Copy for DwSect

§

impl Copy for DwSectV2

§

impl Copy for DwTag

§

impl Copy for DwUt

§

impl Copy for DwVirtuality

§

impl Copy for DwVis

§

impl Copy for DwarfFileType

§

impl Copy for DwoId

§

impl Copy for Encoding

§

impl Copy for Error

§

impl Copy for Format

§

impl Copy for LineEncoding

§

impl Copy for LittleEndian

§

impl Copy for Pointer

§

impl Copy for Range

§

impl Copy for ReaderOffsetId

§

impl Copy for Register

§

impl Copy for RiscV

§

impl Copy for RunTimeEndian

§

impl Copy for SectionId

§

impl Copy for StoreOnHeap

§

impl Copy for UnitIndexSection

§

impl Copy for UnwindAction

§

impl Copy for UnwindReasonCode

§

impl Copy for Value

§

impl Copy for ValueType

§

impl Copy for X86

§

impl Copy for X86_64

§

impl Copy for __kernel_fd_set

§

impl Copy for __kernel_fsid_t

§

impl Copy for __kernel_itimerspec

§

impl Copy for __kernel_old_itimerval

§

impl Copy for __kernel_old_timespec

§

impl Copy for __kernel_old_timeval

§

impl Copy for __kernel_sock_timeval

§

impl Copy for __kernel_timespec

§

impl Copy for __old_kernel_stat

§

impl Copy for __sifields

§

impl Copy for __sifields__bindgen_ty_1

§

impl Copy for __sifields__bindgen_ty_2

§

impl Copy for __sifields__bindgen_ty_3

§

impl Copy for __sifields__bindgen_ty_4

§

impl Copy for __sifields__bindgen_ty_5

§

impl Copy for __sifields__bindgen_ty_5__bindgen_ty_1

§

impl Copy for __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_1

§

impl Copy for __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_2

§

impl Copy for __sifields__bindgen_ty_5__bindgen_ty_1__bindgen_ty_3

§

impl Copy for __sifields__bindgen_ty_6

§

impl Copy for __sifields__bindgen_ty_7

§

impl Copy for __user_cap_data_struct

§

impl Copy for __user_cap_header_struct

§

impl Copy for clone_args

§

impl Copy for compat_statfs64

§

impl Copy for epoll_event

§

impl Copy for f_owner_ex

§

impl Copy for file_clone_range

§

impl Copy for file_dedupe_range_info

§

impl Copy for files_stat_struct

§

impl Copy for flock

§

impl Copy for flock64

§

impl Copy for fsconfig_command

§

impl Copy for fscrypt_get_key_status_arg

§

impl Copy for fscrypt_get_policy_ex_arg

§

impl Copy for fscrypt_get_policy_ex_arg__bindgen_ty_1

§

impl Copy for fscrypt_key

§

impl Copy for fscrypt_key_specifier

§

impl Copy for fscrypt_key_specifier__bindgen_ty_1

§

impl Copy for fscrypt_policy_v1

§

impl Copy for fscrypt_policy_v2

§

impl Copy for fscrypt_remove_key_arg

§

impl Copy for fstrim_range

§

impl Copy for fsxattr

§

impl Copy for futex_waitv

§

impl Copy for inodes_stat_t

§

impl Copy for iovec

§

impl Copy for itimerspec

§

impl Copy for itimerval

§

impl Copy for kernel_sigaction

§

impl Copy for kernel_sigset_t

§

impl Copy for ktermios

§

impl Copy for membarrier_cmd

§

impl Copy for membarrier_cmd_flag

§

impl Copy for mount_attr

§

impl Copy for open_how

§

impl Copy for pollfd

§

impl Copy for prctl_mm_map

§

impl Copy for rlimit

§

impl Copy for rlimit64

§

impl Copy for robust_list

§

impl Copy for robust_list_head

§

impl Copy for rusage

§

impl Copy for sigaction

§

impl Copy for sigaction__bindgen_ty_1

§

impl Copy for sigaltstack

§

impl Copy for sigevent

§

impl Copy for sigevent__bindgen_ty_1

§

impl Copy for sigevent__bindgen_ty_1__bindgen_ty_1

§

impl Copy for siginfo

§

impl Copy for siginfo__bindgen_ty_1

§

impl Copy for siginfo__bindgen_ty_1__bindgen_ty_1

§

impl Copy for sigval

§

impl Copy for stat

§

impl Copy for stat64

§

impl Copy for statfs

§

impl Copy for statfs64

§

impl Copy for statx

§

impl Copy for statx_timestamp

§

impl Copy for termio

§

impl Copy for termios

§

impl Copy for termios2

§

impl Copy for timespec

§

impl Copy for timeval

§

impl Copy for timezone

§

impl Copy for uffd_msg

§

impl Copy for uffd_msg__bindgen_ty_1

§

impl Copy for uffd_msg__bindgen_ty_1__bindgen_ty_1

§

impl Copy for uffd_msg__bindgen_ty_1__bindgen_ty_1__bindgen_ty_1

§

impl Copy for uffd_msg__bindgen_ty_1__bindgen_ty_2

§

impl Copy for uffd_msg__bindgen_ty_1__bindgen_ty_3

§

impl Copy for uffd_msg__bindgen_ty_1__bindgen_ty_4

§

impl Copy for uffd_msg__bindgen_ty_1__bindgen_ty_5

§

impl Copy for uffdio_api

§

impl Copy for uffdio_continue

§

impl Copy for uffdio_copy

§

impl Copy for uffdio_range

§

impl Copy for uffdio_register

§

impl Copy for uffdio_writeprotect

§

impl Copy for uffdio_zeropage

§

impl Copy for user_desc

§

impl Copy for vfs_cap_data

§

impl Copy for vfs_cap_data__bindgen_ty_1

§

impl Copy for vfs_ns_cap_data

§

impl Copy for vfs_ns_cap_data__bindgen_ty_1

§

impl Copy for winsize

source§

impl<'a> Copy for DynamicClockId<'a>

source§

impl<'a> Copy for Arguments<'a>

1.10.0 · source§

impl<'a> Copy for origin_studio::std::panic::Location<'a>

source§

impl<'a> Copy for IoSlice<'a>

source§

impl<'a, T, const N: usize> Copy for ArrayWindows<'a, T, N>where T: Copy + 'a,

source§

impl<'fd> Copy for BorrowedFd<'fd>

§

impl<'input, Endian> Copy for EndianSlice<'input, Endian>where Endian: Copy + Endianity,

1.55.0 · source§

impl<B, C> Copy for ControlFlow<B, C>where B: Copy, C: Copy,

source§

impl<Dyn> Copy for DynMetadata<Dyn>where Dyn: ?Sized,

1.28.0 · source§

impl<F> Copy for RepeatWith<F>where F: Copy,

source§

impl<Idx> Copy for RangeTo<Idx>where Idx: Copy,

1.26.0 · source§

impl<Idx> Copy for RangeToInclusive<Idx>where Idx: Copy,

1.33.0 · source§

impl<P> Copy for Pin<P>where P: Copy,

§

impl<R> Copy for DebugAddr<R>where R: Copy,

§

impl<R> Copy for DebugAranges<R>where R: Copy,

§

impl<R> Copy for DebugCuIndex<R>where R: Copy,

§

impl<R> Copy for DebugFrame<R>where R: Copy + Reader,

§

impl<R> Copy for DebugLineStr<R>where R: Copy,

§

impl<R> Copy for DebugLoc<R>where R: Copy,

§

impl<R> Copy for DebugLocLists<R>where R: Copy,

§

impl<R> Copy for DebugRanges<R>where R: Copy,

§

impl<R> Copy for DebugRngLists<R>where R: Copy,

§

impl<R> Copy for DebugStr<R>where R: Copy,

§

impl<R> Copy for DebugStrOffsets<R>where R: Copy,

§

impl<R> Copy for DebugTuIndex<R>where R: Copy,

§

impl<R> Copy for EhFrame<R>where R: Copy + Reader,

§

impl<R> Copy for EhFrameHdr<R>where R: Copy + Reader,

§

impl<R> Copy for Expression<R>where R: Copy + Reader,

§

impl<R> Copy for LocationListEntry<R>where R: Copy + Reader,

§

impl<R> Copy for LocationLists<R>where R: Copy,

§

impl<R> Copy for OperationIter<R>where R: Copy + Reader,

§

impl<R> Copy for RangeLists<R>where R: Copy,

§

impl<R, Offset> Copy for Location<R, Offset>where R: Copy + Reader<Offset = Offset>, Offset: Copy + ReaderOffset,

§

impl<R, Offset> Copy for Operation<R, Offset>where R: Copy + Reader<Offset = Offset>, Offset: Copy + ReaderOffset,

§

impl<R, Offset> Copy for Piece<R, Offset>where R: Copy + Reader<Offset = Offset>, Offset: Copy + ReaderOffset,

§

impl<Storage> Copy for __BindgenBitfieldUnit<Storage>where Storage: Copy,

1.17.0 · source§

impl<T> Copy for Bound<T>where T: Copy,

source§

impl<T> Copy for Option<T>where T: Copy,

1.36.0 · source§

impl<T> Copy for Poll<T>where T: Copy,

source§

impl<T> Copy for *const Twhere T: ?Sized,

source§

impl<T> Copy for *mut Twhere T: ?Sized,

source§

impl<T> Copy for &Twhere T: ?Sized,

Shared references can be copied, but mutable references cannot!

1.19.0 · source§

impl<T> Copy for Reverse<T>where T: Copy,

1.21.0 · source§

impl<T> Copy for Discriminant<T>

1.20.0 · source§

impl<T> Copy for ManuallyDrop<T>where T: Copy + ?Sized,

source§

impl<T> Copy for Saturating<T>where T: Copy,

source§

impl<T> Copy for Wrapping<T>where T: Copy,

1.25.0 · source§

impl<T> Copy for NonNull<T>where T: ?Sized,

source§

impl<T> Copy for PhantomData<T>where T: ?Sized,

1.36.0 · source§

impl<T> Copy for MaybeUninit<T>where T: Copy,

§

impl<T> Copy for DebugAbbrevOffset<T>where T: Copy,

§

impl<T> Copy for DebugAddrBase<T>where T: Copy,

§

impl<T> Copy for DebugAddrIndex<T>where T: Copy,

§

impl<T> Copy for DebugArangesOffset<T>where T: Copy,

§

impl<T> Copy for DebugFrameOffset<T>where T: Copy,

§

impl<T> Copy for DebugInfoOffset<T>where T: Copy,

§

impl<T> Copy for DebugLineOffset<T>where T: Copy,

§

impl<T> Copy for DebugLineStrOffset<T>where T: Copy,

§

impl<T> Copy for DebugLocListsBase<T>where T: Copy,

§

impl<T> Copy for DebugLocListsIndex<T>where T: Copy,

§

impl<T> Copy for DebugMacinfoOffset<T>where T: Copy,

§

impl<T> Copy for DebugMacroOffset<T>where T: Copy,

§

impl<T> Copy for DebugRngListsBase<T>where T: Copy,

§

impl<T> Copy for DebugRngListsIndex<T>where T: Copy,

§

impl<T> Copy for DebugStrOffset<T>where T: Copy,

§

impl<T> Copy for DebugStrOffsetsBase<T>where T: Copy,

§

impl<T> Copy for DebugStrOffsetsIndex<T>where T: Copy,

§

impl<T> Copy for DebugTypesOffset<T>where T: Copy,

§

impl<T> Copy for DieReference<T>where T: Copy,

§

impl<T> Copy for EhFrameOffset<T>where T: Copy,

§

impl<T> Copy for LocationListsOffset<T>where T: Copy,

§

impl<T> Copy for RangeListsOffset<T>where T: Copy,

§

impl<T> Copy for RawRangeListsOffset<T>where T: Copy,

§

impl<T> Copy for UnitOffset<T>where T: Copy,

§

impl<T> Copy for UnitSectionOffset<T>where T: Copy,

source§

impl<T, E> Copy for Result<T, E>where T: Copy, E: Copy,

source§

impl<T, const LANES: usize> Copy for Mask<T, LANES>where T: MaskElement, LaneCount<LANES>: SupportedLaneCount,

1.58.0 · source§

impl<T, const N: usize> Copy for [T; N]where T: Copy,

source§

impl<T, const N: usize> Copy for Simd<T, N>where LaneCount<N>: SupportedLaneCount, T: SimdElement,

source§

impl<Y, R> Copy for GeneratorState<Y, R>where Y: Copy, R: Copy,