Rollup merge of #139357 - miried:master, r=Amanieu
Fix parameter order for `_by()` variants of `min` / `max`/ `minmax` in `std::cmp` We saw a regression introduced in version `1.86` that seems to be coming from switching the order of `v1` and `v2` when calling `comparison` functions in `min_by` / `max_by` / `minmax_by` (cf. this PR: https://github.com/rust-lang/rust/pull/136307) When the `compare` function is not symmetric in the arguments, this leads to false results. Apparently, the test cases do not cover this scenario currently. While asymmetric comparison may be an edge case, but current behavior is unexpected nevertheless.
This commit is contained in:
commit
a6d648fe79
1 changed files with 12 additions and 3 deletions
|
|
@ -1554,6 +1554,9 @@ pub fn min<T: Ord>(v1: T, v2: T) -> T {
|
|||
///
|
||||
/// Returns the first argument if the comparison determines them to be equal.
|
||||
///
|
||||
/// The parameter order is preserved when calling the `compare` function, i.e. `v1` is
|
||||
/// always passed as the first argument and `v2` as the second.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
|
|
@ -1574,7 +1577,7 @@ pub fn min<T: Ord>(v1: T, v2: T) -> T {
|
|||
#[must_use]
|
||||
#[stable(feature = "cmp_min_max_by", since = "1.53.0")]
|
||||
pub fn min_by<T, F: FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T {
|
||||
if compare(&v2, &v1).is_lt() { v2 } else { v1 }
|
||||
if compare(&v1, &v2).is_le() { v1 } else { v2 }
|
||||
}
|
||||
|
||||
/// Returns the element that gives the minimum value from the specified function.
|
||||
|
|
@ -1646,6 +1649,9 @@ pub fn max<T: Ord>(v1: T, v2: T) -> T {
|
|||
///
|
||||
/// Returns the second argument if the comparison determines them to be equal.
|
||||
///
|
||||
/// The parameter order is preserved when calling the `compare` function, i.e. `v1` is
|
||||
/// always passed as the first argument and `v2` as the second.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
|
|
@ -1666,7 +1672,7 @@ pub fn max<T: Ord>(v1: T, v2: T) -> T {
|
|||
#[must_use]
|
||||
#[stable(feature = "cmp_min_max_by", since = "1.53.0")]
|
||||
pub fn max_by<T, F: FnOnce(&T, &T) -> Ordering>(v1: T, v2: T, compare: F) -> T {
|
||||
if compare(&v2, &v1).is_lt() { v1 } else { v2 }
|
||||
if compare(&v1, &v2).is_gt() { v1 } else { v2 }
|
||||
}
|
||||
|
||||
/// Returns the element that gives the maximum value from the specified function.
|
||||
|
|
@ -1745,6 +1751,9 @@ where
|
|||
///
|
||||
/// Returns `[v1, v2]` if the comparison determines them to be equal.
|
||||
///
|
||||
/// The parameter order is preserved when calling the `compare` function, i.e. `v1` is
|
||||
/// always passed as the first argument and `v2` as the second.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
|
|
@ -1769,7 +1778,7 @@ pub fn minmax_by<T, F>(v1: T, v2: T, compare: F) -> [T; 2]
|
|||
where
|
||||
F: FnOnce(&T, &T) -> Ordering,
|
||||
{
|
||||
if compare(&v2, &v1).is_lt() { [v2, v1] } else { [v1, v2] }
|
||||
if compare(&v1, &v2).is_le() { [v1, v2] } else { [v2, v1] }
|
||||
}
|
||||
|
||||
/// Returns minimum and maximum values with respect to the specified key function.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue