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

impl StructuralEq for Entry

Implementors

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

impl StructuralEq for Utc

impl StructuralEq for Pad

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

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

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, 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<'a> StructuralEq for Metadata<'a>

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

impl<T> StructuralEq for MemCounter<T>

impl<T> StructuralEq for NoopTracker<T>

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<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<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<Balance, BlockNumber> StructuralEq for EscrowedAmount<Balance, BlockNumber>

impl<Balance> StructuralEq for InclusionFee<Balance>

impl<Balance> StructuralEq for FeeDetails<Balance>

impl<Balance> StructuralEq for RuntimeDispatchInfo<Balance>

impl<T> StructuralEq for Compact<T>

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

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

impl StructuralEq for Ast

impl StructuralEq for Hir

impl<K> StructuralEq for ExtendedKey<K>

impl<N> StructuralEq for AutoSimd<N>

impl<N> StructuralEq for AutoBoolSimd<N>

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

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

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

impl<Block> StructuralEq for SignedBlock<Block>

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

impl<'a> StructuralEq for DigestItemRef<'a>

impl StructuralEq for Era

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

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

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

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

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

impl<Xt> StructuralEq for Block<Xt>

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

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

impl StructuralEq for L

impl StructuralEq for E

impl StructuralEq for I

impl StructuralEq for X

impl StructuralEq for P

impl StructuralEq for B

impl<Hash> StructuralEq for TxKeysT<Hash>

impl<AccountId> StructuralEq for OrderHeader<AccountId>

impl<Hash> StructuralEq for OrderItem<Hash>

impl<Hash> StructuralEq for TxKeysL<Hash>

impl<Hash> StructuralEq for TxKeysM<Hash>

impl<Hash> StructuralEq for TxKeysS<Hash>

impl<AccountId, ProjectStatus> StructuralEq for DeletedProject<AccountId, ProjectStatus>

impl<AccountId, ReferenceHash, NumberOfBlocks, LockStatus, StatusOfTimeRecord, ReasonCodeStruct, PostingPeriod, StartOrEndBlockNumber, NumberOfBreaks> StructuralEq for Timekeeper<AccountId, ReferenceHash, NumberOfBlocks, LockStatus, StatusOfTimeRecord, ReasonCodeStruct, PostingPeriod, StartOrEndBlockNumber, NumberOfBreaks>

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<Z: Zeroize> StructuralEq for Zeroizing<Z>