Auto merge of #93397 - joshtriplett:sort-floats, r=Amanieu
Add `[f32]::sort_floats` and `[f64]::sort_floats` It's inconvenient to sort a slice or Vec of floats, compared to sorting integers. To simplify numeric code, add a convenience method to `[f32]` and `[f64]` to sort them using `sort_unstable_by` with `total_cmp`.
This commit is contained in:
commit
ed793d86da
1 changed files with 60 additions and 0 deletions
|
@ -4101,6 +4101,66 @@ impl<T, const N: usize> [[T; N]] {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(not(bootstrap))]
|
||||||
|
#[cfg(not(test))]
|
||||||
|
impl [f32] {
|
||||||
|
/// Sorts the slice of floats.
|
||||||
|
///
|
||||||
|
/// This sort is in-place (i.e. does not allocate), *O*(*n* \* log(*n*)) worst-case, and uses
|
||||||
|
/// the ordering defined by [`f32::total_cmp`].
|
||||||
|
///
|
||||||
|
/// # Current implementation
|
||||||
|
///
|
||||||
|
/// This uses the same sorting algorithm as [`sort_unstable_by`](slice::sort_unstable_by).
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #![feature(sort_floats)]
|
||||||
|
/// let mut v = [2.6, -5e-8, f32::NAN, 8.29, f32::INFINITY, -1.0, 0.0, -f32::INFINITY, -0.0];
|
||||||
|
///
|
||||||
|
/// v.sort_floats();
|
||||||
|
/// let sorted = [-f32::INFINITY, -1.0, -5e-8, -0.0, 0.0, 2.6, 8.29, f32::INFINITY, f32::NAN];
|
||||||
|
/// assert_eq!(&v[..8], &sorted[..8]);
|
||||||
|
/// assert!(v[8].is_nan());
|
||||||
|
/// ```
|
||||||
|
#[unstable(feature = "sort_floats", issue = "93396")]
|
||||||
|
#[inline]
|
||||||
|
pub fn sort_floats(&mut self) {
|
||||||
|
self.sort_unstable_by(f32::total_cmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(bootstrap))]
|
||||||
|
#[cfg(not(test))]
|
||||||
|
impl [f64] {
|
||||||
|
/// Sorts the slice of floats.
|
||||||
|
///
|
||||||
|
/// This sort is in-place (i.e. does not allocate), *O*(*n* \* log(*n*)) worst-case, and uses
|
||||||
|
/// the ordering defined by [`f64::total_cmp`].
|
||||||
|
///
|
||||||
|
/// # Current implementation
|
||||||
|
///
|
||||||
|
/// This uses the same sorting algorithm as [`sort_unstable_by`](slice::sort_unstable_by).
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// #![feature(sort_floats)]
|
||||||
|
/// let mut v = [2.6, -5e-8, f64::NAN, 8.29, f64::INFINITY, -1.0, 0.0, -f64::INFINITY, -0.0];
|
||||||
|
///
|
||||||
|
/// v.sort_floats();
|
||||||
|
/// let sorted = [-f64::INFINITY, -1.0, -5e-8, -0.0, 0.0, 2.6, 8.29, f64::INFINITY, f64::NAN];
|
||||||
|
/// assert_eq!(&v[..8], &sorted[..8]);
|
||||||
|
/// assert!(v[8].is_nan());
|
||||||
|
/// ```
|
||||||
|
#[unstable(feature = "sort_floats", issue = "93396")]
|
||||||
|
#[inline]
|
||||||
|
pub fn sort_floats(&mut self) {
|
||||||
|
self.sort_unstable_by(f64::total_cmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
trait CloneFromSpec<T> {
|
trait CloneFromSpec<T> {
|
||||||
fn spec_clone_from(&mut self, src: &[T]);
|
fn spec_clone_from(&mut self, src: &[T]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue