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 Dictionary

source§

impl StructuralEq for BuiltinName

source§

impl StructuralEq for OffsetValue

source§

impl StructuralEq for ReferenceParseError

source§

impl StructuralEq for ApUpdate

source§

impl StructuralEq for FpUpdate

source§

impl StructuralEq for Op1Addr

source§

impl StructuralEq for Opcode

source§

impl StructuralEq for PcUpdate

source§

impl StructuralEq for Register

source§

impl StructuralEq for Res

source§

impl StructuralEq for MaybeRelocatable

source§

impl StructuralEq for ExecScopeError

source§

impl StructuralEq for InsufficientAllocatedCellsError

source§

impl StructuralEq for CairoArg

1.0.0 · source§

impl StructuralEq for cairo_vm::with_std::cmp::Ordering

1.28.0 · source§

impl StructuralEq for cairo_vm::with_std::fmt::Alignment

1.0.0 · source§

impl StructuralEq for FpCategory

1.55.0 · source§

impl StructuralEq for IntErrorKind

source§

impl StructuralEq for SearchStep

1.0.0 · source§

impl StructuralEq for cairo_vm::with_std::sync::atomic::Ordering

1.12.0 · source§

impl StructuralEq for RecvTimeoutError

1.0.0 · source§

impl StructuralEq for TryRecvError

source§

impl StructuralEq for TryReserveErrorKind

source§

impl StructuralEq for Which

1.7.0 · source§

impl StructuralEq for IpAddr

source§

impl StructuralEq for Ipv6MulticastScope

1.0.0 · source§

impl StructuralEq for SocketAddr

1.65.0 · source§

impl StructuralEq for BacktraceStatus

1.0.0 · source§

impl StructuralEq for VarError

1.0.0 · source§

impl StructuralEq for SeekFrom

1.0.0 · source§

impl StructuralEq for std::io::error::ErrorKind

1.0.0 · source§

impl StructuralEq for Shutdown

source§

impl StructuralEq for BacktraceStyle

source§

impl StructuralEq for AllowedEnumVariants

source§

impl StructuralEq for IntegerType

source§

impl StructuralEq for nom::error::ErrorKind

source§

impl StructuralEq for Needed

source§

impl StructuralEq for Endianness

source§

impl StructuralEq for Sign

source§

impl StructuralEq for Category

source§

impl StructuralEq for Value

source§

impl StructuralEq for BernoulliError

source§

impl StructuralEq for DictManager

source§

impl StructuralEq for DictTracker

source§

impl StructuralEq for HintReference

source§

impl StructuralEq for ApTracking

source§

impl StructuralEq for Attribute

source§

impl StructuralEq for DebugInfo

source§

impl StructuralEq for FlowTrackingData

source§

impl StructuralEq for HintLocation

source§

impl StructuralEq for HintParams

source§

impl StructuralEq for Identifier

source§

impl StructuralEq for InputFile

source§

impl StructuralEq for InstructionLocation

source§

impl StructuralEq for cairo_vm::serde::deserialize_program::Location

source§

impl StructuralEq for Member

source§

impl StructuralEq for Reference

source§

impl StructuralEq for ReferenceManager

source§

impl StructuralEq for ValueAddress

source§

impl StructuralEq for Instruction

source§

impl StructuralEq for Program

source§

impl StructuralEq for Relocatable

source§

impl StructuralEq for ExecutionResources

source§

impl StructuralEq for SegmentInfo

source§

impl StructuralEq for TraceEntry

source§

impl StructuralEq for Operands

source§

impl StructuralEq for OperandsAddresses

source§

impl StructuralEq for AllocError

1.28.0 · source§

impl StructuralEq for Layout

1.50.0 · source§

impl StructuralEq for LayoutError

1.0.0 · source§

impl StructuralEq for TypeId

1.0.0 · source§

impl StructuralEq for cairo_vm::with_std::fmt::Error

source§

impl StructuralEq for Assume

1.34.0 · source§

