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.

Implementations on Foreign Types

Implementors

impl<T, A, B> StructuralEq for AnagolayRecord<T, A, B>

impl<T> StructuralEq for SendError<T>

impl<T> StructuralEq for TrySendError<T>

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

impl<R> StructuralEq for BitIdx<R> where
    R: BitRegister

impl<R> StructuralEq for BitIdxError<R> where
    R: BitRegister

impl<R> StructuralEq for BitTail<R> where
    R: BitRegister

impl<R> StructuralEq for BitPos<R> where
    R: BitRegister

impl<R> StructuralEq for BitSel<R> where
    R: BitRegister

impl<R> StructuralEq for BitMask<R> where
    R: BitRegister

impl StructuralEq for Mut

impl<T> StructuralEq for AddressError<T> where
    T: BitStore

impl<T> StructuralEq for BitPtrError<T> where
    T: BitStore

impl<T> StructuralEq for BitSpanError<T> where
    T: BitStore

impl<'a, O, T> StructuralEq for IterOnes<'a, O, T> where
    O: BitOrder,
    T: BitStore

impl<'a, O, T> StructuralEq for IterZeros<'a, O, T> where
    O: BitOrder,
    T: BitStore

impl<T> StructuralEq for CachePadded<T>

impl<T> StructuralEq for LocalResult<T>

impl StructuralEq for Utc

impl StructuralEq for Pad

impl<'a> StructuralEq for Item<'a>

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

impl<T> StructuralEq for PushError<T>

impl<T> StructuralEq for Cursor<T>

impl<Reg> StructuralEq for UnwindCode<Reg>

impl<Reg> StructuralEq for UnwindInfo<Reg>

impl<'a> StructuralEq for MachTerminator<'a>

impl<K, V> StructuralEq for PrimaryMap<K, V> where
    K: EntityRef

impl<T> StructuralEq for SendError<T>

impl<T> StructuralEq for TrySendError<T>

impl<T> StructuralEq for Steal<T>

impl<T> StructuralEq for CachePadded<T>

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

impl<E> StructuralEq for Compat<E>

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

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<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<E> StructuralEq for FnEncode<E> where
    E: Encode + 'static, 

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<AccountId> StructuralEq for RawOrigin<AccountId>

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

impl<T> StructuralEq for TrySendError<T>

impl<T> StructuralEq for AssertAsync<T>

impl<T, E> StructuralEq for TryChunksError<T, E>

impl<T> StructuralEq for AllowStdIo<T>

impl<R: Reader> StructuralEq for DebugFrame<R>

impl<R: Reader> StructuralEq for EhFrameHdr<R>

impl<R: Reader> StructuralEq for EhFrame<R>

impl<'bases, Section, R> StructuralEq for CieOrFde<'bases, Section, R> where
    R: Reader,
    Section: UnwindSection<R>, 

impl<R, Offset> StructuralEq for CommonInformationEntry<R, Offset> where
    R: Reader<Offset = Offset>,
    Offset: ReaderOffset

impl<'bases, Section, R> StructuralEq for PartialFrameDescriptionEntry<'bases, Section, R> where
    R: Reader,
    Section: UnwindSection<R>, 

impl<R, Offset> StructuralEq for FrameDescriptionEntry<R, Offset> where
    R: Reader<Offset = Offset>,
    Offset: ReaderOffset

impl<R: Reader> StructuralEq for CfaRule<R>

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

impl<R, Offset> StructuralEq for ArangeHeader<R, Offset> where
    R: Reader<Offset = Offset>,
    Offset: ReaderOffset

impl<R, Offset> StructuralEq for LineInstruction<R, Offset> where
    R: Reader<Offset = Offset>,
    Offset: ReaderOffset

impl<R, Offset> StructuralEq for LineProgramHeader<R, Offset> where
    R: Reader<Offset = Offset>,
    Offset: ReaderOffset

impl<R, Offset> StructuralEq for IncompleteLineProgram<R, Offset> where
    R: Reader<Offset = Offset>,
    Offset: ReaderOffset

impl<R, Offset> StructuralEq for CompleteLineProgram<R, Offset> where
    R: Reader<Offset = Offset>,
    Offset: ReaderOffset

impl<R, Offset> StructuralEq for FileEntry<R, Offset> where
    R: Reader<Offset = Offset>,
    Offset: ReaderOffset

impl<T> StructuralEq for DieReference<T>

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

impl<R: Reader> StructuralEq for Expression<R>

impl<T> StructuralEq for UnitOffset<T>

impl<Offset> StructuralEq for UnitType<Offset> where
    Offset: ReaderOffset

impl<R, Offset> StructuralEq for UnitHeader<R, Offset> where
    R: Reader<Offset = Offset>,
    Offset: ReaderOffset

impl<R, Offset> StructuralEq for AttributeValue<R, Offset> where
    R: Reader<Offset = Offset>,
    Offset: ReaderOffset

impl<R: Reader> StructuralEq for Attribute<R>

impl<T> StructuralEq for Status<T>

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

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

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

impl<A, B> StructuralEq for EitherOrBoth<A, B>

impl<T> StructuralEq for FoldWhile<T>

impl StructuralEq for Map

impl StructuralEq for Set

impl StructuralEq for Id

impl<T> StructuralEq for AllowCors<T>

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

impl<TDialInfo> StructuralEq for SubstreamEndpoint<TDialInfo>

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 ProtocolsHandlerEvent<TConnectionUpgrade, TOutboundOpenInfo, TCustom, TErr>

impl<'a> StructuralEq for Metadata<'a>

impl<'a> StructuralEq for MetadataBuilder<'a>

impl<T> StructuralEq for MemCounter<T>

impl<T> StructuralEq for NoopTracker<T>

