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}
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy