Skip to content

Commit

Permalink
Rollup merge of rust-lang#42496 - Razaekel:feature/integer_max-min, r…
Browse files Browse the repository at this point in the history
…=BurntSushi

Add max and min to Ord

Pursuant to issue rust-lang#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 rust-lang#25663
  • Loading branch information
frewsxcv authored Jun 13, 2017
2 parents 78d5d37 + a32ffc6 commit 7463cf5
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 2 deletions.
1 change: 1 addition & 0 deletions src/doc/unstable-book/src/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@
- [n16](library-features/n16.md)
- [never_type_impls](library-features/never-type-impls.md)
- [nonzero](library-features/nonzero.md)
- [ord_max_min](library-features/ord-max-min.md)
- [offset_to](library-features/offset-to.md)
- [once_poison](library-features/once-poison.md)
- [oom](library-features/oom.md)
Expand Down
7 changes: 7 additions & 0 deletions src/doc/unstable-book/src/library-features/ord-max-min.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# `ord-max-min`

The tracking issue for this feature is: [#25663]

[#25663]: https://github.com/rust-lang/rust/issues/25663

------------------------
44 changes: 42 additions & 2 deletions src/libcore/cmp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,42 @@ pub trait Ord: Eq + PartialOrd<Self> {
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
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")]
Expand Down Expand Up @@ -678,6 +714,8 @@ pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> {
///
/// Returns the first argument if the comparison determines them to be equal.
///
/// Internally uses an alias to `Ord::min`.
///
/// # Examples
///
/// ```
Expand All @@ -689,13 +727,15 @@ pub trait PartialOrd<Rhs: ?Sized = Self>: PartialEq<Rhs> {
#[inline]
#[stable(feature = "rust1", since = "1.0.0")]
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.
///
/// Returns the second argument if the comparison determines them to be equal.
///
/// Internally uses an alias to `Ord::max`.
///
/// # Examples
///
/// ```
Expand All @@ -707,7 +747,7 @@ pub fn min<T: Ord>(v1: T, v2: T) -> T {
#[inline]
#[stable(feature = "rust1", since = "1.0.0")]
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
Expand Down
10 changes: 10 additions & 0 deletions src/libcore/tests/cmp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,16 @@ fn test_mut_int_totalord() {
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]
fn test_ordering_reverse() {
assert_eq!(Less.reverse(), Greater);
Expand Down
1 change: 1 addition & 0 deletions src/libcore/tests/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#![feature(iter_rfind)]
#![feature(libc)]
#![feature(nonzero)]
#![feature(ord_max_min)]
#![feature(rand)]
#![feature(raw)]
#![feature(sip_hash_13)]
Expand Down

0 comments on commit 7463cf5

Please sign in to comment.