konst

Macro const_eq

Source
macro_rules! const_eq {
    ($left:expr, $right:expr $(,)*) => { ... };
}
Expand description

Compares two values for equality.

The arguments must implement the ConstCmp trait. Non-standard library types must define a const_eq method taking a reference.

§Limitations

The arguments must be concrete types, and have a fully inferred type. eg: if you pass an integer literal it must have a suffix to indicate its type.

§Example

use konst::{const_eq, impl_cmp};

use std::ops::Range;

struct Fields<'a> {
    foo: u32,
    bar: Option<bool>,
    baz: Range<usize>,
    qux: &'a str,
}

impl_cmp!{
    impl['a] Fields<'a>;
    pub const fn const_eq(&self, other: &Self) -> bool {
        self.foo == other.foo &&
        const_eq!(self.bar, other.bar) &&
        const_eq!(self.baz, other.baz) &&
        const_eq!(self.qux, other.qux)
    }
}

const _: () = {
    let foo = Fields {
        foo: 10,
        bar: None,
        baz: 10..20,
        qux: "hello",
    };
     
    let bar = Fields {
        foo: 99,
        bar: Some(true),
        baz: 0..5,
        qux: "world",
    };
     
    assert!( const_eq!(foo, foo));
    assert!(!const_eq!(foo, bar));
    assert!(!const_eq!(bar, foo));
    assert!( const_eq!(bar, bar));
};