referrerpolicy=no-referrer-when-downgrade
sp_std::marker

Trait 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:

#[derive(Clone)]
struct MyStruct<T>(T);

impl<T: Copy> Copy for MyStruct<T> { }

This isn’t always desired. For example, shared references (&T) can be copied regardless of whether T is Copy. Likewise, a generic struct containing markers such as PhantomData could potentially be duplicated with a bit-wise copy.

§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.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementors§

1.0.0 · Source§

impl Copy for sp_std::cmp::Ordering

1.34.0 · Source§

impl Copy for Infallible

1.28.0 · Source§

impl Copy for sp_std::fmt::Alignment

1.0.0 · Source§

impl Copy for FpCategory

Source§

impl Copy for SearchStep

1.0.0 · Source§

impl Copy for sp_std::sync::atomic::Ordering

1.12.0 · Source§

impl Copy for RecvTimeoutError

1.0.0 · Source§

impl Copy for TryRecvError

Source§

impl Copy for AsciiChar

1.7.0 · Source§

impl Copy for IpAddr

Source§

impl Copy for Ipv6MulticastScope

1.0.0 · Source§

impl Copy for SocketAddr

1.0.0 · Source§

impl Copy for SeekFrom

1.0.0 · Source§

impl Copy for ErrorKind

1.0.0 · Source§

impl Copy for Shutdown

Source§

impl Copy for BacktraceStyle

Source§

impl Copy for _Unwind_Action

Source§

impl Copy for _Unwind_Reason_Code

1.0.0 · Source§

impl Copy for bool

1.0.0 · Source§

impl Copy for char

1.0.0 · Source§

impl Copy for f16

1.0.0 · Source§

impl Copy for f32

1.0.0 · Source§

impl Copy for f64

1.0.0 · Source§

impl Copy for f128

1.0.0 · Source§

impl Copy for i8

1.0.0 · Source§

impl Copy for i16

1.0.0 · Source§

impl Copy for i32

1.0.0 · Source§

impl Copy for i64

1.0.0 · Source§

impl Copy for i128

1.0.0 · Source§

impl Copy for isize

Source§

impl Copy for !

1.0.0 · Source§

impl Copy for u8

1.0.0 · Source§

impl Copy for u16

1.0.0 · Source§

impl Copy for u32

1.0.0 · Source§

impl Copy for u64

1.0.0 · Source§

impl Copy for u128

1.0.0 · Source§

impl Copy for usize

Source§

impl Copy for AllocError

Source§

impl Copy for Global

1.28.0 · Source§

impl Copy for Layout

1.28.0 · Source§

impl Copy for System

1.0.0 · Source§

impl Copy for TypeId

1.0.0 · Source§

impl Copy for Error

Source§

impl Copy for Assume

1.34.0 · Source§

impl Copy for TryFromIntError

1.0.0 · Source§

impl Copy for RangeFull

Source§

impl Copy for sp_std::ptr::Alignment

1.0.0 · Source§

impl Copy for Utf8Error

1.0.0 · Source§

impl Copy for RecvError

1.5.0 · Source§

impl Copy for WaitTimeoutResult

1.3.0 · Source§

impl Copy for Duration

1.34.0 · Source§

impl Copy for TryFromSliceError

1.34.0 · Source§

impl Copy for CharTryFromError

1.59.0 · Source§

impl Copy for TryFromCharError

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

Source§

impl Copy for __m128h

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

Source§

impl Copy for __m256h

1.27.0 · Source§

impl Copy for __m256i

1.72.0 · Source§

impl Copy for __m512

Source§

impl Copy for __m512bh

1.72.0 · Source§

impl Copy for __m512d

Source§

impl Copy for __m512h

1.72.0 · Source§

impl Copy for __m512i

Source§

impl Copy for bf16

1.0.0 · Source§

impl Copy for Ipv4Addr

1.0.0 · Source§

impl Copy for Ipv6Addr

1.0.0 · Source§

impl Copy for SocketAddrV4

1.0.0 · Source§

impl Copy for SocketAddrV6

1.36.0 · Source§

impl Copy for RawWakerVTable

1.75.0 · Source§

impl Copy for FileTimes

1.1.0 · Source§

impl Copy for FileType

1.0.0 · Source§

impl Copy for Empty

1.0.0 · Source§

impl Copy for Sink

Source§

impl Copy for UCred

1.61.0 · Source§

impl Copy for ExitCode

1.0.0 · Source§

impl Copy for ExitStatus

Source§

impl Copy for ExitStatusError

Source§

impl Copy for DefaultRandomSource

1.26.0 · Source§

impl Copy for AccessError

1.19.0 · Source§

impl Copy for ThreadId

