konst::cmp

Trait ConstCmp

Source
pub trait ConstCmp {
    type Kind;
}
Expand description

Marker trait for types that implement the const comparison methods.

§Implementors

Types that implement this trait are also expected to implement at least one of these inherent methods:

use std::cmp::Ordering;

const fn const_eq(&self, other: &Self) -> bool

const fn const_cmp(&self, other: &Self) -> Ordering

§Coercions

The Kind associated type is used in the IsAConstCmp marker type to automatically wrap types in CmpWrapper if they’re from the standard library, otherwise leaving them unwrapped.

§Example

§Manual Implementation

use konst::{
    cmp::{ConstCmp, IsNotStdKind},
    const_cmp, const_eq, try_equal,
};

use std::cmp::Ordering;


struct MyType {
    x: &'static str,
    y: &'static [u16],
}

impl ConstCmp for MyType {
    type Kind = IsNotStdKind;
}

impl MyType {
    pub const fn const_eq(&self, other: &Self) -> bool {
        const_eq!(self.x, other.x) &&
        const_eq!(self.y, other.y)
    }

    pub const fn const_cmp(&self, other: &Self) -> Ordering {
        try_equal!(const_cmp!(self.x, other.x));
        try_equal!(const_cmp!(self.y, other.y))
    }
}

const _: () = {
    let foo = MyType{x: "hello", y: &[3, 5, 8, 13]};
    let bar = MyType{x: "world", y: &[3, 5, 8, 13]};

    assert!(matches!(const_cmp!(foo, foo), Ordering::Equal));
    assert!(matches!(const_cmp!(foo, bar), Ordering::Less));
    assert!(matches!(const_cmp!(bar, foo), Ordering::Greater));
    assert!(const_eq!(foo, foo));
    assert!(!const_eq!(foo, bar));
};

§ìmpl_cmp-based Implementation

You can use impl_cmp to implement this trait, as well as define the same methods for multiple implementations with different type arguments.

use konst::{const_cmp, const_eq, impl_cmp, try_equal};

use std::cmp::Ordering;


struct MyType<'a, T> {
    x: &'a str,
    y: &'a [T],
}

