Rollup merge of #42496 - Razaekel:feature/integer_max-min, r=BurntSushi
Add max and min to Ord Pursuant to issue #25663, this PR adds max and min methods with default implementations to std::cmp::Ord. It also modifies std::cmp::max|min to internally alias to Ord::max|min, so that any overrides of the default implementations are automatically used by std::cmp::max|min. Closes #25663
This commit is contained in:
commit
7463cf5faf
@ -165,6 +165,7 @@
|
|||||||
- [n16](library-features/n16.md)
|
- [n16](library-features/n16.md)
|
||||||
- [never_type_impls](library-features/never-type-impls.md)
|
- [never_type_impls](library-features/never-type-impls.md)
|
||||||
- [nonzero](library-features/nonzero.md)
|
- [nonzero](library-features/nonzero.md)
|
||||||
|
- [ord_max_min](library-features/ord-max-min.md)
|
||||||
- [offset_to](library-features/offset-to.md)
|
- [offset_to](library-features/offset-to.md)
|
||||||
- [once_poison](library-features/once-poison.md)
|
- [once_poison](library-features/once-poison.md)
|
||||||
- [oom](library-features/oom.md)
|
- [oom](library-features/oom.md)
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
# `ord-max-min`
|
||||||
|
|
||||||
|
The tracking issue for this feature is: [#25663]
|
||||||
|
|
||||||
|
[#25663]: https://github.com/rust-lang/rust/issues/25663
|
||||||
|
|
||||||
|
------------------------
|
@ -443,6 +443,42 @@ pub trait Ord: Eq + PartialOrd<Self> {
|
|||||||
/// ```
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
fn cmp(&self, other: &Self) -> Ordering;
|
fn cmp(&self, other: &Self) -> Ordering;
|
||||||
|
|
||||||
|
/// Compares and returns the maximum of two values.
|
||||||
|
///
|
||||||
|
/// Returns the second argument if the comparison determines them to be equal.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #![feature(ord_max_min)]
|
||||||
|
///
|
||||||
|
/// assert_eq!(2, 1.max(2));
|
||||||
|
/// assert_eq!(2, 2.max(2));
|
||||||
|
/// ```
|
||||||
|
#[unstable(feature = "ord_max_min", issue = "25663")]
|
||||||
|
fn max(self, other: Self) -> Self
|
||||||
|
where Self: Sized {
|
||||||
|
if other >= self { other } else { self }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Compares and returns the minimum of two values.
|
||||||
|
///
|
||||||
|
/// Returns the first argument if the comparison determines them to be equal.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #![feature(ord_max_min)]
|
||||||
|
///
|
||||||
|
/// assert_eq!(1, 1.min(2));
|
||||||
|
/// assert_eq!(2, 2.min(2));
|
||||||
|
/// ```
|
||||||
|
#[unstable(feature = "ord_max_min", issue = "25663")]
|
||||||
|
fn min(self, other: Self) -> Self
|
||||||
|
where Self: Sized {
|
||||||
|
if self <= other { self } else { other }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
@ -678,6 +714,8 @@ pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> {
|
|||||||
///
|
///
|
||||||
/// Returns the first argument if the comparison determines them to be equal.
|
/// Returns the first argument if the comparison determines them to be equal.
|
||||||
///
|
///
|
||||||
|
/// Internally uses an alias to `Ord::min`.
|
||||||
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
@ -689,13 +727,15 @@ pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> {
|
|||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
pub fn min<T: Ord>(v1: T, v2: T) -> T {
|
pub fn min<T: Ord>(v1: T, v2: T) -> T {
|
||||||
if v1 <= v2 { v1 } else { v2 }
|
v1.min(v2)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Compares and returns the maximum of two values.
|
/// Compares and returns the maximum of two values.
|
||||||
///
|
///
|
||||||
/// Returns the second argument if the comparison determines them to be equal.
|
/// Returns the second argument if the comparison determines them to be equal.
|
||||||
///
|
///
|
||||||
|
/// Internally uses an alias to `Ord::max`.
|
||||||
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
@ -707,7 +747,7 @@ pub fn min<T: Ord>(v1: T, v2: T) -> T {
|
|||||||
#[inline]
|
#[inline]
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
pub fn max<T: Ord>(v1: T, v2: T) -> T {
|
pub fn max<T: Ord>(v1: T, v2: T) -> T {
|
||||||
if v2 >= v1 { v2 } else { v1 }
|
v1.max(v2)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Implementation of PartialEq, Eq, PartialOrd and Ord for primitive types
|
// Implementation of PartialEq, Eq, PartialOrd and Ord for primitive types
|
||||||
|
@ -28,6 +28,16 @@ fn test_mut_int_totalord() {
|
|||||||
assert_eq!((&mut 12).cmp(&&mut -5), Greater);
|
assert_eq!((&mut 12).cmp(&&mut -5), Greater);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_ord_max_min() {
|
||||||
|
assert_eq!(1.max(2), 2);
|
||||||
|
assert_eq!(2.max(1), 2);
|
||||||
|
assert_eq!(1.min(2), 1);
|
||||||
|
assert_eq!(2.min(1), 1);
|
||||||
|
assert_eq!(1.max(1), 1);
|
||||||
|
assert_eq!(1.min(1), 1);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_ordering_reverse() {
|
fn test_ordering_reverse() {
|
||||||
assert_eq!(Less.reverse(), Greater);
|
assert_eq!(Less.reverse(), Greater);
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#![feature(iter_rfind)]
|
#![feature(iter_rfind)]
|
||||||
#![feature(libc)]
|
#![feature(libc)]
|
||||||
#![feature(nonzero)]
|
#![feature(nonzero)]
|
||||||
|
#![feature(ord_max_min)]
|
||||||
#![feature(rand)]
|
#![feature(rand)]
|
||||||
#![feature(raw)]
|
#![feature(raw)]
|
||||||
#![feature(sip_hash_13)]
|
#![feature(sip_hash_13)]
|
||||||
|
Loading…
Reference in New Issue
Block a user