1.8.0 · Source§

impl Copy for Instant

1.8.0 · Source§

impl Copy for SystemTime

1.33.0 · Source§

impl Copy for PhantomPinned

Source§

impl<'a> Copy for Utf8Pattern<'a>

1.0.0 · Source§

impl<'a> Copy for Component<'a>

1.0.0 · Source§

impl<'a> Copy for Prefix<'a>

1.0.0 · Source§

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

1.10.0 · Source§

impl<'a> Copy for Location<'a>

1.36.0 · Source§

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

1.28.0 · Source§

impl<'a> Copy for Ancestors<'a>

1.0.0 · Source§

impl<'a> Copy for PrefixComponent<'a>

Source§

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

1.63.0 · Source§

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

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,

1.0.0 · Source§

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

1.26.0 · Source§

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

Source§

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

Source§

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

Source§

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

1.33.0 · Source§

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

1.17.0 · Source§

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

Source§

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

1.0.0 · Source§

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

1.0.0 · Source§

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

1.36.0 · Source§

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

1.0.0 · Source§

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

1.0.0 · Source§

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

1.0.0 · Source§

impl<T> Copy for &T
where 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,

1.28.0 · Source§

impl<T> Copy for NonZero<T>

1.74.0 · Source§

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

1.0.0 · Source§

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

1.25.0 · Source§

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

1.0.0 · Source§

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

1.0.0 · Source§

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

1.36.0 · Source§

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

1.0.0 · Source§

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

1.58.0 · Source§

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

Source§

impl<T, const N: usize> Copy for Mask<T, N>

Source§

impl<T, const N: usize> Copy for Simd<T, N>

Source§

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

impl Copy for ProxyType

impl Copy for Runtime

impl Copy for ProxyType

impl Copy for Runtime

impl Copy for LaneState

impl Copy for ParaId

impl<BlockNumber: Copy, Balance: Copy> Copy for Registration<BlockNumber, Balance>

impl<LaneId: Copy> Copy for RewardsAccountParams<LaneId>

impl<BlockNumber: Copy, BlockHash: Copy> Copy for TransactionEra<BlockNumber, BlockHash>

impl<Hash: Copy, Number: Copy> Copy for HeaderId<Hash, Number>

impl Copy for Account

impl Copy for BridgeState

impl Copy for BridgeId

impl Copy for Runtime

impl Copy for Runtime

impl Copy for Runtime

impl Copy for ProxyType

impl Copy for Runtime

impl Copy for ProxyType

impl Copy for Runtime

impl Copy for ProxyType

impl Copy for Runtime

impl Copy for Runtime

impl Copy for CountBound

impl Copy for SizeBound

impl Copy for Pays

impl Copy for Fortitude

impl Copy for Precision

impl Copy for Provenance

impl Copy for Restriction

impl Copy for Instance1

impl Copy for PalletId

impl Copy for Footprint

impl<Balance: Copy> Copy for WithdrawConsequence<Balance>

impl<BlockNumber: Copy> Copy for DispatchTime<BlockNumber>

impl Copy for Runtime

impl Copy for Runtime

impl Copy for ProxyType

impl Copy for Runtime

impl<SourceChainBalance: Copy> Copy for MessageDetails<SourceChainBalance>

impl Copy for Runtime

impl Copy for SizeType

impl Copy for Mode

impl Copy for BlockType

impl Copy for MemberRole

impl Copy for Version

impl Copy for HoldReason

impl Copy for DebitFlags

impl Copy for Runtime

impl Copy for Reasons

impl<N: Copy + Copy + Clone + PartialOrd + Ord + Eq + PartialEq + Encode + Decode> Copy for TimeSlot<N>

impl<LaneId: Copy> Copy for RewardsAccountParams<LaneId>

impl Copy for Finality

impl Copy for CoreMask

impl Copy for RegionId

impl<Balance: Copy> Copy for AdaptedPrices<Balance>

impl<Balance: Copy> Copy for SalePerformance<Balance>

impl<I: Copy + 'static> Copy for HoldReason<I>

impl Copy for DebugInfo

impl Copy for Determinism

impl Copy for HoldReason

impl Copy for Runtime

impl Copy for Runtime

impl Copy for CallFlags

impl Copy for ReturnFlags

impl Copy for Conviction

impl Copy for Status

impl Copy for Vote

impl<Balance: Copy> Copy for AccountVote<Balance>

impl<Balance: Copy> Copy for Delegations<Balance>

impl Copy for Wish

impl Copy for Runtime

impl Copy for HoldReason

impl Copy for Conviction

impl Copy for Vote

impl<Balance: Copy> Copy for AccountVote<Balance>

impl<Balance: Copy> Copy for Delegations<Balance>

