core/
cmp.rs

1//! Utilities for comparing and ordering values.
2//!
3//! This module contains various tools for comparing and ordering values. In
4//! summary:
5//!
6//! * [`PartialEq<Rhs>`] overloads the `==` and `!=` operators. In cases where
7//!   `Rhs` (the right hand side's type) is `Self`, this trait corresponds to a
8//!   partial equivalence relation.
9//! * [`Eq`] indicates that the overloaded `==` operator corresponds to an
10//!   equivalence relation.
11//! * [`Ord`] and [`PartialOrd`] are traits that allow you to define total and
12//!   partial orderings between values, respectively. Implementing them overloads
13//!   the `<`, `<=`, `>`, and `>=` operators.
14//! * [`Ordering`] is an enum returned by the main functions of [`Ord`] and
15//!   [`PartialOrd`], and describes an ordering of two values (less, equal, or
16//!   greater).
17//! * [`Reverse`] is a struct that allows you to easily reverse an ordering.
18//! * [`max`] and [`min`] are functions that build off of [`Ord`] and allow you
19//!   to find the maximum or minimum of two values.
20//!
21//! For more details, see the respective documentation of each item in the list.
22//!
23//! [`max`]: Ord::max
24//! [`min`]: Ord::min
25
26#![stable(feature = "rust1", since = "1.0.0")]
27
28mod bytewise;
29pub(crate) use bytewise::BytewiseEq;
30
31use self::Ordering::*;
32use crate::ops::ControlFlow;
33
34/// Trait for comparisons using the equality operator.
35///
36/// Implementing this trait for types provides the `==` and `!=` operators for
37/// those types.
38///
39/// `x.eq(y)` can also be written `x == y`, and `x.ne(y)` can be written `x != y`.
40/// We use the easier-to-read infix notation in the remainder of this documentation.
41///
42/// This trait allows for comparisons using the equality operator, for types
43/// that do not have a full equivalence relation. For example, in floating point
44/// numbers `NaN != NaN`, so floating point types implement `PartialEq` but not
45/// [`trait@Eq`]. Formally speaking, when `Rhs == Self`, this trait corresponds
46/// to a [partial equivalence relation].
47///
48/// [partial equivalence relation]: https://en.wikipedia.org/wiki/Partial_equivalence_relation
49///
50/// Implementations must ensure that `eq` and `ne` are consistent with each other:
51///
52/// - `a != b` if and only if `!(a == b)`.
53///
54/// The default implementation of `ne` provides this consistency and is almost
55/// always sufficient. It should not be overridden without very good reason.
56///
57/// If [`PartialOrd`] or [`Ord`] are also implemented for `Self` and `Rhs`, their methods must also
58/// be consistent with `PartialEq` (see the documentation of those traits for the exact
59/// requirements). It's easy to accidentally make them disagree by deriving some of the traits and
60/// manually implementing others.
61///
62/// The equality relation `==` must satisfy the following conditions
63/// (for all `a`, `b`, `c` of type `A`, `B`, `C`):
64///
65/// - **Symmetry**: if `A: PartialEq<B>` and `B: PartialEq<A>`, then **`a == b`
66///   implies `b == a`**; and
67///
68/// - **Transitivity**: if `A: PartialEq<B>` and `B: PartialEq<C>` and `A:
69///   PartialEq<C>`, then **`a == b` and `b == c` implies `a == c`**.
70///   This must also work for longer chains, such as when `A: PartialEq<B>`, `B: PartialEq<C>`,
71///   `C: PartialEq<D>`, and `A: PartialEq<D>` all exist.
72///
73/// Note that the `B: PartialEq<A>` (symmetric) and `A: PartialEq<C>`
74/// (transitive) impls are not forced to exist, but these requirements apply
75/// whenever they do exist.
76///
77/// Violating these requirements is a logic error. The behavior resulting from a logic error is not
78/// specified, but users of the trait must ensure that such logic errors do *not* result in
79/// undefined behavior. This means that `unsafe` code **must not** rely on the correctness of these
80/// methods.
81///
82/// ## Cross-crate considerations
83///
84/// Upholding the requirements stated above can become tricky when one crate implements `PartialEq`
85/// for a type of another crate (i.e., to allow comparing one of its own types with a type from the
86/// standard library). The recommendation is to never implement this trait for a foreign type. In
87/// other words, such a crate should do `impl PartialEq<ForeignType> for LocalType`, but it should
88/// *not* do `impl PartialEq<LocalType> for ForeignType`.
89///
90/// This avoids the problem of transitive chains that criss-cross crate boundaries: for all local
91/// types `T`, you may assume that no other crate will add `impl`s that allow comparing `T == U`. In
92/// other words, if other crates add `impl`s that allow building longer transitive chains `U1 == ...
93/// == T == V1 == ...`, then all the types that appear to the right of `T` must be types that the
94/// crate defining `T` already knows about. This rules out transitive chains where downstream crates
95/// can add new `impl`s that "stitch together" comparisons of foreign types in ways that violate
96/// transitivity.
97///
98/// Not having such foreign `impl`s also avoids forward compatibility issues where one crate adding
99/// more `PartialEq` implementations can cause build failures in downstream crates.
100///
101/// ## Derivable
102///
103/// This trait can be used with `#[derive]`. When `derive`d on structs, two
104/// instances are equal if all fields are equal, and not equal if any fields
105/// are not equal. When `derive`d on enums, two instances are equal if they
106/// are the same variant and all fields are equal.
107///
108/// ## How can I implement `PartialEq`?
109///
110/// An example implementation for a domain in which two books are considered
111/// the same book if their ISBN matches, even if the formats differ:
112///
113/// ```
114/// enum BookFormat {
115///     Paperback,
116///     Hardback,
117///     Ebook,
118/// }
119///
120/// struct Book {
121///     isbn: i32,
122///     format: BookFormat,
123/// }
124///
125/// impl PartialEq for Book {
126///     fn eq(&self, other: &Self) -> bool {
127///         self.isbn == other.isbn
128///     }
129/// }
130///
131/// let b1 = Book { isbn: 3, format: BookFormat::Paperback };
132/// let b2 = Book { isbn: 3, format: BookFormat::Ebook };
133/// let b3 = Book { isbn: 10, format: BookFormat::Paperback };
134///
135/// assert!(b1 == b2);
136/// assert!(b1 != b3);
137/// ```
138///
139/// ## How can I compare two different types?
140///
141/// The type you can compare with is controlled by `PartialEq`'s type parameter.
142/// For example, let's tweak our previous code a bit:
143///
144/// ```
145/// // The derive implements <BookFormat> == <BookFormat> comparisons
146/// #[derive(PartialEq)]
147/// enum BookFormat {
148///     Paperback,
149///     Hardback,
150///     Ebook,
151/// }
152///
153/// struct Book {
154///     isbn: i32,
155///     format: BookFormat,
156/// }
157///
158/// // Implement <Book> == <BookFormat> comparisons
159/// impl PartialEq<BookFormat> for Book {
160///     fn eq(&self, other: &BookFormat) -> bool {
161///         self.format == *other
162///     }
163/// }
164///
165/// // Implement <BookFormat> == <Book> comparisons
166/// impl PartialEq<Book> for BookFormat {
167///     fn eq(&self, other: &Book) -> bool {
168///         *self == other.format
169///     }
170/// }
171///
172/// let b1 = Book { isbn: 3, format: BookFormat::Paperback };
173///
174/// assert!(b1 == BookFormat::Paperback);
175/// assert!(BookFormat::Ebook != b1);
176/// ```
177///
178/// By changing `impl PartialEq for Book` to `impl PartialEq<BookFormat> for Book`,
179/// we allow `BookFormat`s to be compared with `Book`s.
180///
181/// A comparison like the one above, which ignores some fields of the struct,
182/// can be dangerous. It can easily lead to an unintended violation of the
183/// requirements for a partial equivalence relation. For example, if we kept
184/// the above implementation of `PartialEq<Book>` for `BookFormat` and added an
185/// implementation of `PartialEq<Book>` for `Book` (either via a `#[derive]` or
186/// via the manual implementation from the first example) then the result would
187/// violate transitivity:
188///
189/// ```should_panic
190/// #[derive(PartialEq)]
191/// enum BookFormat {
192///     Paperback,
193///     Hardback,
194///     Ebook,
195/// }
196///
197/// #[derive(PartialEq)]
198/// struct Book {
199///     isbn: i32,
200///     format: BookFormat,
201/// }
202///
203/// impl PartialEq<BookFormat> for Book {
204///     fn eq(&self, other: &BookFormat) -> bool {
205///         self.format == *other
206///     }
207/// }
208///
209/// impl PartialEq<Book> for BookFormat {
210///     fn eq(&self, other: &Book) -> bool {
211///         *self == other.format
212///     }
213/// }
214///
215/// fn main() {
216///     let b1 = Book { isbn: 1, format: BookFormat::Paperback };
217///     let b2 = Book { isbn: 2, format: BookFormat::Paperback };
218///
219///     assert!(b1 == BookFormat::Paperback);
220///     assert!(BookFormat::Paperback == b2);
221///
222///     // The following should hold by transitivity but doesn't.
223///     assert!(b1 == b2); // <-- PANICS
224/// }
225/// ```
226///
227/// # Examples
228///
229/// ```
230/// let x: u32 = 0;
231/// let y: u32 = 1;
232///
233/// assert_eq!(x == y, false);
234/// assert_eq!(x.eq(&y), false);
235/// ```
236///
237/// [`eq`]: PartialEq::eq
238/// [`ne`]: PartialEq::ne
239#[lang = "eq"]
240#[stable(feature = "rust1", since = "1.0.0")]
241#[doc(alias = "==")]
242#[doc(alias = "!=")]
243#[rustc_on_unimplemented(
244    message = "can't compare `{Self}` with `{Rhs}`",
245    label = "no implementation for `{Self} == {Rhs}`",
246    append_const_msg
247)]
248#[rustc_diagnostic_item = "PartialEq"]
249pub trait PartialEq<Rhs: ?Sized = Self> {
250    /// Tests for `self` and `other` values to be equal, and is used by `==`.
251    #[must_use]
252    #[stable(feature = "rust1", since = "1.0.0")]
253    #[rustc_diagnostic_item = "cmp_partialeq_eq"]
254    fn eq(&self, other: &Rhs) -> bool;
255
256    /// Tests for `!=`. The default implementation is almost always sufficient,
257    /// and should not be overridden without very good reason.
258    #[inline]
259    #[must_use]
260    #[stable(feature = "rust1", since = "1.0.0")]
261    #[rustc_diagnostic_item = "cmp_partialeq_ne"]
262    fn ne(&self, other: &Rhs) -> bool {
263        !self.eq(other)
264    }
265}
266
267/// Derive macro generating an impl of the trait [`PartialEq`].
268/// The behavior of this macro is described in detail [here](PartialEq#derivable).
269#[rustc_builtin_macro]
270#[stable(feature = "builtin_macro_prelude", since = "1.38.0")]
271#[allow_internal_unstable(core_intrinsics, structural_match)]
272pub macro PartialEq($item:item) {
273    /* compiler built-in */
274}
275
276/// Trait for comparisons corresponding to [equivalence relations](
277/// https://en.wikipedia.org/wiki/Equivalence_relation).
278///
279/// The primary difference to [`PartialEq`] is the additional requirement for reflexivity. A type
280/// that implements [`PartialEq`] guarantees that for all `a`, `b` and `c`:
281///
282/// - symmetric: `a == b` implies `b == a` and `a != b` implies `!(a == b)`
283/// - transitive: `a == b` and `b == c` implies `a == c`
284///
285/// `Eq`, which builds on top of [`PartialEq`] also implies:
286///
287/// - reflexive: `a == a`
288///
289/// This property cannot be checked by the compiler, and therefore `Eq` is a trait without methods.
290///
291/// Violating this property is a logic error. The behavior resulting from a logic error is not
292/// specified, but users of the trait must ensure that such logic errors do *not* result in
293/// undefined behavior. This means that `unsafe` code **must not** rely on the correctness of these
294/// methods.
295///
296/// Floating point types such as [`f32`] and [`f64`] implement only [`PartialEq`] but *not* `Eq`
297/// because `NaN` != `NaN`.
298///
299/// ## Derivable
300///
301/// This trait can be used with `#[derive]`. When `derive`d, because `Eq` has no extra methods, it
302/// is only informing the compiler that this is an equivalence relation rather than a partial
303/// equivalence relation. Note that the `derive` strategy requires all fields are `Eq`, which isn't
304/// always desired.
305///
306/// ## How can I implement `Eq`?
307///
308/// If you cannot use the `derive` strategy, specify that your type implements `Eq`, which has no
309/// extra methods:
310///
311/// ```
312/// enum BookFormat {
313///     Paperback,
314///     Hardback,
315///     Ebook,
316/// }
317///
318/// struct Book {
319///     isbn: i32,
320///     format: BookFormat,
321/// }
322///
323/// impl PartialEq for Book {
324///     fn eq(&self, other: &Self) -> bool {
325///         self.isbn == other.isbn
326///     }
327/// }
328///
329/// impl Eq for Book {}
330/// ```
331#[doc(alias = "==")]
332#[doc(alias = "!=")]
333#[stable(feature = "rust1", since = "1.0.0")]
334#[rustc_diagnostic_item = "Eq"]
335pub trait Eq: PartialEq<Self> {
336    // this method is used solely by `impl Eq or #[derive(Eq)]` to assert that every component of a
337    // type implements `Eq` itself. The current deriving infrastructure means doing this assertion
338    // without using a method on this trait is nearly impossible.
339    //
340    // This should never be implemented by hand.
341    #[doc(hidden)]
342    #[coverage(off)]
343    #[inline]
344    #[stable(feature = "rust1", since = "1.0.0")]
345    fn assert_receiver_is_total_eq(&self) {}
346}
347
348/// Derive macro generating an impl of the trait [`Eq`].
349#[rustc_builtin_macro]
350#[stable(feature = "builtin_macro_prelude", since = "1.38.0")]
351#[allow_internal_unstable(core_intrinsics, derive_eq, structural_match)]
352#[allow_internal_unstable(coverage_attribute)]
353pub macro Eq($item:item) {
354    /* compiler built-in */
355}
356
357// FIXME: this struct is used solely by #[derive] to
358// assert that every component of a type implements Eq.
359//
360// This struct should never appear in user code.
361#[doc(hidden)]
362#[allow(missing_debug_implementations)]
363#[unstable(feature = "derive_eq", reason = "deriving hack, should not be public", issue = "none")]
364pub struct AssertParamIsEq<T: Eq + ?Sized> {
365    _field: crate::marker::PhantomData<T>,
366}
367
368/// An `Ordering` is the result of a comparison between two values.
369///
370/// # Examples
371///
372/// ```
373/// use std::cmp::Ordering;
374///
375/// assert_eq!(1.cmp(&2), Ordering::Less);
376///
377/// assert_eq!(1.cmp(&1), Ordering::Equal);
378///
379/// assert_eq!(2.cmp(&1), Ordering::Greater);
380/// ```
381#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug, Hash)]
382#[stable(feature = "rust1", since = "1.0.0")]
383// This is a lang item only so that `BinOp::Cmp` in MIR can return it.
384// It has no special behavior, but does require that the three variants
385// `Less`/`Equal`/`Greater` remain `-1_i8`/`0_i8`/`+1_i8` respectively.
386#[lang = "Ordering"]
387#[repr(i8)]
388pub enum Ordering {
389    /// An ordering where a compared value is less than another.
390    #[stable(feature = "rust1", since = "1.0.0")]
391    Less = -1,
392    /// An ordering where a compared value is equal to another.
393    #[stable(feature = "rust1", since = "1.0.0")]
394    Equal = 0,
395    /// An ordering where a compared value is greater than another.
396    #[stable(feature = "rust1", since = "1.0.0")]
397    Greater = 1,
398}
399
400impl Ordering {
401    #[inline]
402    const fn as_raw(self) -> i8 {
403        // FIXME(const-hack): just use `PartialOrd` against `Equal` once that's const
404        crate::intrinsics::discriminant_value(&self)
405    }
406
407    /// Returns `true` if the ordering is the `Equal` variant.
408    ///
409    /// # Examples
410    ///
411    /// ```
412    /// use std::cmp::Ordering;
413    ///
414    /// assert_eq!(Ordering::Less.is_eq(), false);
415    /// assert_eq!(Ordering::Equal.is_eq(), true);
416    /// assert_eq!(Ordering::Greater.is_eq(), false);
417    /// ```
418    #[inline]
419    #[must_use]
420    #[rustc_const_stable(feature = "ordering_helpers", since = "1.53.0")]
421    #[stable(feature = "ordering_helpers", since = "1.53.0")]
422    pub const fn is_eq(self) -> bool {
423        // All the `is_*` methods are implemented as comparisons against zero
424        // to follow how clang's libcxx implements their equivalents in
425        // <https://github.com/llvm/llvm-project/blob/60486292b79885b7800b082754153202bef5b1f0/libcxx/include/__compare/is_eq.h#L23-L28>
426
427        self.as_raw() == 0
428    }
429
430    /// Returns `true` if the ordering is not the `Equal` variant.
431    ///
432    /// # Examples
433    ///
434    /// ```
435    /// use std::cmp::Ordering;
436    ///
437    /// assert_eq!(Ordering::Less.is_ne(), true);
438    /// assert_eq!(Ordering::Equal.is_ne(), false);
439    /// assert_eq!(Ordering::Greater.is_ne(), true);
440    /// ```
441    #[inline]
442    #[must_use]
443    #[rustc_const_stable(feature = "ordering_helpers", since = "1.53.0")]
444    #[stable(feature = "ordering_helpers", since = "1.53.0")]
445    pub const fn is_ne(self) -> bool {
446        self.as_raw() != 0
447    }
448
449    /// Returns `true` if the ordering is the `Less` variant.
450    ///
451    /// # Examples
452    ///
453    /// ```
454    /// use std::cmp::Ordering;
455    ///
456    /// assert_eq!(Ordering::Less.is_lt(), true);
457    /// assert_eq!(Ordering::Equal.is_lt(), false);
458    /// assert_eq!(Ordering::Greater.is_lt(), false);
459    /// ```
460    #[inline]
461    #[must_use]
462    #[rustc_const_stable(feature = "ordering_helpers", since = "1.53.0")]
463    #[stable(feature = "ordering_helpers", since = "1.53.0")]
464    pub const fn is_lt(self) -> bool {
465        self.as_raw() < 0
466    }
467
468    /// Returns `true` if the ordering is the `Greater` variant.
469    ///
470    /// # Examples
471    ///
472    /// ```
473    /// use std::cmp::Ordering;
474    ///
475    /// assert_eq!(Ordering::Less.is_gt(), false);
476    /// assert_eq!(Ordering::Equal.is_gt(), false);
477    /// assert_eq!(Ordering::Greater.is_gt(), true);
478    /// ```
479    #[inline]
480    #[must_use]
481    #[rustc_const_stable(feature = "ordering_helpers", since = "1.53.0")]
482    #[stable(feature = "ordering_helpers", since = "1.53.0")]
483    pub const fn is_gt(self) -> bool {
484        self.as_raw() > 0
485    }
486
487    /// Returns `true` if the ordering is either the `Less` or `Equal` variant.
488    ///
489    /// # Examples
490    ///
491    /// ```
492    /// use std::cmp::Ordering;
493    ///
494    /// assert_eq!(Ordering::Less.is_le(), true);
495    /// assert_eq!(Ordering::Equal.is_le(), true);
496    /// assert_eq!(Ordering::Greater.is_le(), false);
497    /// ```
498    #[inline]
499    #[must_use]
500    #[rustc_const_stable(feature = "ordering_helpers", since = "1.53.0")]
501    #[stable(feature = "ordering_helpers", since = "1.53.0")]
502    pub const fn is_le(self) -> bool {
503        self.as_raw() <= 0
504    }
505
506    /// Returns `true` if the ordering is either the `Greater` or `Equal` variant.
507    ///
508    /// # Examples
509    ///
510    /// ```
511    /// use std::cmp::Ordering;
512    ///
513    /// assert_eq!(Ordering::Less.is_ge(), false);
514    /// assert_eq!(Ordering::Equal.is_ge(), true);
515    /// assert_eq!(Ordering::Greater.is_ge(), true);
516    /// ```
517    #[inline]
518    #[must_use]
519    #[rustc_const_stable(feature = "ordering_helpers", since = "1.53.0")]
520    #[stable(feature = "ordering_helpers", since = "1.53.0")]
521    pub const fn is_ge(self) -> bool {
522        self.as_raw() >= 0
523    }
524
525    /// Reverses the `Ordering`.
526    ///
527    /// * `Less` becomes `Greater`.
528    /// * `Greater` becomes `Less`.
529    /// * `Equal` becomes `Equal`.
530    ///
531    /// # Examples
532    ///
533    /// Basic behavior:
534    ///
535    /// ```
536    /// use std::cmp::Ordering;
537    ///
538    /// assert_eq!(Ordering::Less.reverse(), Ordering::Greater);
539    /// assert_eq!(Ordering::Equal.reverse(), Ordering::Equal);
540    /// assert_eq!(Ordering::Greater.reverse(), Ordering::Less);
541    /// ```
542    ///
543    /// This method can be used to reverse a comparison:
544    ///
545    /// ```
546    /// let data: &mut [_] = &mut [2, 10, 5, 8];
547    ///
548    /// // sort the array from largest to smallest.
549    /// data.sort_by(|a, b| a.cmp(b).reverse());
550    ///
551    /// let b: &mut [_] = &mut [10, 8, 5, 2];
552    /// assert!(data == b);
553    /// ```
554    #[inline]
555    #[must_use]
556    #[rustc_const_stable(feature = "const_ordering", since = "1.48.0")]
557    #[stable(feature = "rust1", since = "1.0.0")]
558    pub const fn reverse(self) -> Ordering {
559        match self {
560            Less => Greater,
561            Equal => Equal,
562            Greater => Less,
563        }
564    }
565
566    /// Chains two orderings.
567    ///
568    /// Returns `self` when it's not `Equal`. Otherwise returns `other`.
569    ///
570    /// # Examples
571    ///
572    /// ```
573    /// use std::cmp::Ordering;
574    ///
575    /// let result = Ordering::Equal.then(Ordering::Less);
576    /// assert_eq!(result, Ordering::Less);
577    ///
578    /// let result = Ordering::Less.then(Ordering::Equal);
579    /// assert_eq!(result, Ordering::Less);
580    ///
581    /// let result = Ordering::Less.then(Ordering::Greater);
582    /// assert_eq!(result, Ordering::Less);
583    ///
584    /// let result = Ordering::Equal.then(Ordering::Equal);
585    /// assert_eq!(result, Ordering::Equal);
586    ///
587    /// let x: (i64, i64, i64) = (1, 2, 7);
588    /// let y: (i64, i64, i64) = (1, 5, 3);
589    /// let result = x.0.cmp(&y.0).then(x.1.cmp(&y.1)).then(x.2.cmp(&y.2));
590    ///
591    /// assert_eq!(result, Ordering::Less);
592    /// ```
593    #[inline]
594    #[must_use]
595    #[rustc_const_stable(feature = "const_ordering", since = "1.48.0")]
596    #[stable(feature = "ordering_chaining", since = "1.17.0")]
597    pub const fn then(self, other: Ordering) -> Ordering {
598        match self {
599            Equal => other,
600            _ => self,
601        }
602    }
603
604    /// Chains the ordering with the given function.
605    ///
606    /// Returns `self` when it's not `Equal`. Otherwise calls `f` and returns
607    /// the result.
608    ///
609    /// # Examples
610    ///
611    /// ```
612    /// use std::cmp::Ordering;
613    ///
614    /// let result = Ordering::Equal.then_with(|| Ordering::Less);
615    /// assert_eq!(result, Ordering::Less);
616    ///
617    /// let result = Ordering::Less.then_with(|| Ordering::Equal);
618    /// assert_eq!(result, Ordering::Less);
619    ///
620    /// let result = Ordering::Less.then_with(|| Ordering::Greater);
621    /// assert_eq!(result, Ordering::Less);
622    ///
623    /// let result = Ordering::Equal.then_with(|| Ordering::Equal);
624    /// assert_eq!(result, Ordering::Equal);
625    ///
626    /// let x: (i64, i64, i64) = (1, 2, 7);
627    /// let y: (i64, i64, i64) = (1, 5, 3);
628    /// let result = x.0.cmp(&y.0).then_with(|| x.1.cmp(&y.1)).then_with(|| x.2.cmp(&y.2));
629    ///
630    /// assert_eq!(result, Ordering::Less);
631    /// ```
632    #[inline]
633    #[must_use]
634    #[stable(feature = "ordering_chaining", since = "1.17.0")]
635    pub fn then_with<F: FnOnce() -> Ordering>(self, f: F) -> Ordering {
636        match self {
637            Equal => f(),
638            _ => self,
639        }
640    }
641}
642
643/// A helper struct for reverse ordering.
644///
645/// This struct is a helper to be used with functions like [`Vec::sort_by_key`] and
646/// can be used to reverse order a part of a key.
647///
648/// [`Vec::sort_by_key`]: ../../std/vec/struct.Vec.html#method.sort_by_key
649///
650/// # Examples
651///
652/// ```
653/// use std::cmp::Reverse;
654///
655/// let mut v = vec![1, 2, 3, 4, 5, 6];
656/// v.sort_by_key(|&num| (num > 3, Reverse(num)));
657/// assert_eq!(v, vec![3, 2, 1, 6, 5, 4]);
658/// ```
659#[derive(PartialEq, Eq, Debug, Copy, Default, Hash)]
660#[stable(feature = "reverse_cmp_key", since = "1.19.0")]
661#[repr(transparent)]
662pub struct Reverse<T>(#[stable(feature = "reverse_cmp_key", since = "1.19.0")] pub T);
663
664#[stable(feature = "reverse_cmp_key", since = "1.19.0")]
665impl<T: PartialOrd> PartialOrd for Reverse<T> {
666    #[inline]
667    fn partial_cmp(&self, other: &Reverse<T>) -> Option<Ordering> {
668        other.0.partial_cmp(&self.0)
669    }
670
671    #[inline]
672    fn lt(&self, other: &Self) -> bool {
673        other.0 < self.0
674    }
675    #[inline]
676    fn le(&self, other: &Self) -> bool {
677        other.0 <= self.0
678    }
679    #[inline]
680    fn gt(&self, other: &Self) -> bool {
681        other.0 > self.0
682    }
683    #[inline]
684    fn ge(&self, other: &Self) -> bool {
685        other.0 >= self.0
686    }
687}
688
689#[stable(feature = "reverse_cmp_key", since = "1.19.0")]
690impl<T: Ord> Ord for Reverse<T> {
691    #[inline]
692    fn cmp(&self, other: &Reverse<T>) -> Ordering {
693        other.0.cmp(&self.0)
694    }
695}
696
697#[stable(feature = "reverse_cmp_key", since = "1.19.0")]
698impl<T: Clone> Clone for Reverse<T> {
699    #[inline]
700    fn clone(&self) -> Reverse<T> {
701        Reverse(self.0.clone())
702    }
703
704    #[inline]
705    fn clone_from(&mut self, source: &Self) {
706        self.0.clone_from(&source.0)
707    }
708}
709
710/// Trait for types that form a [total order](https://en.wikipedia.org/wiki/Total_order).
711///
712/// Implementations must be consistent with the [`PartialOrd`] implementation, and ensure `max`,
713/// `min`, and `clamp` are consistent with `cmp`:
714///
715/// - `partial_cmp(a, b) == Some(cmp(a, b))`.
716/// - `max(a, b) == max_by(a, b, cmp)` (ensured by the default implementation).
717/// - `min(a, b) == min_by(a, b, cmp)` (ensured by the default implementation).
718/// - For `a.clamp(min, max)`, see the [method docs](#method.clamp) (ensured by the default
719///   implementation).
720///
721/// Violating these requirements is a logic error. The behavior resulting from a logic error is not
722/// specified, but users of the trait must ensure that such logic errors do *not* result in
723/// undefined behavior. This means that `unsafe` code **must not** rely on the correctness of these
724/// methods.
725///
726/// ## Corollaries
727///
728/// From the above and the requirements of `PartialOrd`, it follows that for all `a`, `b` and `c`:
729///
730/// - exactly one of `a < b`, `a == b` or `a > b` is true; and
731/// - `<` is transitive: `a < b` and `b < c` implies `a < c`. The same must hold for both `==` and
732///   `>`.
733///
734/// Mathematically speaking, the `<` operator defines a strict [weak order]. In cases where `==`
735/// conforms to mathematical equality, it also defines a strict [total order].
736///
737/// [weak order]: https://en.wikipedia.org/wiki/Weak_ordering
738/// [total order]: https://en.wikipedia.org/wiki/Total_order
739///
740/// ## Derivable
741///
742/// This trait can be used with `#[derive]`.
743///
744/// When `derive`d on structs, it will produce a
745/// [lexicographic](https://en.wikipedia.org/wiki/Lexicographic_order) ordering based on the
746/// top-to-bottom declaration order of the struct's members.
747///
748/// When `derive`d on enums, variants are ordered primarily by their discriminants. Secondarily,
749/// they are ordered by their fields. By default, the discriminant is smallest for variants at the
750/// top, and largest for variants at the bottom. Here's an example:
751///
752/// ```
753/// #[derive(PartialEq, Eq, PartialOrd, Ord)]
754/// enum E {
755///     Top,
756///     Bottom,
757/// }
758///
759/// assert!(E::Top < E::Bottom);
760/// ```
761///
762/// However, manually setting the discriminants can override this default behavior:
763///
764/// ```
765/// #[derive(PartialEq, Eq, PartialOrd, Ord)]
766/// enum E {
767///     Top = 2,
768///     Bottom = 1,
769/// }
770///
771/// assert!(E::Bottom < E::Top);
772/// ```
773///
774/// ## Lexicographical comparison
775///
776/// Lexicographical comparison is an operation with the following properties:
777///  - Two sequences are compared element by element.
778///  - The first mismatching element defines which sequence is lexicographically less or greater
779///    than the other.
780///  - If one sequence is a prefix of another, the shorter sequence is lexicographically less than
781///    the other.
782///  - If two sequences have equivalent elements and are of the same length, then the sequences are
783///    lexicographically equal.
784///  - An empty sequence is lexicographically less than any non-empty sequence.
785///  - Two empty sequences are lexicographically equal.
786///
787/// ## How can I implement `Ord`?
788///
789/// `Ord` requires that the type also be [`PartialOrd`], [`PartialEq`], and [`Eq`].
790///
791/// Because `Ord` implies a stronger ordering relationship than [`PartialOrd`], and both `Ord` and
792/// [`PartialOrd`] must agree, you must choose how to implement `Ord` **first**. You can choose to
793/// derive it, or implement it manually. If you derive it, you should derive all four traits. If you
794/// implement it manually, you should manually implement all four traits, based on the
795/// implementation of `Ord`.
796///
797/// Here's an example where you want to define the `Character` comparison by `health` and
798/// `experience` only, disregarding the field `mana`:
799///
800/// ```
801/// use std::cmp::Ordering;
802///
803/// struct Character {
804///     health: u32,
805///     experience: u32,
806///     mana: f32,
807/// }
808///
809/// impl Ord for Character {
810///     fn cmp(&self, other: &Self) -> Ordering {
811///         self.experience
812///             .cmp(&other.experience)
813///             .then(self.health.cmp(&other.health))
814///     }
815/// }
816///
817/// impl PartialOrd for Character {
818///     fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
819///         Some(self.cmp(other))
820///     }
821/// }
822///
823/// impl PartialEq for Character {
824///     fn eq(&self, other: &Self) -> bool {
825///         self.health == other.health && self.experience == other.experience
826///     }
827/// }
828///
829/// impl Eq for Character {}
830/// ```
831///
832/// If all you need is to `slice::sort` a type by a field value, it can be simpler to use
833/// `slice::sort_by_key`.
834///
835/// ## Examples of incorrect `Ord` implementations
836///
837/// ```
838/// use std::cmp::Ordering;
839///
840/// #[derive(Debug)]
841/// struct Character {
842///     health: f32,
843/// }
844///
845/// impl Ord for Character {
846///     fn cmp(&self, other: &Self) -> std::cmp::Ordering {
847///         if self.health < other.health {
848///             Ordering::Less
849///         } else if self.health > other.health {
850///             Ordering::Greater
851///         } else {
852///             Ordering::Equal
853///         }
854///     }
855/// }
856///
857/// impl PartialOrd for Character {
858///     fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
859///         Some(self.cmp(other))
860///     }
861/// }
862///
863/// impl PartialEq for Character {
864///     fn eq(&self, other: &Self) -> bool {
865///         self.health == other.health
866///     }
867/// }
868///
869/// impl Eq for Character {}
870///
871/// let a = Character { health: 4.5 };
872/// let b = Character { health: f32::NAN };
873///
874/// // Mistake: floating-point values do not form a total order and using the built-in comparison
875/// // operands to implement `Ord` irregardless of that reality does not change it. Use
876/// // `f32::total_cmp` if you need a total order for floating-point values.
877///
878/// // Reflexivity requirement of `Ord` is not given.
879/// assert!(a == a);
880/// assert!(b != b);
881///
882/// // Antisymmetry requirement of `Ord` is not given. Only one of a < c and c < a is allowed to be
883/// // true, not both or neither.
884/// assert_eq!((a < b) as u8 + (b < a) as u8, 0);
885/// ```
886///
887/// ```
888/// use std::cmp::Ordering;
889///
890/// #[derive(Debug)]
891/// struct Character {
892///     health: u32,
893///     experience: u32,
894/// }
895///
896/// impl PartialOrd for Character {
897///     fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
898///         Some(self.cmp(other))
899///     }
900/// }
901///
902/// impl Ord for Character {
903///     fn cmp(&self, other: &Self) -> std::cmp::Ordering {
904///         if self.health < 50 {
905///             self.health.cmp(&other.health)
906///         } else {
907///             self.experience.cmp(&other.experience)
908///         }
909///     }
910/// }
911///
912/// // For performance reasons implementing `PartialEq` this way is not the idiomatic way, but it
913/// // ensures consistent behavior between `PartialEq`, `PartialOrd` and `Ord` in this example.
914/// impl PartialEq for Character {
915///     fn eq(&self, other: &Self) -> bool {
916///         self.cmp(other) == Ordering::Equal
917///     }
918/// }
919///
920/// impl Eq for Character {}
921///
922/// let a = Character {
923///     health: 3,
924///     experience: 5,
925/// };
926/// let b = Character {
927///     health: 10,
928///     experience: 77,
929/// };
930/// let c = Character {
931///     health: 143,
932///     experience: 2,
933/// };
934///
935/// // Mistake: The implementation of `Ord` compares different fields depending on the value of
936/// // `self.health`, the resulting order is not total.
937///
938/// // Transitivity requirement of `Ord` is not given. If a is smaller than b and b is smaller than
939/// // c, by transitive property a must also be smaller than c.
940/// assert!(a < b && b < c && c < a);
941///
942/// // Antisymmetry requirement of `Ord` is not given. Only one of a < c and c < a is allowed to be
943/// // true, not both or neither.
944/// assert_eq!((a < c) as u8 + (c < a) as u8, 2);
945/// ```
946///
947/// The documentation of [`PartialOrd`] contains further examples, for example it's wrong for
948/// [`PartialOrd`] and [`PartialEq`] to disagree.
949///
950/// [`cmp`]: Ord::cmp
951#[doc(alias = "<")]
952#[doc(alias = ">")]
953#[doc(alias = "<=")]
954#[doc(alias = ">=")]
955#[stable(feature = "rust1", since = "1.0.0")]
956#[rustc_diagnostic_item = "Ord"]
957pub trait Ord: Eq + PartialOrd<Self> {
958    /// This method returns an [`Ordering`] between `self` and `other`.
959    ///
960    /// By convention, `self.cmp(&other)` returns the ordering matching the expression
961    /// `self <operator> other` if true.
962    ///
963    /// # Examples
964    ///
965    /// ```
966    /// use std::cmp::Ordering;
967    ///
968    /// assert_eq!(5.cmp(&10), Ordering::Less);
969    /// assert_eq!(10.cmp(&5), Ordering::Greater);
970    /// assert_eq!(5.cmp(&5), Ordering::Equal);
971    /// ```
972    #[must_use]
973    #[stable(feature = "rust1", since = "1.0.0")]
974    #[rustc_diagnostic_item = "ord_cmp_method"]
975    fn cmp(&self, other: &Self) -> Ordering;
976
977    /// Compares and returns the maximum of two values.
978    ///
979    /// Returns the second argument if the comparison determines them to be equal.
980    ///
981    /// # Examples
982    ///
983    /// ```
984    /// assert_eq!(1.max(2), 2);
985    /// assert_eq!(2.max(2), 2);
986    /// ```
987    /// ```
988    /// use std::cmp::Ordering;
989    ///
990    /// #[derive(Eq)]
991    /// struct Equal(&'static str);
992    ///
993    /// impl PartialEq for Equal {
994    ///     fn eq(&self, other: &Self) -> bool { true }
995    /// }
996    /// impl PartialOrd for Equal {
997    ///     fn partial_cmp(&self, other: &Self) -> Option<Ordering> { Some(Ordering::Equal) }
998    /// }
999    /// impl Ord for Equal {
1000    ///     fn cmp(&self, other: &Self) -> Ordering { Ordering::Equal }
1001    /// }
1002    ///
1003    /// assert_eq!(Equal("self").max(Equal("other")).0, "other");
1004    /// ```
1005    #[stable(feature = "ord_max_min", since = "1.21.0")]
1006    #[inline]
1007    #[must_use]
1008    #[rustc_diagnostic_item = "cmp_ord_max"]
1009    fn max(self, other: Self) -> Self
1010    where
1011        Self: Sized,
1012    {
1013        if other < self { self } else { other }
1014    }
1015
1016    /// Compares and returns the minimum of two values.
1017    ///
1018    /// Returns the first argument if the comparison determines them to be equal.
1019    ///
1020    /// # Examples
1021    ///
1022    /// ```
1023    /// assert_eq!(1.min(2), 1);
1024    /// assert_eq!(2.min(2), 2);
1025    /// ```
1026    /// ```
1027    /// use std::cmp::Ordering;
1028    ///
1029    /// #[derive(Eq)]
1030    /// struct Equal(&'static str);
1031    ///
1032    /// impl PartialEq for Equal {
1033    ///     fn eq(&self, other: &Self) -> bool { true }
1034    /// }
1035    /// impl PartialOrd for Equal {
1036    ///     fn partial_cmp(&self, other: &Self) -> Option<Ordering> { Some(Ordering::Equal) }
1037    /// }
1038    /// impl Ord for Equal {
1039    ///     fn cmp(&self, other: &Self) -> Ordering { Ordering::Equal }
1040    /// }
1041    ///
1042    /// assert_eq!(Equal("self").min(Equal("other")).0, "self");
1043    /// ```
1044    #[stable(feature = "ord_max_min", since = "1.21.0")]
1045    #[inline]
1046    #[must_use]
1047    #[rustc_diagnostic_item = "cmp_ord_min"]
1048    fn min(self, other: Self) -> Self
1049    where
1050        Self: Sized,
1051    {
1052        if other < self { other } else { self }
1053    }
1054
1055    /// Restrict a value to a certain interval.
1056    ///
1057    /// Returns `max` if `self` is greater than `max`, and `min` if `self` is
1058    /// less than `min`. Otherwise this returns `self`.
1059    ///
1060    /// # Panics
1061    ///
1062    /// Panics if `min > max`.
1063    ///
1064    /// # Examples
1065    ///
1066    /// ```
1067    /// assert_eq!((-3).clamp(-2, 1), -2);
1068    /// assert_eq!(0.clamp(-2, 1), 0);
1069    /// assert_eq!(2.clamp(-2, 1), 1);
1070    /// ```
1071    #[must_use]
1072    #[inline]
1073    #[stable(feature = "clamp", since = "1.50.0")]
1074    fn clamp(self, min: Self, max: Self) -> Self
1075    where
1076        Self: Sized,
1077    {
1078        assert!(min <= max);
1079        if self < min {
1080            min
1081        } else if self > max {
1082            max
1083        } else {
1084            self
1085        }
1086    }
1087}
1088
1089/// Derive macro generating an impl of the trait [`Ord`].
1090/// The behavior of this macro is described in detail [here](Ord#derivable).
1091#[rustc_builtin_macro]
1092#[stable(feature = "builtin_macro_prelude", since = "1.38.0")]
1093#[allow_internal_unstable(core_intrinsics)]
1094pub macro Ord($item:item) {
1095    /* compiler built-in */
1096}
1097
1098/// Trait for types that form a [partial order](https://en.wikipedia.org/wiki/Partial_order).
1099///
1100/// The `lt`, `le`, `gt`, and `ge` methods of this trait can be called using the `<`, `<=`, `>`, and
1101/// `>=` operators, respectively.
1102///
1103/// This trait should **only** contain the comparison logic for a type **if one plans on only
1104/// implementing `PartialOrd` but not [`Ord`]**. Otherwise the comparison logic should be in [`Ord`]
1105/// and this trait implemented with `Some(self.cmp(other))`.
1106///
1107/// The methods of this trait must be consistent with each other and with those of [`PartialEq`].
1108/// The following conditions must hold:
1109///
1110/// 1. `a == b` if and only if `partial_cmp(a, b) == Some(Equal)`.
1111/// 2. `a < b` if and only if `partial_cmp(a, b) == Some(Less)`
1112/// 3. `a > b` if and only if `partial_cmp(a, b) == Some(Greater)`
1113/// 4. `a <= b` if and only if `a < b || a == b`
1114/// 5. `a >= b` if and only if `a > b || a == b`
1115/// 6. `a != b` if and only if `!(a == b)`.
1116///
1117/// Conditions 2–5 above are ensured by the default implementation. Condition 6 is already ensured
1118/// by [`PartialEq`].
1119///
1120/// If [`Ord`] is also implemented for `Self` and `Rhs`, it must also be consistent with
1121/// `partial_cmp` (see the documentation of that trait for the exact requirements). It's easy to
1122/// accidentally make them disagree by deriving some of the traits and manually implementing others.
1123///
1124/// The comparison relations must satisfy the following conditions (for all `a`, `b`, `c` of type
1125/// `A`, `B`, `C`):
1126///
1127/// - **Transitivity**: if `A: PartialOrd<B>` and `B: PartialOrd<C>` and `A: PartialOrd<C>`, then `a
1128///   < b` and `b < c` implies `a < c`. The same must hold for both `==` and `>`. This must also
1129///   work for longer chains, such as when `A: PartialOrd<B>`, `B: PartialOrd<C>`, `C:
1130///   PartialOrd<D>`, and `A: PartialOrd<D>` all exist.
1131/// - **Duality**: if `A: PartialOrd<B>` and `B: PartialOrd<A>`, then `a < b` if and only if `b >
1132///   a`.
1133///
1134/// Note that the `B: PartialOrd<A>` (dual) and `A: PartialOrd<C>` (transitive) impls are not forced
1135/// to exist, but these requirements apply whenever they do exist.
1136///
1137/// Violating these requirements is a logic error. The behavior resulting from a logic error is not
1138/// specified, but users of the trait must ensure that such logic errors do *not* result in
1139/// undefined behavior. This means that `unsafe` code **must not** rely on the correctness of these
1140/// methods.
1141///
1142/// ## Cross-crate considerations
1143///
1144/// Upholding the requirements stated above can become tricky when one crate implements `PartialOrd`
1145/// for a type of another crate (i.e., to allow comparing one of its own types with a type from the
1146/// standard library). The recommendation is to never implement this trait for a foreign type. In
1147/// other words, such a crate should do `impl PartialOrd<ForeignType> for LocalType`, but it should
1148/// *not* do `impl PartialOrd<LocalType> for ForeignType`.
1149///
1150/// This avoids the problem of transitive chains that criss-cross crate boundaries: for all local
1151/// types `T`, you may assume that no other crate will add `impl`s that allow comparing `T < U`. In
1152/// other words, if other crates add `impl`s that allow building longer transitive chains `U1 < ...
1153/// < T < V1 < ...`, then all the types that appear to the right of `T` must be types that the crate
1154/// defining `T` already knows about. This rules out transitive chains where downstream crates can
1155/// add new `impl`s that "stitch together" comparisons of foreign types in ways that violate
1156/// transitivity.
1157///
1158/// Not having such foreign `impl`s also avoids forward compatibility issues where one crate adding
1159/// more `PartialOrd` implementations can cause build failures in downstream crates.
1160///
1161/// ## Corollaries
1162///
1163/// The following corollaries follow from the above requirements:
1164///
1165/// - irreflexivity of `<` and `>`: `!(a < a)`, `!(a > a)`
1166/// - transitivity of `>`: if `a > b` and `b > c` then `a > c`
1167/// - duality of `partial_cmp`: `partial_cmp(a, b) == partial_cmp(b, a).map(Ordering::reverse)`
1168///
1169/// ## Strict and non-strict partial orders
1170///
1171/// The `<` and `>` operators behave according to a *strict* partial order. However, `<=` and `>=`
1172/// do **not** behave according to a *non-strict* partial order. That is because mathematically, a
1173/// non-strict partial order would require reflexivity, i.e. `a <= a` would need to be true for
1174/// every `a`. This isn't always the case for types that implement `PartialOrd`, for example:
1175///
1176/// ```
1177/// let a = f64::sqrt(-1.0);
1178/// assert_eq!(a <= a, false);
1179/// ```
1180///
1181/// ## Derivable
1182///
1183/// This trait can be used with `#[derive]`.
1184///
1185/// When `derive`d on structs, it will produce a
1186/// [lexicographic](https://en.wikipedia.org/wiki/Lexicographic_order) ordering based on the
1187/// top-to-bottom declaration order of the struct's members.
1188///
1189/// When `derive`d on enums, variants are primarily ordered by their discriminants. Secondarily,
1190/// they are ordered by their fields. By default, the discriminant is smallest for variants at the
1191/// top, and largest for variants at the bottom. Here's an example:
1192///
1193/// ```
1194/// #[derive(PartialEq, PartialOrd)]
1195/// enum E {
1196///     Top,
1197///     Bottom,
1198/// }
1199///
1200/// assert!(E::Top < E::Bottom);
1201/// ```
1202///
1203/// However, manually setting the discriminants can override this default behavior:
1204///
1205/// ```
1206/// #[derive(PartialEq, PartialOrd)]
1207/// enum E {
1208///     Top = 2,
1209///     Bottom = 1,
1210/// }
1211///
1212/// assert!(E::Bottom < E::Top);
1213/// ```
1214///
1215/// ## How can I implement `PartialOrd`?
1216///
1217/// `PartialOrd` only requires implementation of the [`partial_cmp`] method, with the others
1218/// generated from default implementations.
1219///
1220/// However it remains possible to implement the others separately for types which do not have a
1221/// total order. For example, for floating point numbers, `NaN < 0 == false` and `NaN >= 0 == false`
1222/// (cf. IEEE 754-2008 section 5.11).
1223///
1224/// `PartialOrd` requires your type to be [`PartialEq`].
1225///
1226/// If your type is [`Ord`], you can implement [`partial_cmp`] by using [`cmp`]:
1227///
1228/// ```
1229/// use std::cmp::Ordering;
1230///
1231/// struct Person {
1232///     id: u32,
1233///     name: String,
1234///     height: u32,
1235/// }
1236///
1237/// impl PartialOrd for Person {
1238///     fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1239///         Some(self.cmp(other))
1240///     }
1241/// }
1242///
1243/// impl Ord for Person {
1244///     fn cmp(&self, other: &Self) -> Ordering {
1245///         self.height.cmp(&other.height)
1246///     }
1247/// }
1248///
1249/// impl PartialEq for Person {
1250///     fn eq(&self, other: &Self) -> bool {
1251///         self.height == other.height
1252///     }
1253/// }
1254///
1255/// impl Eq for Person {}
1256/// ```
1257///
1258/// You may also find it useful to use [`partial_cmp`] on your type's fields. Here is an example of
1259/// `Person` types who have a floating-point `height` field that is the only field to be used for
1260/// sorting:
1261///
1262/// ```
1263/// use std::cmp::Ordering;
1264///
1265/// struct Person {
1266///     id: u32,
1267///     name: String,
1268///     height: f64,
1269/// }
1270///
1271/// impl PartialOrd for Person {
1272///     fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1273///         self.height.partial_cmp(&other.height)
1274///     }
1275/// }
1276///
1277/// impl PartialEq for Person {
1278///     fn eq(&self, other: &Self) -> bool {
1279///         self.height == other.height
1280///     }
1281/// }
1282/// ```
1283///
1284/// ## Examples of incorrect `PartialOrd` implementations
1285///
1286/// ```
1287/// use std::cmp::Ordering;
1288///
1289/// #[derive(PartialEq, Debug)]
1290/// struct Character {
1291///     health: u32,
1292///     experience: u32,
1293/// }
1294///
1295/// impl PartialOrd for Character {
1296///     fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1297///         Some(self.health.cmp(&other.health))
1298///     }
1299/// }
1300///
1301/// let a = Character {
1302///     health: 10,
1303///     experience: 5,
1304/// };
1305/// let b = Character {
1306///     health: 10,
1307///     experience: 77,
1308/// };
1309///
1310/// // Mistake: `PartialEq` and `PartialOrd` disagree with each other.
1311///
1312/// assert_eq!(a.partial_cmp(&b).unwrap(), Ordering::Equal); // a == b according to `PartialOrd`.
1313/// assert_ne!(a, b); // a != b according to `PartialEq`.
1314/// ```
1315///
1316/// # Examples
1317///
1318/// ```
1319/// let x: u32 = 0;
1320/// let y: u32 = 1;
1321///
1322/// assert_eq!(x < y, true);
1323/// assert_eq!(x.lt(&y), true);
1324/// ```
1325///
1326/// [`partial_cmp`]: PartialOrd::partial_cmp
1327/// [`cmp`]: Ord::cmp
1328#[lang = "partial_ord"]
1329#[stable(feature = "rust1", since = "1.0.0")]
1330#[doc(alias = ">")]
1331#[doc(alias = "<")]
1332#[doc(alias = "<=")]
1333#[doc(alias = ">=")]
1334#[rustc_on_unimplemented(
1335    message = "can't compare `{Self}` with `{Rhs}`",
1336    label = "no implementation for `{Self} < {Rhs}` and `{Self} > {Rhs}`",
1337    append_const_msg
1338)]
1339#[rustc_diagnostic_item = "PartialOrd"]
1340pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> {
1341    /// This method returns an ordering between `self` and `other` values if one exists.
1342    ///
1343    /// # Examples
1344    ///
1345    /// ```
1346    /// use std::cmp::Ordering;
1347    ///
1348    /// let result = 1.0.partial_cmp(&2.0);
1349    /// assert_eq!(result, Some(Ordering::Less));
1350    ///
1351    /// let result = 1.0.partial_cmp(&1.0);
1352    /// assert_eq!(result, Some(Ordering::Equal));
1353    ///
1354    /// let result = 2.0.partial_cmp(&1.0);
1355    /// assert_eq!(result, Some(Ordering::Greater));
1356    /// ```
1357    ///
1358    /// When comparison is impossible:
1359    ///
1360    /// ```
1361    /// let result = f64::NAN.partial_cmp(&1.0);
1362    /// assert_eq!(result, None);
1363    /// ```
1364    #[must_use]
1365    #[stable(feature = "rust1", since = "1.0.0")]
1366    #[rustc_diagnostic_item = "cmp_partialord_cmp"]
1367    fn partial_cmp(&self, other: &Rhs) -> Option<Ordering>;
1368
1369    /// Tests less than (for `self` and `other`) and is used by the `<` operator.
1370    ///
1371    /// # Examples
1372    ///
1373    /// ```
1374    /// assert_eq!(1.0 < 1.0, false);
1375    /// assert_eq!(1.0 < 2.0, true);
1376    /// assert_eq!(2.0 < 1.0, false);
1377    /// ```
1378    #[inline]
1379    #[must_use]
1380    #[stable(feature = "rust1", since = "1.0.0")]
1381    #[rustc_diagnostic_item = "cmp_partialord_lt"]
1382    fn lt(&self, other: &Rhs) -> bool {
1383        self.partial_cmp(other).is_some_and(Ordering::is_lt)
1384    }
1385
1386    /// Tests less than or equal to (for `self` and `other`) and is used by the
1387    /// `<=` operator.
1388    ///
1389    /// # Examples
1390    ///
1391    /// ```
1392    /// assert_eq!(1.0 <= 1.0, true);
1393    /// assert_eq!(1.0 <= 2.0, true);
1394    /// assert_eq!(2.0 <= 1.0, false);
1395    /// ```
1396    #[inline]
1397    #[must_use]
1398    #[stable(feature = "rust1", since = "1.0.0")]
1399    #[rustc_diagnostic_item = "cmp_partialord_le"]
1400    fn le(&self, other: &Rhs) -> bool {
1401        self.partial_cmp(other).is_some_and(Ordering::is_le)
1402    }
1403
1404    /// Tests greater than (for `self` and `other`) and is used by the `>`
1405    /// operator.
1406    ///
1407    /// # Examples
1408    ///
1409    /// ```
1410    /// assert_eq!(1.0 > 1.0, false);
1411    /// assert_eq!(1.0 > 2.0, false);
1412    /// assert_eq!(2.0 > 1.0, true);
1413    /// ```
1414    #[inline]
1415    #[must_use]
1416    #[stable(feature = "rust1", since = "1.0.0")]
1417    #[rustc_diagnostic_item = "cmp_partialord_gt"]
1418    fn gt(&self, other: &Rhs) -> bool {
1419        self.partial_cmp(other).is_some_and(Ordering::is_gt)
1420    }
1421
1422    /// Tests greater than or equal to (for `self` and `other`) and is used by
1423    /// the `>=` operator.
1424    ///
1425    /// # Examples
1426    ///
1427    /// ```
1428    /// assert_eq!(1.0 >= 1.0, true);
1429    /// assert_eq!(1.0 >= 2.0, false);
1430    /// assert_eq!(2.0 >= 1.0, true);
1431    /// ```
1432    #[inline]
1433    #[must_use]
1434    #[stable(feature = "rust1", since = "1.0.0")]
1435    #[rustc_diagnostic_item = "cmp_partialord_ge"]
1436    fn ge(&self, other: &Rhs) -> bool {
1437        self.partial_cmp(other).is_some_and(Ordering::is_ge)
1438    }
1439
1440    /// If `self == other`, returns `ControlFlow::Continue(())`.
1441    /// Otherwise, returns `ControlFlow::Break(self < other)`.
1442    ///
1443    /// This is useful for chaining together calls when implementing a lexical
1444    /// `PartialOrd::lt`, as it allows types (like primitives) which can cheaply
1445    /// check `==` and `<` separately to do rather than needing to calculate
1446    /// (then optimize out) the three-way `Ordering` result.
1447    #[inline]
1448    #[must_use]
1449    // Added to improve the behaviour of tuples; not necessarily stabilization-track.
1450    #[unstable(feature = "partial_ord_chaining_methods", issue = "none")]
1451    #[doc(hidden)]
1452    fn __chaining_lt(&self, other: &Rhs) -> ControlFlow<bool> {
1453        default_chaining_impl(self, other, Ordering::is_lt)
1454    }
1455
1456    /// Same as `__chaining_lt`, but for `<=` instead of `<`.
1457    #[inline]
1458    #[must_use]
1459    #[unstable(feature = "partial_ord_chaining_methods", issue = "none")]
1460    #[doc(hidden)]
1461    fn __chaining_le(&self, other: &Rhs) -> ControlFlow<bool> {
1462        default_chaining_impl(self, other, Ordering::is_le)
1463    }
1464
1465    /// Same as `__chaining_lt`, but for `>` instead of `<`.
1466    #[inline]
1467    #[must_use]
1468    #[unstable(feature = "partial_ord_chaining_methods", issue = "none")]
1469    #[doc(hidden)]
1470    fn __chaining_gt(&self, other: &Rhs) -> ControlFlow<bool> {
1471        default_chaining_impl(self, other, Ordering::is_gt)
1472    }
1473
1474    /// Same as `__chaining_lt`, but for `>=` instead of `<`.
1475    #[inline]
1476    #[must_use]
1477    #[unstable(feature = "partial_ord_chaining_methods", issue = "none")]
1478    #[doc(hidden)]
1479    fn __chaining_ge(&self, other: &Rhs) -> ControlFlow<bool> {
1480        default_chaining_impl(self, other, Ordering::is_ge)
1481    }
1482}
1483
1484fn default_chaining_impl<T: ?Sized, U: ?Sized>(
1485    lhs: &T,
1486    rhs: &U,
1487    p: impl FnOnce(Ordering) -> bool,
1488) -> ControlFlow<bool>
1489where
1490    T: PartialOrd<U>,
1491{
1492    // It's important that this only call `partial_cmp` once, not call `eq` then
1493    // one of the relational operators.  We don't want to `bcmp`-then-`memcp` a
1494    // `String`, for example, or similarly for other data structures (#108157).
1495    match <T as PartialOrd<U>>::partial_cmp(lhs, rhs) {
1496        Some(Equal) => ControlFlow::Continue(()),
1497        Some(c) => ControlFlow::Break(p(c)),
1498        None => ControlFlow::Break(false),
1499    }
1500}
1501
1502/// Derive macro generating an impl of the trait [`PartialOrd`].
1503/// The behavior of this macro is described in detail [here](PartialOrd#derivable).
1504#[rustc_builtin_macro]
1505#[stable(feature = "builtin_macro_prelude", since = "1.38.0")]
1506#[allow_internal_unstable(core_intrinsics)]
1507pub macro PartialOrd($item:item) {
1508    /* compiler built-in */
1509}
1510
1511/// Compares and returns the minimum of two values.
1512///
1513/// Returns the first argument if the comparison determines them to be equal.
1514///
1515/// Internally uses an alias to [`Ord::min`].
1516///
1517/// # Examples
1518///
1519/// ```
1520/// use std::cmp;
1521///
1522/// assert_eq!(cmp::min(1, 2), 1);
1523/// assert_eq!(cmp::min(2, 2), 2);
1524/// ```
1525/// ```
1526/// use std::cmp::{self, Ordering};
1527///
1528/// #[derive(Eq)]
1529/// struct Equal(&'static str);
1530///
1531/// impl PartialEq for Equal {
1532///     fn eq(&self, other: &Self) -> bool { true }
1533/// }
1534/// impl PartialOrd for Equal {
1535///     fn partial_cmp(&self, other: &Self) -> Option<Ordering> { Some(Ordering::Equal) }
1536/// }
1537/// impl Ord for Equal {
1538///     fn cmp(&self, other: &Self) -> Ordering { Ordering::Equal }
1539/// }
1540///
1541/// assert_eq!(cmp::min(Equal("v1"), Equal("v2")).0, "v1");
1542/// ```
1543#[inline]
1544#[must_use]
1545#[stable(feature = "rust1", since = "1.0.0")]
1546#[rustc_diagnostic_item = "cmp_min"]
1547pub fn min<T: Ord>(v1: T, v2: T) -> T {
1548    v1.min(v2)
1549}
1550
1551/// Returns the minimum of two values with respect to the specified comparison function.
1552///
1553/// Returns the first argument if the comparison determines them to be equal.
1554///
1555/// # Examples
1556///
1557/// ```
1558/// use std::cmp;
1559///
1560/// let abs_cmp = |x: &i32, y: &i32| x.abs().cmp(&y.abs());
1561///
1562/// let result = cmp::min_by(2, -1, abs_cmp);
1563/// assert_eq!(result, -1);
1564///
1565/// let result = cmp::min_by(2, -3, abs_cmp);
1566/// assert_eq!(result, 2);
1567///
1568/// let result = cmp::min_by(1, -1, abs_cmp);
1569/// assert_eq!(result, 1);
1570/// ```
1571#[inline]
1572#[must_use]
1573#[stable(feature = "cmp_min_max_by", since = "1.53.0")]
1574pub fn min_by<T, F: FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T {
1575    if compare(&v2, &v1).is_lt() { v2 } else { v1 }
1576}
1577
1578/// Returns the element that gives the minimum value from the specified function.
1579///
1580/// Returns the first argument if the comparison determines them to be equal.
1581///
1582/// # Examples
1583///
1584/// ```
1585/// use std::cmp;
1586///
1587/// let result = cmp::min_by_key(2, -1, |x: &i32| x.abs());
1588/// assert_eq!(result, -1);
1589///
1590/// let result = cmp::min_by_key(2, -3, |x: &i32| x.abs());
1591/// assert_eq!(result, 2);
1592///
1593/// let result = cmp::min_by_key(1, -1, |x: &i32| x.abs());
1594/// assert_eq!(result, 1);
1595/// ```
1596#[inline]
1597#[must_use]
1598#[stable(feature = "cmp_min_max_by", since = "1.53.0")]
1599pub fn min_by_key<T, F: FnMut(&T) -> K, K: Ord>(v1: T, v2: T, mut f: F) -> T {
1600    if f(&v2) < f(&v1) { v2 } else { v1 }
1601}
1602
1603/// Compares and returns the maximum of two values.
1604///
1605/// Returns the second argument if the comparison determines them to be equal.
1606///
1607/// Internally uses an alias to [`Ord::max`].
1608///
1609/// # Examples
1610///
1611/// ```
1612/// use std::cmp;
1613///
1614/// assert_eq!(cmp::max(1, 2), 2);
1615/// assert_eq!(cmp::max(2, 2), 2);
1616/// ```
1617/// ```
1618/// use std::cmp::{self, Ordering};
1619///
1620/// #[derive(Eq)]
1621/// struct Equal(&'static str);
1622///
1623/// impl PartialEq for Equal {
1624///     fn eq(&self, other: &Self) -> bool { true }
1625/// }
1626/// impl PartialOrd for Equal {
1627///     fn partial_cmp(&self, other: &Self) -> Option<Ordering> { Some(Ordering::Equal) }
1628/// }
1629/// impl Ord for Equal {
1630///     fn cmp(&self, other: &Self) -> Ordering { Ordering::Equal }
1631/// }
1632///
1633/// assert_eq!(cmp::max(Equal("v1"), Equal("v2")).0, "v2");
1634/// ```
1635#[inline]
1636#[must_use]
1637#[stable(feature = "rust1", since = "1.0.0")]
1638#[rustc_diagnostic_item = "cmp_max"]
1639pub fn max<T: Ord>(v1: T, v2: T) -> T {
1640    v1.max(v2)
1641}
1642
1643/// Returns the maximum of two values with respect to the specified comparison function.
1644///
1645/// Returns the second argument if the comparison determines them to be equal.
1646///
1647/// # Examples
1648///
1649/// ```
1650/// use std::cmp;
1651///
1652/// let abs_cmp = |x: &i32, y: &i32| x.abs().cmp(&y.abs());
1653///
1654/// let result = cmp::max_by(3, -2, abs_cmp) ;
1655/// assert_eq!(result, 3);
1656///
1657/// let result = cmp::max_by(1, -2, abs_cmp);
1658/// assert_eq!(result, -2);
1659///
1660/// let result = cmp::max_by(1, -1, abs_cmp);
1661/// assert_eq!(result, -1);
1662/// ```
1663#[inline]
1664#[must_use]
1665#[stable(feature = "cmp_min_max_by", since = "1.53.0")]
1666pub fn max_by<T, F: FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T {
1667    if compare(&v2, &v1).is_lt() { v1 } else { v2 }
1668}
1669
1670/// Returns the element that gives the maximum value from the specified function.
1671///
1672/// Returns the second argument if the comparison determines them to be equal.
1673///
1674/// # Examples
1675///
1676/// ```
1677/// use std::cmp;
1678///
1679/// let result = cmp::max_by_key(3, -2, |x: &i32| x.abs());
1680/// assert_eq!(result, 3);
1681///
1682/// let result = cmp::max_by_key(1, -2, |x: &i32| x.abs());
1683/// assert_eq!(result, -2);
1684///
1685/// let result = cmp::max_by_key(1, -1, |x: &i32| x.abs());
1686/// assert_eq!(result, -1);
1687/// ```
1688#[inline]
1689#[must_use]
1690#[stable(feature = "cmp_min_max_by", since = "1.53.0")]
1691pub fn max_by_key<T, F: FnMut(&T) -> K, K: Ord>(v1: T, v2: T, mut f: F) -> T {
1692    if f(&v2) < f(&v1) { v1 } else { v2 }
1693}
1694
1695/// Compares and sorts two values, returning minimum and maximum.
1696///
1697/// Returns `[v1, v2]` if the comparison determines them to be equal.
1698///
1699/// # Examples
1700///
1701/// ```
1702/// #![feature(cmp_minmax)]
1703/// use std::cmp;
1704///
1705/// assert_eq!(cmp::minmax(1, 2), [1, 2]);
1706/// assert_eq!(cmp::minmax(2, 1), [1, 2]);
1707///
1708/// // You can destructure the result using array patterns
1709/// let [min, max] = cmp::minmax(42, 17);
1710/// assert_eq!(min, 17);
1711/// assert_eq!(max, 42);
1712/// ```
1713/// ```
1714/// #![feature(cmp_minmax)]
1715/// use std::cmp::{self, Ordering};
1716///
1717/// #[derive(Eq)]
1718/// struct Equal(&'static str);
1719///
1720/// impl PartialEq for Equal {
1721///     fn eq(&self, other: &Self) -> bool { true }
1722/// }
1723/// impl PartialOrd for Equal {
1724///     fn partial_cmp(&self, other: &Self) -> Option<Ordering> { Some(Ordering::Equal) }
1725/// }
1726/// impl Ord for Equal {
1727///     fn cmp(&self, other: &Self) -> Ordering { Ordering::Equal }
1728/// }
1729///
1730/// assert_eq!(cmp::minmax(Equal("v1"), Equal("v2")).map(|v| v.0), ["v1", "v2"]);
1731/// ```
1732#[inline]
1733#[must_use]
1734#[unstable(feature = "cmp_minmax", issue = "115939")]
1735pub fn minmax<T>(v1: T, v2: T) -> [T; 2]
1736where
1737    T: Ord,
1738{
1739    if v2 < v1 { [v2, v1] } else { [v1, v2] }
1740}
1741
1742/// Returns minimum and maximum values with respect to the specified comparison function.
1743///
1744/// Returns `[v1, v2]` if the comparison determines them to be equal.
1745///
1746/// # Examples
1747///
1748/// ```
1749/// #![feature(cmp_minmax)]
1750/// use std::cmp;
1751///
1752/// let abs_cmp = |x: &i32, y: &i32| x.abs().cmp(&y.abs());
1753///
1754/// assert_eq!(cmp::minmax_by(-2, 1, abs_cmp), [1, -2]);
1755/// assert_eq!(cmp::minmax_by(-1, 2, abs_cmp), [-1, 2]);
1756/// assert_eq!(cmp::minmax_by(-2, 2, abs_cmp), [-2, 2]);
1757///
1758/// // You can destructure the result using array patterns
1759/// let [min, max] = cmp::minmax_by(-42, 17, abs_cmp);
1760/// assert_eq!(min, 17);
1761/// assert_eq!(max, -42);
1762/// ```
1763#[inline]
1764#[must_use]
1765#[unstable(feature = "cmp_minmax", issue = "115939")]
1766pub fn minmax_by<T, F>(v1: T, v2: T, compare: F) -> [T; 2]
1767where
1768    F: FnOnce(&T, &T) -> Ordering,
1769{
1770    if compare(&v2, &v1).is_lt() { [v2, v1] } else { [v1, v2] }
1771}
1772
1773/// Returns minimum and maximum values with respect to the specified key function.
1774///
1775/// Returns `[v1, v2]` if the comparison determines them to be equal.
1776///
1777/// # Examples
1778///
1779/// ```
1780/// #![feature(cmp_minmax)]
1781/// use std::cmp;
1782///
1783/// assert_eq!(cmp::minmax_by_key(-2, 1, |x: &i32| x.abs()), [1, -2]);
1784/// assert_eq!(cmp::minmax_by_key(-2, 2, |x: &i32| x.abs()), [-2, 2]);
1785///
1786/// // You can destructure the result using array patterns
1787/// let [min, max] = cmp::minmax_by_key(-42, 17, |x: &i32| x.abs());
1788/// assert_eq!(min, 17);
1789/// assert_eq!(max, -42);
1790/// ```
1791#[inline]
1792#[must_use]
1793#[unstable(feature = "cmp_minmax", issue = "115939")]
1794pub fn minmax_by_key<T, F, K>(v1: T, v2: T, mut f: F) -> [T; 2]
1795where
1796    F: FnMut(&T) -> K,
1797    K: Ord,
1798{
1799    if f(&v2) < f(&v1) { [v2, v1] } else { [v1, v2] }
1800}
1801
1802// Implementation of PartialEq, Eq, PartialOrd and Ord for primitive types
1803mod impls {
1804    use crate::cmp::Ordering::{self, Equal, Greater, Less};
1805    use crate::hint::unreachable_unchecked;
1806    use crate::ops::ControlFlow::{self, Break, Continue};
1807
1808    macro_rules! partial_eq_impl {
1809        ($($t:ty)*) => ($(
1810            #[stable(feature = "rust1", since = "1.0.0")]
1811            impl PartialEq for $t {
1812                #[inline]
1813                fn eq(&self, other: &Self) -> bool { *self == *other }
1814                #[inline]
1815                fn ne(&self, other: &Self) -> bool { *self != *other }
1816            }
1817        )*)
1818    }
1819
1820    #[stable(feature = "rust1", since = "1.0.0")]
1821    impl PartialEq for () {
1822        #[inline]
1823        fn eq(&self, _other: &()) -> bool {
1824            true
1825        }
1826        #[inline]
1827        fn ne(&self, _other: &()) -> bool {
1828            false
1829        }
1830    }
1831
1832    partial_eq_impl! {
1833        bool char usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 f16 f32 f64 f128
1834    }
1835
1836    macro_rules! eq_impl {
1837        ($($t:ty)*) => ($(
1838            #[stable(feature = "rust1", since = "1.0.0")]
1839            impl Eq for $t {}
1840        )*)
1841    }
1842
1843    eq_impl! { () bool char usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
1844
1845    #[rustfmt::skip]
1846    macro_rules! partial_ord_methods_primitive_impl {
1847        () => {
1848            #[inline(always)]
1849            fn lt(&self, other: &Self) -> bool { *self <  *other }
1850            #[inline(always)]
1851            fn le(&self, other: &Self) -> bool { *self <= *other }
1852            #[inline(always)]
1853            fn gt(&self, other: &Self) -> bool { *self >  *other }
1854            #[inline(always)]
1855            fn ge(&self, other: &Self) -> bool { *self >= *other }
1856
1857            // These implementations are the same for `Ord` or `PartialOrd` types
1858            // because if either is NAN the `==` test will fail so we end up in
1859            // the `Break` case and the comparison will correctly return `false`.
1860
1861            #[inline]
1862            fn __chaining_lt(&self, other: &Self) -> ControlFlow<bool> {
1863                let (lhs, rhs) = (*self, *other);
1864                if lhs == rhs { Continue(()) } else { Break(lhs < rhs) }
1865            }
1866            #[inline]
1867            fn __chaining_le(&self, other: &Self) -> ControlFlow<bool> {
1868                let (lhs, rhs) = (*self, *other);
1869                if lhs == rhs { Continue(()) } else { Break(lhs <= rhs) }
1870            }
1871            #[inline]
1872            fn __chaining_gt(&self, other: &Self) -> ControlFlow<bool> {
1873                let (lhs, rhs) = (*self, *other);
1874                if lhs == rhs { Continue(()) } else { Break(lhs > rhs) }
1875            }
1876            #[inline]
1877            fn __chaining_ge(&self, other: &Self) -> ControlFlow<bool> {
1878                let (lhs, rhs) = (*self, *other);
1879                if lhs == rhs { Continue(()) } else { Break(lhs >= rhs) }
1880            }
1881        };
1882    }
1883
1884    macro_rules! partial_ord_impl {
1885        ($($t:ty)*) => ($(
1886            #[stable(feature = "rust1", since = "1.0.0")]
1887            impl PartialOrd for $t {
1888                #[inline]
1889                fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1890                    match (*self <= *other, *self >= *other) {
1891                        (false, false) => None,
1892                        (false, true) => Some(Greater),
1893                        (true, false) => Some(Less),
1894                        (true, true) => Some(Equal),
1895                    }
1896                }
1897
1898                partial_ord_methods_primitive_impl!();
1899            }
1900        )*)
1901    }
1902
1903    #[stable(feature = "rust1", since = "1.0.0")]
1904    impl PartialOrd for () {
1905        #[inline]
1906        fn partial_cmp(&self, _: &()) -> Option<Ordering> {
1907            Some(Equal)
1908        }
1909    }
1910
1911    #[stable(feature = "rust1", since = "1.0.0")]
1912    impl PartialOrd for bool {
1913        #[inline]
1914        fn partial_cmp(&self, other: &bool) -> Option<Ordering> {
1915            Some(self.cmp(other))
1916        }
1917
1918        partial_ord_methods_primitive_impl!();
1919    }
1920
1921    partial_ord_impl! { f16 f32 f64 f128 }
1922
1923    macro_rules! ord_impl {
1924        ($($t:ty)*) => ($(
1925            #[stable(feature = "rust1", since = "1.0.0")]
1926            impl PartialOrd for $t {
1927                #[inline]
1928                fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
1929                    Some(crate::intrinsics::three_way_compare(*self, *other))
1930                }
1931
1932                partial_ord_methods_primitive_impl!();
1933            }
1934
1935            #[stable(feature = "rust1", since = "1.0.0")]
1936            impl Ord for $t {
1937                #[inline]
1938                fn cmp(&self, other: &Self) -> Ordering {
1939                    crate::intrinsics::three_way_compare(*self, *other)
1940                }
1941            }
1942        )*)
1943    }
1944
1945    #[stable(feature = "rust1", since = "1.0.0")]
1946    impl Ord for () {
1947        #[inline]
1948        fn cmp(&self, _other: &()) -> Ordering {
1949            Equal
1950        }
1951    }
1952
1953    #[stable(feature = "rust1", since = "1.0.0")]
1954    impl Ord for bool {
1955        #[inline]
1956        fn cmp(&self, other: &bool) -> Ordering {
1957            // Casting to i8's and converting the difference to an Ordering generates
1958            // more optimal assembly.
1959            // See <https://github.com/rust-lang/rust/issues/66780> for more info.
1960            match (*self as i8) - (*other as i8) {
1961                -1 => Less,
1962                0 => Equal,
1963                1 => Greater,
1964                // SAFETY: bool as i8 returns 0 or 1, so the difference can't be anything else
1965                _ => unsafe { unreachable_unchecked() },
1966            }
1967        }
1968
1969        #[inline]
1970        fn min(self, other: bool) -> bool {
1971            self & other
1972        }
1973
1974        #[inline]
1975        fn max(self, other: bool) -> bool {
1976            self | other
1977        }
1978
1979        #[inline]
1980        fn clamp(self, min: bool, max: bool) -> bool {
1981            assert!(min <= max);
1982            self.max(min).min(max)
1983        }
1984    }
1985
1986    ord_impl! { char usize u8 u16 u32 u64 u128 isize i8 i16 i32 i64 i128 }
1987
1988    #[unstable(feature = "never_type", issue = "35121")]
1989    impl PartialEq for ! {
1990        #[inline]
1991        fn eq(&self, _: &!) -> bool {
1992            *self
1993        }
1994    }
1995
1996    #[unstable(feature = "never_type", issue = "35121")]
1997    impl Eq for ! {}
1998
1999    #[unstable(feature = "never_type", issue = "35121")]
2000    impl PartialOrd for ! {
2001        #[inline]
2002        fn partial_cmp(&self, _: &!) -> Option<Ordering> {
2003            *self
2004        }
2005    }
2006
2007    #[unstable(feature = "never_type", issue = "35121")]
2008    impl Ord for ! {
2009        #[inline]
2010        fn cmp(&self, _: &!) -> Ordering {
2011            *self
2012        }
2013    }
2014
2015    // & pointers
2016
2017    #[stable(feature = "rust1", since = "1.0.0")]
2018    impl<A: ?Sized, B: ?Sized> PartialEq<&B> for &A
2019    where
2020        A: PartialEq<B>,
2021    {
2022        #[inline]
2023        fn eq(&self, other: &&B) -> bool {
2024            PartialEq::eq(*self, *other)
2025        }
2026        #[inline]
2027        fn ne(&self, other: &&B) -> bool {
2028            PartialEq::ne(*self, *other)
2029        }
2030    }
2031    #[stable(feature = "rust1", since = "1.0.0")]
2032    impl<A: ?Sized, B: ?Sized> PartialOrd<&B> for &A
2033    where
2034        A: PartialOrd<B>,
2035    {
2036        #[inline]
2037        fn partial_cmp(&self, other: &&B) -> Option<Ordering> {
2038            PartialOrd::partial_cmp(*self, *other)
2039        }
2040        #[inline]
2041        fn lt(&self, other: &&B) -> bool {
2042            PartialOrd::lt(*self, *other)
2043        }
2044        #[inline]
2045        fn le(&self, other: &&B) -> bool {
2046            PartialOrd::le(*self, *other)
2047        }
2048        #[inline]
2049        fn gt(&self, other: &&B) -> bool {
2050            PartialOrd::gt(*self, *other)
2051        }
2052        #[inline]
2053        fn ge(&self, other: &&B) -> bool {
2054            PartialOrd::ge(*self, *other)
2055        }
2056    }
2057    #[stable(feature = "rust1", since = "1.0.0")]
2058    impl<A: ?Sized> Ord for &A
2059    where
2060        A: Ord,
2061    {
2062        #[inline]
2063        fn cmp(&self, other: &Self) -> Ordering {
2064            Ord::cmp(*self, *other)
2065        }
2066    }
2067    #[stable(feature = "rust1", since = "1.0.0")]
2068    impl<A: ?Sized> Eq for &A where A: Eq {}
2069
2070    // &mut pointers
2071
2072    #[stable(feature = "rust1", since = "1.0.0")]
2073    impl<A: ?Sized, B: ?Sized> PartialEq<&mut B> for &mut A
2074    where
2075        A: PartialEq<B>,
2076    {
2077        #[inline]
2078        fn eq(&self, other: &&mut B) -> bool {
2079            PartialEq::eq(*self, *other)
2080        }
2081        #[inline]
2082        fn ne(&self, other: &&mut B) -> bool {
2083            PartialEq::ne(*self, *other)
2084        }
2085    }
2086    #[stable(feature = "rust1", since = "1.0.0")]
2087    impl<A: ?Sized, B: ?Sized> PartialOrd<&mut B> for &mut A
2088    where
2089        A: PartialOrd<B>,
2090    {
2091        #[inline]
2092        fn partial_cmp(&self, other: &&mut B) -> Option<Ordering> {
2093            PartialOrd::partial_cmp(*self, *other)
2094        }
2095        #[inline]
2096        fn lt(&self, other: &&mut B) -> bool {
2097            PartialOrd::lt(*self, *other)
2098        }
2099        #[inline]
2100        fn le(&self, other: &&mut B) -> bool {
2101            PartialOrd::le(*self, *other)
2102        }
2103        #[inline]
2104        fn gt(&self, other: &&mut B) -> bool {
2105            PartialOrd::gt(*self, *other)
2106        }
2107        #[inline]
2108        fn ge(&self, other: &&mut B) -> bool {
2109            PartialOrd::ge(*self, *other)
2110        }
2111    }
2112    #[stable(feature = "rust1", since = "1.0.0")]
2113    impl<A: ?Sized> Ord for &mut A
2114    where
2115        A: Ord,
2116    {
2117        #[inline]
2118        fn cmp(&self, other: &Self) -> Ordering {
2119            Ord::cmp(*self, *other)
2120        }
2121    }
2122    #[stable(feature = "rust1", since = "1.0.0")]
2123    impl<A: ?Sized> Eq for &mut A where A: Eq {}
2124
2125    #[stable(feature = "rust1", since = "1.0.0")]
2126    impl<A: ?Sized, B: ?Sized> PartialEq<&mut B> for &A
2127    where
2128        A: PartialEq<B>,
2129    {
2130        #[inline]
2131        fn eq(&self, other: &&mut B) -> bool {
2132            PartialEq::eq(*self, *other)
2133        }
2134        #[inline]
2135        fn ne(&self, other: &&mut B) -> bool {
2136            PartialEq::ne(*self, *other)
2137        }
2138    }
2139
2140    #[stable(feature = "rust1", since = "1.0.0")]
2141    impl<A: ?Sized, B: ?Sized> PartialEq<&B> for &mut A
2142    where
2143        A: PartialEq<B>,
2144    {
2145        #[inline]
2146        fn eq(&self, other: &&B) -> bool {
2147            PartialEq::eq(*self, *other)
2148        }
2149        #[inline]
2150        fn ne(&self, other: &&B) -> bool {
2151            PartialEq::ne(*self, *other)
2152        }
2153    }
2154}