impl StructuralEq for NonZeroI8

1.34.0 · source§

impl StructuralEq for NonZeroI16

1.34.0 · source§

impl StructuralEq for NonZeroI32

1.34.0 · source§

impl StructuralEq for NonZeroI64

1.34.0 · source§

impl StructuralEq for NonZeroI128

1.34.0 · source§

impl StructuralEq for NonZeroIsize

1.28.0 · source§

impl StructuralEq for NonZeroU8

1.28.0 · source§

impl StructuralEq for NonZeroU16

1.28.0 · source§

impl StructuralEq for NonZeroU32

1.28.0 · source§

impl StructuralEq for NonZeroU64

1.28.0 · source§

impl StructuralEq for NonZeroU128

1.28.0 · source§

impl StructuralEq for NonZeroUsize

1.0.0 · source§

impl StructuralEq for ParseFloatError

1.0.0 · source§

impl StructuralEq for ParseIntError

1.34.0 · source§

impl StructuralEq for TryFromIntError

1.0.0 · source§

impl StructuralEq for RangeFull

source§

impl StructuralEq for cairo_vm::with_std::ptr::Alignment

1.0.0 · source§

impl StructuralEq for ParseBoolError

1.0.0 · source§

impl StructuralEq for Utf8Error

1.0.0 · source§

impl StructuralEq for FromUtf8Error

1.0.0 · source§

impl StructuralEq for String

1.0.0 · source§

impl StructuralEq for RecvError

1.5.0 · source§

impl StructuralEq for WaitTimeoutResult

1.3.0 · source§

impl StructuralEq for Duration

1.66.0 · source§

impl StructuralEq for TryFromFloatSecsError

1.57.0 · source§

impl StructuralEq for TryReserveError

1.64.0 · source§

impl StructuralEq for CString

1.64.0 · source§

impl StructuralEq for FromVecWithNulError

1.64.0 · source§

impl StructuralEq for IntoStringError

1.64.0 · source§

impl StructuralEq for NulError

1.34.0 · source§

impl StructuralEq for CharTryFromError

1.20.0 · source§

impl StructuralEq for ParseCharError

1.9.0 · source§

impl StructuralEq for DecodeUtf16Error

1.59.0 · source§

impl StructuralEq for TryFromCharError

1.27.0 · source§

impl StructuralEq for CpuidResult

1.69.0 · source§

impl StructuralEq for FromBytesUntilNulError

1.64.0 · source§

impl StructuralEq for FromBytesWithNulError

1.0.0 · source§

impl StructuralEq for Ipv4Addr

1.0.0 · source§

impl StructuralEq for Ipv6Addr

1.0.0 · source§

impl StructuralEq for AddrParseError

1.0.0 · source§

impl StructuralEq for SocketAddrV4

1.0.0 · source§

impl StructuralEq for SocketAddrV6

1.1.0 · source§

impl StructuralEq for FileType

1.0.0 · source§

impl StructuralEq for Permissions

source§

impl StructuralEq for UCred

1.7.0 · source§

impl StructuralEq for StripPrefixError

1.0.0 · source§

impl StructuralEq for ExitStatus

source§

impl StructuralEq for ExitStatusError

1.0.0 · source§

impl StructuralEq for Output

1.26.0 · source§

impl StructuralEq for AccessError

1.19.0 · source§

impl StructuralEq for ThreadId

1.8.0 · source§

impl StructuralEq for Instant

1.8.0 · source§

impl StructuralEq for SystemTime

source§

impl StructuralEq for Lsb0

source§

impl StructuralEq for Msb0

source§

impl StructuralEq for Felt252

source§

impl StructuralEq for ParseFeltError

source§

impl StructuralEq for ParseBigIntError

source§

impl StructuralEq for Number

source§

impl StructuralEq for ATerm

source§

impl StructuralEq for B0

source§

impl StructuralEq for B1

source§

impl StructuralEq for Z0

source§

impl StructuralEq for Equal