impl Copy for HoldReason

impl Copy for Status

impl<T: Config> Copy for Phase<T>

impl<Bn: Copy> Copy for Phase<Bn>

impl Copy for HoldReason

impl Copy for TimeSlot

impl<Balance: Copy + Encode + Decode + MaxEncodedLen + Copy + Clone + Debug + Eq + PartialEq> Copy for Judgement<Balance>

impl<BlockNumber: Copy> Copy for Timepoint<BlockNumber>

impl Copy for HoldReason

impl Copy for ItemSetting

impl Copy for ItemConfig

impl<CollectionId: Copy> Copy for MintType<CollectionId>

impl<Price: Copy, BlockNumber: Copy, CollectionId: Copy> Copy for CollectionConfig<Price, BlockNumber, CollectionId>

impl<Price: Copy, BlockNumber: Copy, CollectionId: Copy> Copy for MintSettings<Price, BlockNumber, CollectionId>

impl Copy for HoldReason

impl Copy for PoolState

impl Copy for Runtime

impl<AccountId: Copy> Copy for CommissionClaimPermission<AccountId>

impl<Balance: Copy> Copy for BondExtra<Balance>

impl<BlockNumber: Copy> Copy for CommissionChangeRate<BlockNumber>

impl<T: Copy + Config> Copy for Commission<T>
where T::AccountId: Copy,

impl Copy for Test

impl Copy for HoldReason

impl Copy for DepositKind

impl<AccountId: Copy, Hash: Copy, BlockNumber: Copy> Copy for Announcement<AccountId, Hash, BlockNumber>

impl<AccountId: Copy, ProxyType: Copy, BlockNumber: Copy> Copy for ProxyDefinition<AccountId, ProxyType, BlockNumber>

impl Copy for VoteRecord

impl Copy for HoldReason

impl Copy for ExecError

impl Copy for BlakeTwo256

impl Copy for Runtime

impl Copy for Runtime

impl Copy for CallFlags

impl Copy for ReturnFlags

impl Copy for ExitReason

impl Copy for HoldReason

impl<Period: Copy> Copy for RetryConfig<Period>

impl Copy for Judgement

impl Copy for Tally

impl Copy for Vote

impl<AccountId: Copy, Balance: Copy> Copy for BidKind<AccountId, Balance>

impl<AccountId: Copy, Balance: Copy> Copy for Bid<AccountId, Balance>

impl<AccountId: Copy, Balance: Copy> Copy for Candidacy<AccountId, Balance>

impl<AccountId: Copy, Balance: Copy> Copy for IntakeRecord<AccountId, Balance>

impl<Balance: Copy> Copy for GroupParams<Balance>

impl<Balance: Copy, BlockNumber: Copy> Copy for Payout<Balance, BlockNumber>

impl Copy for Forcing

impl Copy for HoldReason

impl<AccountId: Copy> Copy for RewardDestination<AccountId>

impl<DataProvider: Copy> Copy for StaticTracker<DataProvider>

impl Copy for Forcing

impl Copy for HoldReason

impl<AccountId: Copy> Copy for RewardDestination<AccountId>

impl<DataProvider: Copy> Copy for StaticTracker<DataProvider>

impl Copy for ProxyType

impl Copy for Runtime

impl Copy for ProxyType

impl Copy for Runtime

impl Copy for HoldReason

impl Copy for Releases

impl Copy for HoldReason

impl Copy for Releases

impl<Balance: Copy, BlockNumber: Copy> Copy for VestingInfo<Balance, BlockNumber>

impl Copy for HoldReason

impl<I: Copy + 'static> Copy for HoldReason<I>

impl Copy for Runtime

impl<T: Copy> Copy for AvailableHeader<T>

impl Copy for Runtime

impl Copy for ProxyType

impl Copy for Runtime

impl Copy for ProxyType

impl Copy for Runtime

impl Copy for Config

impl Copy for Tick

impl Copy for Config

impl Copy for Config

impl Copy for Priority

impl Copy for WorkerKind

impl Copy for WaitOutcome

impl Copy for IsAuthority

impl Copy for PeerSet

impl Copy for Protocol

impl Copy for PvfExecKind

impl Copy for Id

impl Copy for Sibling

impl Copy for PvfExecKind

impl Copy for PvfPrepKind

impl Copy for ChunkIndex

impl Copy for CoreIndex

impl Copy for GroupIndex

impl<BlockNumber: Copy> Copy for SchedulerParams<BlockNumber>

impl Copy for SlotRange

impl<BlockNumber: Copy> Copy for LastContribution<BlockNumber>

impl Copy for Runtime

impl Copy for Runtime

impl Copy for Runtime

