macro_rules! coerce_to_cmp {
    ($reference:expr $(,)*) => { ... };
    ($left:expr, $right:expr $(,)*) => { ... };
}
Available on crate feature cmp only.
Expand description

Coerces reference to a type that has a const_eq or const_cmp method.

Behavior

This requires arguments to implement the ConstCmpMarker trait.

When a type from the standard library is passed, this wraps it inside a CmpWrapper, which declares const_eq and const_cmp methods for many standard library types.

When a user-defined type is used, this evaluates to a reference to the passed in value, dereferencing it as necessary.

Limitations

The parameter(s) 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::{
    polymorphism::CmpWrapper,
    coerce_to_cmp, impl_cmp,
};

struct Unit;

impl_cmp!{
    impl Unit;
     
    pub const fn const_eq(&self, other: &Self) -> bool {
        true
    }
}

let wrapper: CmpWrapper<i32> = coerce_to_cmp!(0i32);
assert!( wrapper.const_eq(&0));
assert!(!wrapper.const_eq(&1));

let unit: &Unit = coerce_to_cmp!(Unit);
assert!( unit.const_eq(&Unit));