impl StructuralEq for Tag

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 Complex<T>

impl<A> StructuralEq for ExtendedGcd<A>

impl<Section> StructuralEq for SymbolFlags<Section>

impl<E: Endian> StructuralEq for U16Bytes<E>

impl<E: Endian> StructuralEq for U32Bytes<E>

impl<E: Endian> StructuralEq for U64Bytes<E>

impl<E: Endian> StructuralEq for I16Bytes<E>

impl<E: Endian> StructuralEq for I32Bytes<E>

impl<E: Endian> StructuralEq for I64Bytes<E>

impl<'data> StructuralEq for Bytes<'data>

impl<'data> StructuralEq for SymbolMapName<'data>

impl<'data> StructuralEq for ObjectMapEntry<'data>

impl<'data> StructuralEq for Import<'data>

impl<'data> StructuralEq for Export<'data>

impl<'data> StructuralEq for CodeView<'data>

impl<'data> StructuralEq for CompressedData<'data>

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

impl<Balance> StructuralEq for BalanceLock<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<T: Config> StructuralEq for Module<T>

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

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

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

impl<AccountId> StructuralEq for RawEvent<AccountId>

impl<Balance> StructuralEq for InclusionFee<Balance>

impl<Balance> StructuralEq for FeeDetails<Balance>

impl<Balance> StructuralEq for RuntimeDispatchInfo<Balance>

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

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

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

impl<T> StructuralEq for Compact<T>

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<A> StructuralEq for Action<A>

impl StructuralEq for Reg

impl<R: WritableBase> StructuralEq for Writable<R>

impl<'t> StructuralEq for Match<'t>

impl<'t> StructuralEq for Match<'t>

impl StructuralEq for Ast

impl StructuralEq for Hir

impl<Header: HeaderT> StructuralEq for RemoteCallRequest<Header>

impl<Header: HeaderT> StructuralEq for RemoteHeaderRequest<Header>

impl<Header: HeaderT> StructuralEq for RemoteReadRequest<Header>

impl<Header: HeaderT> StructuralEq for RemoteReadChildRequest<Header>

impl<Header: HeaderT> StructuralEq for RemoteChangesRequest<Header>

impl<Header: HeaderT> StructuralEq for ChangesProof<Header>

impl<Header: HeaderT> StructuralEq for RemoteBodyRequest<Header>

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

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<T> StructuralEq for SlotDuration<T>

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

impl<Hash, Ex> StructuralEq for Imported<Hash, Ex>

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

impl<K> StructuralEq for ExtendedKey<K>

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<Block: BlockT> StructuralEq for BlockCheckParams<Block>

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

impl<'a> StructuralEq for PiecewiseLinear<'a>

impl<Address, Call, Signature, Extra> StructuralEq for UncheckedExtrinsic<Address, Call, Signature, Extra> where
    Extra: SignedExtension

impl StructuralEq for Era

impl<AccountId, Call, Extra> StructuralEq for CheckedExtrinsic<AccountId, Call, Extra>

impl<Number: Copy + Into<U256> + TryFrom<U256>, Hash: HashT> StructuralEq for Header<Number, Hash>

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

impl<Header, Extrinsic: MaybeSerialize> StructuralEq for Block<Header, Extrinsic>

impl<Block> StructuralEq for SignedBlock<Block>

impl<Hash> StructuralEq for Digest<Hash>

impl<Hash> StructuralEq for DigestItem<Hash>

impl<'a, Hash: 'a> StructuralEq for DigestItemRef<'a, Hash>

impl<'a, T> StructuralEq for Request<'a, T>

impl<Xt> StructuralEq for Block<Xt>

impl<Call, Extra> StructuralEq for TestXt<Call, Extra>

impl<AccountId, AccountIndex> StructuralEq for MultiAddress<AccountId, AccountIndex>

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

impl<Reporter, Offender> StructuralEq for OffenceDetails<Reporter, Offender>

impl<Hash> StructuralEq for StorageChangeSet<Hash>

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 StructuralEq for Tm

impl<T> StructuralEq for AllowStdIo<T>

impl StructuralEq for Id

impl<A, B> StructuralEq for EitherWriter<A, B>

impl<M> StructuralEq for WithMaxLevel<M>

impl<M> StructuralEq for WithMinLevel<M>

impl<M, F> StructuralEq for WithFilter<M, F>

impl<A, B> StructuralEq for OrElse<A, B>

impl<A, B> StructuralEq for Tee<A, B>

impl<'a> StructuralEq for NodeHandle<'a>

impl<'a> StructuralEq for Node<'a>

impl<D: Borrow<[u8]>> StructuralEq for OwnedNode<D>

impl<HO, CE> StructuralEq for Error<HO, CE>

impl<HO> StructuralEq for Record<HO>

impl<T, E> StructuralEq for TrieError<T, E>

impl StructuralEq for B0

impl StructuralEq for B1

impl<U: Unsigned + NonZero> StructuralEq for PInt<U>

impl<U: Unsigned + NonZero> StructuralEq for NInt<U>

impl StructuralEq for Z0

impl<U, B> StructuralEq for UInt<U, B>

impl<V, A> StructuralEq for TArr<V, A>

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

impl<S> StructuralEq for Host<S>

impl<T> StructuralEq for Clamped<T>

impl<'a> StructuralEq for SectionCode<'a>

impl<'a> StructuralEq for ValType<'a>

impl<'a> StructuralEq for HeapType<'a>

impl<'a> StructuralEq for RefType<'a>

impl<'a> StructuralEq for StorageType<'a>

impl<'a> StructuralEq for GlobalType<'a>

impl<'a> StructuralEq for TableType<'a>

impl<Z: Zeroize> StructuralEq for Zeroizing<Z>