source§

impl StructuralEq for Greater

source§

impl StructuralEq for Less

source§

impl StructuralEq for UTerm

source§

impl StructuralEq for StepRng

source§

impl StructuralEq for StdRng

source§

impl StructuralEq for ChaCha8Core

source§

impl StructuralEq for ChaCha12Core

source§

impl StructuralEq for ChaCha20Core

1.33.0 · source§

impl StructuralEq for PhantomPinned

§

impl StructuralEq for AffinePoint

§

impl StructuralEq for BigInteger64

§

impl StructuralEq for BigInteger128

§

impl StructuralEq for BigInteger256

§

impl StructuralEq for BigInteger320

§

impl StructuralEq for BigInteger384

§

impl StructuralEq for BigInteger448

§

impl StructuralEq for BigInteger768

§

impl StructuralEq for BigInteger832

§

impl StructuralEq for Const

§

impl StructuralEq for EdwardsFlags

§

impl StructuralEq for EmptyFlags

§

impl StructuralEq for Error

§

impl StructuralEq for ErrorKind

§

impl StructuralEq for FieldElement

§

impl StructuralEq for InvalidBufferSize

§

impl StructuralEq for InvalidLength

§

impl StructuralEq for MacError

§

impl StructuralEq for Mut

§

impl StructuralEq for NullPtrError

§

impl StructuralEq for ProjectivePoint

§

impl StructuralEq for SWFlags

1.0.0 · source§

impl<'a> StructuralEq for Component<'a>

1.0.0 · source§

impl<'a> StructuralEq for Prefix<'a>

source§

impl<'a> StructuralEq for Utf8Chunk<'a>

1.10.0 · source§

impl<'a> StructuralEq for core::panic::location::Location<'a>

1.0.0 · source§

impl<'a> StructuralEq for PrefixComponent<'a>

source§

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

source§

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

source§

impl<A> StructuralEq for ExtendedGcd<A>

1.55.0 · source§

impl<B, C> StructuralEq for ControlFlow<B, C>

1.0.0 · source§

impl<Idx> StructuralEq for Range<Idx>

1.0.0 · source§

impl<Idx> StructuralEq for RangeFrom<Idx>

1.26.0 · source§

impl<Idx> StructuralEq for RangeInclusive<Idx>

1.0.0 · source§

impl<Idx> StructuralEq for RangeTo<Idx>

1.26.0 · source§

impl<Idx> StructuralEq for RangeToInclusive<Idx>

§

impl<Inner> StructuralEq for Frozen<Inner>where Inner: Mutability,

source§

impl<R> StructuralEq for BitEnd<R>where R: BitRegister,

source§

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

source§

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

source§

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

source§

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

source§

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

1.17.0 · source§

impl<T> StructuralEq for Bound<T>

1.0.0 · source§

impl<T> StructuralEq for TrySendError<T>

1.0.0 · source§

impl<T> StructuralEq for Option<T>

1.36.0 · source§

impl<T> StructuralEq for Poll<T>

source§

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

source§

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

1.19.0 · source§

impl<T> StructuralEq for Reverse<T>

1.20.0 · source§

impl<T> StructuralEq for ManuallyDrop<T>where T: ?Sized,

source§

impl<T> StructuralEq for Saturating<T>

1.0.0 · source§

impl<T> StructuralEq for cairo_vm::with_std::num::Wrapping<T>

1.0.0 · source§

impl<T> StructuralEq for SendError<T>

1.0.0 · source§

impl<T> StructuralEq for Cursor<T>

source§

impl<T> StructuralEq for MisalignError<T>

source§

impl<T> StructuralEq for TryFromBigIntError<T>

source§

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

§

impl<T> StructuralEq for NonZero<T>where T: Zero,

§

impl<T> StructuralEq for Wrapping<T>

1.0.0 · source§

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

source§

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

source§

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

source§

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

source§

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

source§

impl<Y, R> StructuralEq for GeneratorState<Y, R>

§

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