impl Copy for Runtime

impl Copy for Runtime

impl Copy for Runtime

impl Copy for Runtime

impl Copy for Runtime

impl Copy for Runtime

impl Copy for Chain

impl Copy for Strategy

impl Copy for Runtime

impl<BlockId: Copy> Copy for TrackedTransactionStatus<BlockId>

impl Copy for Runtime

impl Copy for ProxyType

impl Copy for Runtime

impl Copy for Database

impl Copy for NodeKeyType

impl Copy for OutputType

impl Copy for RpcMethods

impl Copy for SyncMode

impl Copy for MemorySize

impl Copy for Direction

impl Copy for SetId

impl Copy for Role

impl Copy for SyncMode

impl Copy for BlockState

impl Copy for Direction

impl Copy for Roles

impl Copy for Direction

impl Copy for StrategyKey

impl<B> Copy for ExtendedPeerInfo<B>
where B: BlockT,

impl Copy for Code

impl Copy for Multihash

impl Copy for PeerId

impl Copy for DenyUnsafe

impl Copy for BlockStats

impl Copy for RpcMethods

impl Copy for Metric

impl Copy for Requirement

impl Copy for Throughput

impl Copy for SeqID

impl Copy for BlsError

impl Copy for Mode

impl Copy for PublicKey

impl Copy for Signature

impl Copy for ChannelId

impl Copy for HeaderId

impl Copy for Network

impl Copy for SendError

impl Copy for Test

impl Copy for Runtime

impl Copy for Rounding

impl Copy for FixedI128

impl Copy for FixedI64

impl Copy for FixedU128

impl Copy for FixedU64

impl Copy for PerU16

impl Copy for Perbill

impl Copy for Percent

impl Copy for Permill

impl Copy for Perquintill

impl Copy for Rational128

impl Copy for BlockStatus

impl<N: Copy> Copy for BlockGap<N>

impl Copy for BlockOrigin

impl Copy for NoNetwork

impl<AuthorityId: Copy> Copy for Keyring<AuthorityId>

impl Copy for Slot

impl Copy for HttpError

impl Copy for StorageKind

impl Copy for CallContext

impl Copy for KeyTypeId

impl Copy for Pair

impl Copy for Duration

impl Copy for Timestamp

impl<const N: usize, T> Copy for CryptoBytes<N, T>

impl Copy for HostHooks

impl Copy for HostHooks

impl Copy for HostHooks

impl Copy for HostHooks

impl Copy for HostHooks

impl Copy for Keyring

impl Copy for Keyring

impl Copy for Keyring

impl Copy for NumberOrHex

impl Copy for TokenError

impl Copy for Era

impl Copy for TrieError

impl Copy for ModuleError

impl Copy for ModuleError

impl<'a> Copy for OpaqueDigestItemId<'a>

impl<Block: BlockT> Copy for BlockId<Block>

impl<Info> Copy for DispatchErrorWithPostInfo<Info>
where Info: Eq + PartialEq + Clone + Copy + Encode + Decode + Printable + Copy,

impl<T: Copy> Copy for IdentityLookup<T>

impl<T: Copy, D: Get<T>> Copy for TypeWithDefault<T, D>

impl Copy for Opaque

impl<AccountId: Copy, Balance: Copy + HasCompact> Copy for IndividualExposure<AccountId, Balance>

impl<Balance: Copy + HasCompact + MaxEncodedLen> Copy for PagedExposureMetadata<Balance>

impl<Balance: Copy> Copy for Stake<Balance>

impl Copy for ChildType

impl Copy for Timestamp

impl Copy for CacheSize

impl Copy for Error

impl Copy for ReturnValue

impl Copy for Value

impl Copy for ValueType

impl<T> Copy for Pointer<T>

impl Copy for Weight

impl Copy for AssetId

impl Copy for BodyId

impl Copy for BodyPart

impl Copy for Error

impl Copy for Junction

impl Copy for Junctions

impl Copy for NetworkId

impl Copy for OriginKind

impl Copy for Junction

impl Copy for NetworkId

impl Copy for Error

impl Copy for Junction

impl Copy for NetworkId

impl Copy for Ancestor

impl Copy for Parent

impl Copy for Ancestor

impl Copy for Parent

impl Copy for Ancestor

impl Copy for Parent

impl Copy for Error

impl Copy for FeesMode

impl Copy for Error

impl Copy for Runtime

impl Copy for ProxyType

impl Copy for Runtime

impl Copy for Runtime

impl Copy for Runtime

impl Copy for Runtime

impl Copy for Runtime

impl Copy for Error

impl Copy for Error

impl Copy for Error

impl Copy for Error

impl Copy for Error

impl Copy for Runtime