impl_cmp!{
    // The comparison functions are only implemented for these types.
    impl['a] MyType<'a, bool>;
    impl['a] MyType<'a, u16>;
    impl['a] MyType<'a, &'static str>;

    pub const fn const_eq(&self, other: &Self) -> bool {
        const_eq!(self.x, other.x) &&
        const_eq!(self.y, other.y)
    }

    pub const fn const_cmp(&self, other: &Self) -> Ordering {
        try_equal!(const_cmp!(self.x, other.x));
        try_equal!(const_cmp!(self.y, other.y))
    }
}

const _: () = {
    let foo = MyType{x: "hello", y: &[3, 5, 8, 13]};
    let bar = MyType{x: "world", y: &[3, 5, 8, 13]};

    assert!(matches!(const_cmp!(foo, foo), Ordering::Equal));
    assert!(matches!(const_cmp!(foo, bar), Ordering::Less));
    assert!(matches!(const_cmp!(bar, foo), Ordering::Greater));
    assert!(const_eq!(foo, foo));
    assert!(!const_eq!(foo, bar));
};

const _: () = {
    let foo = MyType{x: "hello", y: &[false]};
    let bar = MyType{x: "hello", y: &[true]};

    assert!(matches!(const_cmp!(foo, foo), Ordering::Equal));
    assert!(matches!(const_cmp!(foo, bar), Ordering::Less));
    assert!(matches!(const_cmp!(bar, foo), Ordering::Greater));
    assert!(const_eq!(foo, foo));
    assert!(!const_eq!(foo, bar));
};

Required Associated Types§

Source

type Kind

What kind of type this is, this can be one of:

Implementations on Foreign Types§

Source§

impl ConstCmp for Ordering

Source§

impl ConstCmp for Option<Ordering>

Source§

impl ConstCmp for Option<bool>

Source§

impl ConstCmp for Option<char>

Source§

impl ConstCmp for Option<i8>

Source§

impl ConstCmp for Option<i16>

Source§

impl ConstCmp for Option<i32>

Source§

impl ConstCmp for Option<i64>

Source§

impl ConstCmp for Option<i128>

Source§

impl ConstCmp for Option<isize>

Source§

impl ConstCmp for Option<u8>

Source§

impl ConstCmp for Option<u16>

Source§

impl ConstCmp for Option<u32>

Source§

impl ConstCmp for Option<u64>

Source§

impl ConstCmp for Option<u128>

Source§

impl ConstCmp for Option<usize>

Source§

impl ConstCmp for Option<NonZeroI8>

Source§

impl ConstCmp for Option<NonZeroI16>

Source§

impl ConstCmp for Option<NonZeroI32>

Source§

impl ConstCmp for Option<NonZeroI64>

Source§

impl ConstCmp for Option<NonZeroI128>

Source§

impl ConstCmp for Option<NonZeroIsize>

Source§

impl ConstCmp for Option<NonZeroU8>

Source§

impl ConstCmp for Option<NonZeroU16>

Source§

impl ConstCmp for Option<NonZeroU32>

Source§

impl ConstCmp for Option<NonZeroU64>

Source§

impl ConstCmp for Option<NonZeroU128>

Source§

impl ConstCmp for Option<NonZeroUsize>

Source§

impl ConstCmp for bool

Source§

impl ConstCmp for char

Source§

impl ConstCmp for i8

Source§

impl ConstCmp for i16

Source§

impl ConstCmp for i32

Source§

impl ConstCmp for i64

Source§

impl ConstCmp for i128

Source§

impl ConstCmp for isize

Source§

impl ConstCmp for str

Source§

impl ConstCmp for u8

Source§

impl ConstCmp for u16

Source§

impl ConstCmp for u32

Source§

impl ConstCmp for u64

Source§

impl ConstCmp for u128

Source§

impl ConstCmp for usize

Source§

impl ConstCmp for PhantomPinned

Source§

impl ConstCmp for Range<char>

Source§

impl ConstCmp for Range<u8>

Source§

impl ConstCmp for Range<u16>

Source§

impl ConstCmp for Range<u32>

Source§

impl ConstCmp for Range<u64>

Source§

impl ConstCmp for Range<u128>

Source§

impl ConstCmp for Range<usize>

Source§

impl ConstCmp for RangeInclusive<char>

Source§

impl ConstCmp for RangeInclusive<u8>

Source§

impl ConstCmp for RangeInclusive<u16>

Source§

impl ConstCmp for RangeInclusive<u32>

Source§

impl ConstCmp for RangeInclusive<u64>

Source§

impl ConstCmp for RangeInclusive<u128>

Source§

impl ConstCmp for RangeInclusive<usize>

Source§

impl ConstCmp for NonZeroI8

Source§

impl ConstCmp for NonZeroI16

Source§

impl ConstCmp for NonZeroI32

Source§

impl ConstCmp for NonZeroI64

Source§

impl ConstCmp for NonZeroI128

Source§

impl ConstCmp for NonZeroIsize

Source§

impl ConstCmp for NonZeroU8

Source§

impl ConstCmp for NonZeroU16

Source§

impl ConstCmp for NonZeroU32

Source§

impl ConstCmp for NonZeroU64

Source§

impl ConstCmp for NonZeroU128

Source§

impl ConstCmp for NonZeroUsize

Source§

impl<'a> ConstCmp for Option<&'a str>

Source§

impl<'a> ConstCmp for Option<&'a [bool]>

Source§

impl<'a> ConstCmp for Option<&'a [char]>

Source§

impl<'a> ConstCmp for Option<&'a [i8]>

Source§

impl<'a> ConstCmp for Option<&'a [i16]>

Source§

impl<'a> ConstCmp for Option<&'a [i32]>

Source§

impl<'a> ConstCmp for Option<&'a [i64]>

Source§

impl<'a> ConstCmp for Option<&'a [i128]>

Source§

impl<'a> ConstCmp for Option<&'a [isize]>

Source§

impl<'a> ConstCmp for Option<&'a [u8]>

Source§

impl<'a> ConstCmp for Option<&'a [u16]>

Source§

impl<'a> ConstCmp for Option<&'a [u32]>

Source§

impl<'a> ConstCmp for Option<&'a [u64]>

Source§

impl<'a> ConstCmp for Option<&'a [u128]>

Source§

impl<'a> ConstCmp for Option<&'a [usize]>

Source§

impl<'a, 'b> ConstCmp for Option<&'a [&'b str]>

Source§

impl<'a, 'b> ConstCmp for Option<&'a [&'b [u8]]>

Source§

impl<T> ConstCmp for &T
where T: ?Sized + ConstCmp,

Source§

impl<T> ConstCmp for &mut T
where T: ?Sized + ConstCmp,

Source§

impl<T> ConstCmp for [T]

Source§

impl<T> ConstCmp for PhantomData<T>

Source§

impl<T, const N: usize> ConstCmp for [T; N]

Implementors§