Skip to content
CryoCryo home
Stdlibcore

cmp

import std::core::cmp; — in the prelude · source

Types

Eq

type trait Eq {
    equals(&this, other: &This) -> boolean;
}

Equality. Implement equals and == / != on the type route through it. Every primitive has an impl; the containers implement it parametrically — an Array<T> is Eq when T is.

Methods

equals(&this, other: &This) -> boolean;

Floats compare bitwise

This is the one place where core deliberately departs from IEEE-754. Eq for f32 and f64 compares the raw bits, and Ord orders them as sign-magnitude integers:

-NaN < -inf < ... < -0.0 < +0.0 < ... < +inf < +NaN

That keeps Eq a genuine equivalence relation — reflexive even for NaN — and keeps it consistent with Ord, which IEEE comparison cannot be (NaN is unordered and -0.0 == 0.0). Two consequences worth knowing: (0.0).equals(&-0.0) is false, and two NaNs with different payloads are unequal. When you want IEEE semantics, use the == operator directly.

Implementors

implement trait Eq for i8
implement trait Eq for i16
implement trait Eq for i32
implement trait Eq for i64
implement trait Eq for u8
implement trait Eq for u16
implement trait Eq for u32
implement trait Eq for u64
implement trait Eq for i128
implement trait Eq for u128
implement trait Eq for usize
implement trait Eq for isize
implement trait Eq for boolean
implement trait Eq for char
implement trait Eq for string
implement trait Eq for f32
implement trait Eq for f64
implement<T, A> trait Eq for struct Array<T, A> where T: Eq, A: Allocator
std::collections::array
implement<A, B> trait Eq for struct Pair<A, B> where A: Eq, B: Eq
std::collections::pair
implement trait Eq for struct Str
std::collections::str
implement<A> trait Eq for struct String<A> where A: Allocator
std::collections::string
implement<T> trait Eq for enum Option<T> where T: Eq
std::core::option
implement<T, E> trait Eq for enum Result<T, E> where T: Eq, E: Eq
std::core::result
implement trait Eq for enum RandomError
std::random::error
implement trait Eq for struct Instant
std::time::clock
implement trait Eq for struct Duration
std::time::duration

Ord

type trait Ord : Eq {
    compare(&this, other: &This) -> Ordering;
}

A total order, extending Eq. The relational operators are sugar over it: on an Ord type, a < b is rewritten to a.compare(&b).is_lt(). Implement compare and a type gets <, >, <=, and >= for free. boolean has Eq but not Ord; string compares as a C string, by bytes up to the first NUL.

Methods

compare(&this, other: &This) -> Ordering;

Implementors

implement trait Ord for i8
implement trait Ord for i16
implement trait Ord for i32
implement trait Ord for i64
implement trait Ord for u8
implement trait Ord for u16
implement trait Ord for u32
implement trait Ord for u64
implement trait Ord for i128
implement trait Ord for u128
implement trait Ord for usize
implement trait Ord for isize
implement trait Ord for char
implement trait Ord for string
implement trait Ord for f32
implement trait Ord for f64
implement trait Ord for struct Str
std::collections::str
implement<A> trait Ord for struct String<A> where A: Allocator
std::collections::string
implement trait Ord for struct Instant
std::time::clock
implement trait Ord for struct Duration
std::time::duration

Ordering

type enum Ordering {
    Less;
    Equal;
    Greater;
}

implement enum Ordering {
    reverse(&this) -> Ordering;
    is_lt(&this) -> boolean;
    is_gt(&this) -> boolean;
    is_le(&this) -> boolean;
    is_ge(&this) -> boolean;
}

The result of a comparison. reverse is useful for sorting by a reversed key without duplicating the comparator; the predicates is_lt, is_gt, is_le, and is_ge are what back the operators.

Variants

Variant
Less
Equal
Greater

Methods

reverse(&this) -> Ordering;

Flip the direction of the comparison. Useful when sorting by a reversed key without duplicating the comparator.

is_lt(&this) -> boolean;

Ordering predicates backing the relational operators on Ord types. The compiler rewrites a < b into a.compare(&b).is_lt() (and >, <=, >= into is_gt/is_le/is_ge), so these keep the operator semantics in one place and let Ord-only types get < > <= >= for free once they implement compare.

is_gt(&this) -> boolean;
is_le(&this) -> boolean;
is_ge(&this) -> boolean;

Free Functions

min, max, and clamp

Generic over any Ord. clamp panics if lo > hi, since that range is nonsense. math has the same three names dispatched over the numeric primitives at compile time, for code that does not want a trait bound.

function min<T>(a: T, b: T) -> T where T: Ord;

function max<T>(a: T, b: T) -> T where T: Ord;

function clamp<T>(value: T, lo: T, hi: T) -> T where T: Ord;

Constrain value to [lo, hi]. Panics if lo > hi; the caller gave a nonsense range.