pub trait StructuralEq { }
🔬This is a nightly-only experimental API. (structural_match)
Expand description

Required trait for constants used in pattern matches.

Any type that derives Eq automatically implements this trait, regardless of whether its type parameters implement Eq.

This is a hack to work around a limitation in our type system.

Background

We want to require that types of consts used in pattern matches have the attribute #[derive(PartialEq, Eq)].

In a more ideal world, we could check that requirement by just checking that the given type implements both the StructuralPartialEq trait and the Eq trait. However, you can have ADTs that do derive(PartialEq, Eq), and be a case that we want the compiler to accept, and yet the constant’s type fails to implement Eq.

Namely, a case like this:

#[derive(PartialEq, Eq)]
struct Wrap<X>(X);

fn higher_order(_: &()) { }

const CFN: Wrap<fn(&())> = Wrap(higher_order);

fn main() {
    match CFN {
        CFN => {}
        _ => {}
    }
}

(The problem in the above code is that Wrap<fn(&())> does not implement PartialEq, nor Eq, because for<'a> fn(&'a _) does not implement those traits.)

Therefore, we cannot rely on naive check for StructuralPartialEq and mere Eq.

As a hack to work around this, we use two separate traits injected by each of the two derives (#[derive(PartialEq)] and #[derive(Eq)]) and check that both of them are present as part of structural-match checking.

Implementors§

source§

impl StructuralEq for __c_anonymous_ptrace_syscall_info_entry

source§

impl StructuralEq for input_keymap_entry

impl<T> StructuralEq for SendError<T>

impl<T> StructuralEq for TrySendError<T>

impl<'a> StructuralEq for Components<'a>

impl<T> StructuralEq for Round<T>

impl<T> StructuralEq for MerkleProof<T>

impl<'a> StructuralEq for Leaf<'a>

impl<TBlockNumber> StructuralEq for Commitment<TBlockNumber>

impl<TBlockNumber, TSignature> StructuralEq for SignedCommitment<TBlockNumber, TSignature>

impl<BlockNumber, Hash, MerkleRoot, ExtraData> StructuralEq for MmrLeaf<BlockNumber, Hash, MerkleRoot, ExtraData>

impl<MerkleRoot> StructuralEq for BeefyAuthoritySet<MerkleRoot>

impl<TBlockNumber, TMerkleRoot> StructuralEq for SignedCommitmentWitness<TBlockNumber, TMerkleRoot>

impl<L, R> StructuralEq for Overwritten<L, R>

impl<T, const L: usize, const U: usize> StructuralEq for BoundedVec<T, L, U>

impl<'a> StructuralEq for Token<'a>

impl StructuralEq for Os

impl StructuralEq for Env

impl<const S: usize> StructuralEq for Cid<S>

impl<'help> StructuralEq for ArgGroup<'help>

impl<'help> StructuralEq for App<'help>

impl<'help> StructuralEq for PossibleValue<'help>

impl<'s> StructuralEq for ParsedArg<'s>

impl<T> StructuralEq for PushError<T>

impl<T> StructuralEq for Cursor<T>

impl<T, N> StructuralEq for BitFlags<T, N>

impl StructuralEq for Rng

impl<H, N, S, Id> StructuralEq for CommunicationOut<H, N, S, Id>

impl<Id: Eq + Hash> StructuralEq for RoundState<Id>

impl<Id: Eq + Hash> StructuralEq for VoterState<Id>

impl<Id: Eq + Ord> StructuralEq for VoterSet<Id>

impl<H, N> StructuralEq for Prevote<H, N>

impl<H, N> StructuralEq for Precommit<H, N>

impl<H, N> StructuralEq for PrimaryPropose<H, N>

impl<H, N> StructuralEq for Message<H, N>

impl<H, N, S, Id> StructuralEq for SignedMessage<H, N, S, Id>

impl<H, N, S, Id> StructuralEq for Commit<H, N, S, Id>

impl<H, N, S, Id> StructuralEq for SignedPrevote<H, N, S, Id>

impl<H, N, S, Id> StructuralEq for SignedPrecommit<H, N, S, Id>

impl<H, N, S, Id> StructuralEq for CompactCommit<H, N, S, Id>

impl<H, N, S, Id> StructuralEq for CatchUp<H, N, S, Id>

impl<H, N, S, Id> StructuralEq for HistoricalVotes<H, N, S, Id>

impl<F> StructuralEq for Unwrapped<F>

impl<F> StructuralEq for Wrapping<F>

impl<VoterIndex, TargetIndex, P: PerThing> StructuralEq for IndexAssignment<VoterIndex, TargetIndex, P>

impl<T: Config> StructuralEq for CheckNonce<T>

impl<T: Config + Send + Sync> StructuralEq for CheckWeight<T>

impl<E: Parameter + Member, T> StructuralEq for EventRecord<E, T>

impl<Index, AccountData> StructuralEq for AccountInfo<Index, AccountData>

impl<T> StructuralEq for AssertAsync<T>

impl<T> StructuralEq for Status<T>

impl<'headers, 'buf> StructuralEq for Request<'headers, 'buf>

impl<'headers, 'buf> StructuralEq for Response<'headers, 'buf>

impl<'a> StructuralEq for Header<'a>

impl<Balance> StructuralEq for BalanceUpdate<Balance>

impl<Balance> StructuralEq for AssetStateChange<Balance>where
    Balance: Default,

impl<Balance> StructuralEq for TradeStateChange<Balance>where
    Balance: Default,

impl<Balance> StructuralEq for Position<Balance>

impl<AssetId> StructuralEq for PoolType<AssetId>

impl<Balance, BlockNumber, Price> StructuralEq for AggregatedEntry<Balance, BlockNumber, Price>

impl<Balance> StructuralEq for Volume<Balance>

impl<Balance> StructuralEq for Liquidity<Balance>

impl<AccountId, AssetId, AssetPair, Balance> StructuralEq for AMMTransfer<AccountId, AssetId, AssetPair, Balance>

impl StructuralEq for Map

impl StructuralEq for Set

impl<T> StructuralEq for AllowCors<T>

impl<'a> StructuralEq for SubscriptionId<'a>

impl<'a> StructuralEq for Id<'a>

impl<H: Hasher> StructuralEq for Topic<H>

impl<TKey, TVal> StructuralEq for Node<TKey, TVal>

impl<TKey> StructuralEq for InsertResult<TKey>

impl<TKey, TVal> StructuralEq for AppliedPending<TKey, TVal>

impl StructuralEq for Key

impl<TUpgrade, TInfo> StructuralEq for SubstreamProtocol<TUpgrade, TInfo>

impl<TConnectionUpgrade, TOutboundOpenInfo, TCustom, TErr> StructuralEq for ConnectionHandlerEvent<TConnectionUpgrade, TOutboundOpenInfo, TCustom, TErr>

impl<Storage> StructuralEq for __BindgenBitfieldUnit<Storage>

impl<'a> StructuralEq for Protocol<'a>

impl<const S: usize> StructuralEq for Multihash<S>

impl<T: Scalar> StructuralEq for X<T>

impl<T: Scalar> StructuralEq for XY<T>

impl<T: Scalar> StructuralEq for XYZ<T>

impl<T: Scalar> StructuralEq for XYZW<T>

impl<T: Scalar> StructuralEq for XYZWA<T>

impl<T: Scalar> StructuralEq for XYZWAB<T>

impl<T: Scalar> StructuralEq for IJKW<T>

impl<T: Scalar> StructuralEq for M2x2<T>

impl<T: Scalar> StructuralEq for M2x3<T>

impl<T: Scalar> StructuralEq for M2x4<T>

impl<T: Scalar> StructuralEq for M2x5<T>

impl<T: Scalar> StructuralEq for M2x6<T>

impl<T: Scalar> StructuralEq for M3x2<T>

impl<T: Scalar> StructuralEq for M3x3<T>

impl<T: Scalar> StructuralEq for M3x4<T>

impl<T: Scalar> StructuralEq for M3x5<T>

impl<T: Scalar> StructuralEq for M3x6<T>

impl<T: Scalar> StructuralEq for M4x2<T>

impl<T: Scalar> StructuralEq for M4x3<T>

impl<T: Scalar> StructuralEq for M4x4<T>

impl<T: Scalar> StructuralEq for M4x5<T>

impl<T: Scalar> StructuralEq for M4x6<T>

impl<T: Scalar> StructuralEq for M5x2<T>

impl<T: Scalar> StructuralEq for M5x3<T>

impl<T: Scalar> StructuralEq for M5x4<T>

impl<T: Scalar> StructuralEq for M5x5<T>

impl<T: Scalar> StructuralEq for M5x6<T>

impl<T: Scalar> StructuralEq for M6x2<T>

impl<T: Scalar> StructuralEq for M6x3<T>

impl<T: Scalar> StructuralEq for M6x4<T>

impl<T: Scalar> StructuralEq for M6x5<T>

impl<T: Scalar> StructuralEq for M6x6<T>

impl<const R: usize> StructuralEq for Const<R>

impl<T, const R: usize, const C: usize> StructuralEq for ArrayStorage<T, R, C>

impl<T, R: Dim, C: Dim> StructuralEq for VecStorage<T, R, C>

impl<T> StructuralEq for ErrorBuffer<T>

impl StructuralEq for Nla

impl<T> StructuralEq for MapBuffer<T>

impl StructuralEq for Map

impl<T> StructuralEq for StatsBuffer<T>

impl StructuralEq for Nla

impl StructuralEq for Nla

impl<T> StructuralEq for ConfigBuffer<T>

impl<T> StructuralEq for StatsBuffer<T>

impl StructuralEq for Nla

impl StructuralEq for Nla

impl StructuralEq for Nla

impl StructuralEq for Nla

impl<T> StructuralEq for StatsBuffer<T>

impl StructuralEq for Nla

impl StructuralEq for Sel

impl<T> StructuralEq for SelBuffer<T>

impl StructuralEq for Key

impl<T> StructuralEq for KeyBuffer<T>

impl StructuralEq for Nla

impl<T> StructuralEq for TcGenBuffer<T>

impl StructuralEq for Nla

impl<T: AsRef<[u8]>> StructuralEq for NlaBuffer<T>

impl<T> StructuralEq for NlasIterator<T>

impl<'a> StructuralEq for FcntlArg<'a>

impl<T> StructuralEq for IoVec<T>

impl StructuralEq for Id

impl StructuralEq for Pid

impl<T> StructuralEq for Complex<T>

impl<Balance> StructuralEq for BalanceLock<Balance>

impl<ReserveIdentifier, Balance> StructuralEq for ReserveData<ReserveIdentifier, Balance>

impl<Balance> StructuralEq for AccountData<Balance>

impl<Balance, CustomMetadata: Parameter + Member + TypeInfo> StructuralEq for AssetMetadata<Balance, CustomMetadata>

impl<AccountId, Balance, BlockNumber> StructuralEq for AuctionInfo<AccountId, Balance, BlockNumber>

impl<Value> StructuralEq for Change<Value>

impl<Value: Ord + PartialOrd, Moment> StructuralEq for TimestampedValue<Value, Moment>

impl<T: Ord + Encode + Decode + MaxEncodedLen + Clone + Eq + PartialEq, S: Get<u32>> StructuralEq for OrderedSet<T, S>

impl<BlockNumber, Balance: MaxEncodedLen + HasCompact> StructuralEq for VestingSchedule<BlockNumber, Balance>

impl<AssetId> StructuralEq for AssetType<AssetId>

impl<Balance> StructuralEq for BalanceLock<Balance>

impl<ReserveIdentifier, Balance> StructuralEq for ReserveData<ReserveIdentifier, Balance>

impl<Balance> StructuralEq for AccountData<Balance>

impl<T: Config<I>, I: 'static> StructuralEq for PositiveImbalance<T, I>

impl<T: Config<I>, I: 'static> StructuralEq for NegativeImbalance<T, I>

impl<AccountId, Balance, BlockNumber> StructuralEq for Bounty<AccountId, Balance, BlockNumber>

impl<AccountId, BlockNumber> StructuralEq for BountyStatus<AccountId, BlockNumber>

impl<AccountId, Balance, BlockNumber> StructuralEq for ChildBounty<AccountId, Balance, BlockNumber>

impl<AccountId, BlockNumber> StructuralEq for ChildBountyStatus<AccountId, BlockNumber>

impl<AccountId, Balance> StructuralEq for CandidateInfo<AccountId, Balance>

impl<AccountId, I> StructuralEq for RawOrigin<AccountId, I>

impl<AccountId, BlockNumber> StructuralEq for Votes<AccountId, BlockNumber>

impl<Balance> StructuralEq for Tally<Balance>

impl<Balance> StructuralEq for Delegations<Balance>

impl<BlockNumber, Hash, Balance> StructuralEq for ReferendumStatus<BlockNumber, Hash, Balance>

impl<BlockNumber, Hash, Balance> StructuralEq for ReferendumInfo<BlockNumber, Hash, Balance>

impl<Balance> StructuralEq for AccountVote<Balance>

impl<Balance, AccountId, BlockNumber> StructuralEq for Voting<Balance, AccountId, BlockNumber>

impl<AccountId, Balance: HasCompact, Solution> StructuralEq for SignedSubmission<AccountId, Balance, Solution>

impl<Bn> StructuralEq for Phase<Bn>

impl<S> StructuralEq for RawSolution<S>

impl<BlockNumber> StructuralEq for OracleEntry<BlockNumber>

impl<Balance, AccountId> StructuralEq for GiltBid<Balance, AccountId>

impl<Balance, AccountId, BlockNumber> StructuralEq for ActiveGilt<Balance, AccountId, BlockNumber>

impl<Balance> StructuralEq for ActiveGiltsTotal<Balance>

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

impl<FieldLimit: Get<u32>> StructuralEq for IdentityInfo<FieldLimit>

impl<Balance: Encode + Decode + MaxEncodedLen + Copy + Clone + Debug + Eq + PartialEq, MaxJudgements: Get<u32>, MaxAdditionalFields: Get<u32>> StructuralEq for Registration<Balance, MaxJudgements, MaxAdditionalFields>

impl<Balance: Encode + Decode + Clone + Debug + Eq + PartialEq, AccountId: Encode + Decode + Clone + Debug + Eq + PartialEq> StructuralEq for RegistrarInfo<Balance, AccountId>

impl<BlockNumber> StructuralEq for Heartbeat<BlockNumber>where
    BlockNumber: PartialEq + Eq + Decode + Encode,

impl<PeerIdEncodingLimit, MultiAddrEncodingLimit, AddressesLimit> StructuralEq for BoundedOpaqueNetworkState<PeerIdEncodingLimit, MultiAddrEncodingLimit, AddressesLimit>where
    PeerIdEncodingLimit: Get<u32>,
    MultiAddrEncodingLimit: Get<u32>,
    AddressesLimit: Get<u32>,

impl<Offender> StructuralEq for UnresponsivenessOffence<Offender>

impl<AccountId, BlockNumber: AtLeast32BitUnsigned + Copy> StructuralEq for Pool<AccountId, BlockNumber>

impl<T: Config<I>, I: 'static> StructuralEq for GlobalFarmData<T, I>

impl<T: Config<I>, I: 'static> StructuralEq for YieldFarmData<T, I>

impl<T: Config<I>, I: 'static> StructuralEq for DepositData<T, I>

impl<T: Config<I>, I: 'static> StructuralEq for YieldFarmEntry<T, I>

impl<AccountId, Balance, BlockNumber> StructuralEq for Offer<AccountId, Balance, BlockNumber>

impl<AccountId> StructuralEq for Royalty<AccountId>

impl<BlockHash> StructuralEq for LeafProof<BlockHash>

impl<BlockHash> StructuralEq for LeafBatchProof<BlockHash>

impl<BlockNumber> StructuralEq for Timepoint<BlockNumber>

impl<BlockNumber, Balance, AccountId> StructuralEq for Multisig<BlockNumber, Balance, AccountId>

impl<CollectionType, BoundedVec> StructuralEq for CollectionInfo<CollectionType, BoundedVec>

impl<BoundedVec> StructuralEq for ItemInfo<BoundedVec>

impl<Balance> StructuralEq for BondExtra<Balance>

impl<T: Config> StructuralEq for UnbondPool<T>

impl<AccountId, Balance> StructuralEq for RequestStatus<AccountId, Balance>

impl<AccountId, ProxyType, BlockNumber> StructuralEq for ProxyDefinition<AccountId, ProxyType, BlockNumber>

impl<AccountId, Hash, BlockNumber> StructuralEq for Announcement<AccountId, Hash, BlockNumber>

impl<BlockNumber, Balance, Friends> StructuralEq for ActiveRecovery<BlockNumber, Balance, Friends>

impl<BlockNumber, Balance, Friends> StructuralEq for RecoveryConfig<BlockNumber, Balance, Friends>

impl<AssetId> StructuralEq for Trade<AssetId>

impl<Call, BlockNumber, PalletsOrigin, AccountId> StructuralEq for ScheduledV3<Call, BlockNumber, PalletsOrigin, AccountId>

impl<Balance, BlockNumber> StructuralEq for Payout<Balance, BlockNumber>

impl<AccountId, Balance> StructuralEq for Bid<AccountId, Balance>

impl<AccountId, Balance> StructuralEq for BidKind<AccountId, Balance>

impl<AccountId> StructuralEq for RewardDestination<AccountId>

impl<Balance: HasCompact> StructuralEq for UnlockChunk<Balance>

impl<AccountId, Balance: HasCompact> StructuralEq for IndividualExposure<AccountId, Balance>

impl<AccountId, Balance: HasCompact> StructuralEq for Exposure<AccountId, Balance>

impl<AccountId: Parameter, Balance: Parameter, BlockNumber: Parameter, Hash: Parameter> StructuralEq for OpenTip<AccountId, Balance, BlockNumber, Hash>

impl<Balance, AssetId, Price> StructuralEq for PaymentInfo<Balance, AssetId, Price>

impl<Balance> StructuralEq for InclusionFee<Balance>

impl<Balance> StructuralEq for FeeDetails<Balance>

impl<Balance> StructuralEq for RuntimeDispatchInfo<Balance>

impl<AccountId, Balance> StructuralEq for Proposal<AccountId, Balance>

impl<AccountId, DepositBalance> StructuralEq for CollectionDetails<AccountId, DepositBalance>

impl<AccountId, DepositBalance> StructuralEq for ItemDetails<AccountId, DepositBalance>

impl<DepositBalance, StringLimit: Get<u32>> StructuralEq for CollectionMetadata<DepositBalance, StringLimit>

impl<DepositBalance, StringLimit: Get<u32>> StructuralEq for ItemMetadata<DepositBalance, StringLimit>

impl<Balance, BlockNumber> StructuralEq for VestingInfo<Balance, BlockNumber>

impl<BlockNumber> StructuralEq for QueryStatus<BlockNumber>

impl<Key, Value> StructuralEq for Operation<Key, Value>

impl<R> StructuralEq for Error<R>

impl<R> StructuralEq for ErrorVariant<R>

impl<'i, R> StructuralEq for Token<'i, R>

impl<'i> StructuralEq for ParserRule<'i>

impl<'i> StructuralEq for ParserNode<'i>

impl<'i> StructuralEq for ParserExpr<'i>

impl<N, E> StructuralEq for Element<N, E>

impl<Ix> StructuralEq for EdgeIndex<Ix>where
    Ix: IndexType,

impl<'a, E, Ix: IndexType> StructuralEq for EdgeReference<'a, E, Ix>

impl<Ix> StructuralEq for NodeIndex<Ix>

impl<Ix> StructuralEq for EdgeIndex<Ix>

impl<V1> StructuralEq for Versioned<V1>

impl StructuralEq for PoV

impl StructuralEq for Id

impl<Payload, RealPayload> StructuralEq for Signed<Payload, RealPayload>

impl<Payload, RealPayload> StructuralEq for UncheckedSigned<Payload, RealPayload>

impl<H, N> StructuralEq for FullCandidateReceipt<H, N>

impl<AccountId, LeasePeriod> StructuralEq for ParachainTemporarySlot<AccountId, LeasePeriod>

impl<T: Config + Send + Sync> StructuralEq for PrevalidateAttests<T>where
    <T as Config>::Call: IsSubType<Call<T>>,

impl<BlockNumber> StructuralEq for LastContribution<BlockNumber>

impl<AccountId, Balance, BlockNumber, LeasePeriod> StructuralEq for FundInfo<AccountId, Balance, BlockNumber, LeasePeriod>

impl<Account, Balance> StructuralEq for ParaInfo<Account, Balance>

impl<Balance> StructuralEq for AccountStatus<Balance>

impl<Candidate, Digest> StructuralEq for Statement<Candidate, Digest>

impl<Candidate, Digest, AuthorityId, Signature> StructuralEq for SignedStatement<Candidate, Digest, AuthorityId, Signature>

impl<Candidate, Digest, Signature> StructuralEq for ValidityDoubleVote<Candidate, Digest, Signature>

impl<Candidate, Digest, Signature> StructuralEq for DoubleSign<Candidate, Digest, Signature>

impl<Candidate, Signature> StructuralEq for MultipleCandidates<Candidate, Signature>

impl<Candidate, Digest, AuthorityId, Signature> StructuralEq for UnauthorizedStatement<Candidate, Digest, AuthorityId, Signature>

impl<Candidate, Digest, AuthorityId, Signature> StructuralEq for Misbehavior<Candidate, Digest, AuthorityId, Signature>

impl<Digest, Group> StructuralEq for Summary<Digest, Group>

impl<AccountId, Balance, IntentionID> StructuralEq for ExchangeIntention<AccountId, Balance, IntentionID>

impl<A> StructuralEq for Action<A>

impl<H, N> StructuralEq for LeafSet<H, N>

impl<Block: BlockT> StructuralEq for BlockCheckParams<Block>

impl<E: Epoch> StructuralEq for EpochHeader<E>

impl<Hash, Number> StructuralEq for EpochIdentifier<Hash, Number>

impl<Hash, Number, E: Epoch> StructuralEq for ViableEpochDescriptor<Hash, Number, E>

impl<Block: BlockT> StructuralEq for GrandpaJustification<Block>

impl<Header, Hash, Extrinsic> StructuralEq for BlockData<Header, Hash, Extrinsic>

impl<Hash, Number> StructuralEq for BlockRequest<Hash, Number>

impl<Hash, Number> StructuralEq for FromBlock<Hash, Number>

impl<Header, Hash, Extrinsic> StructuralEq for BlockResponse<Header, Hash, Extrinsic>

impl<Block: BlockT> StructuralEq for WarpSyncPhase<Block>

impl<Block: BlockT> StructuralEq for WarpSyncProgress<Block>

impl<Block: BlockT> StructuralEq for OnBlockData<Block>

impl<Block: BlockT> StructuralEq for OnBlockJustification<Block>

impl<B: BlockT> StructuralEq for BlockData<B>

impl<E> StructuralEq for Error<E>

impl<Hash, Extrinsic> StructuralEq for Transaction<Hash, Extrinsic>

impl<N> StructuralEq for AutoSimd<N>

impl<N> StructuralEq for AutoBoolSimd<N>

impl<'a> StructuralEq for Incoming<'a>

impl<'a> StructuralEq for Param<'a>

impl<Block: BlockT> StructuralEq for Info<Block>

impl<Hash> StructuralEq for Proof<Hash>

impl<Hash> StructuralEq for BatchProof<Hash>

impl<AccountId, P: PerThing> StructuralEq for Assignment<AccountId, P>

impl<AccountId> StructuralEq for StakedAssignment<AccountId>

impl<AccountId> StructuralEq for Support<AccountId>

impl<D> StructuralEq for Data<D>

impl<'a> StructuralEq for BindingInfo<'a>

impl<'a> StructuralEq for VariantAst<'a>

impl<'a> StructuralEq for VariantInfo<'a>

impl<'a> StructuralEq for Structure<'a>

impl<'a, 'b> StructuralEq for Builder<'a, 'b>

impl<'a> StructuralEq for Word<'a>

impl<T> StructuralEq for TrySendError<T>

impl StructuralEq for CAA

impl StructuralEq for MX

impl StructuralEq for OPT

impl StructuralEq for SOA

impl StructuralEq for SRV

impl<T> StructuralEq for IpHint<T>

impl StructuralEq for TXT

impl<'a> StructuralEq for Input<'a>

impl<S> StructuralEq for Host<S>

impl<T> StructuralEq for Clamped<T>