Feature gate: #![feature(clamp_to)], as well as possibly perma-unstable #[feature(clamp_bounds)].
This is a tracking issue for rust-lang/libs-team#665, which adds less confusable alternatives for x.min(y) and x.max(y).
Public API
// Perma-unstable
trait ClampBounds<T> {
fn clamp(self, x: T) -> T;
}
impl ClampBounds<T> for RangeInclusive<T> where T: Ord {}
impl ClampBounds<f32> for RangeInclusive<f32> {}
// likewise for RangeFrom, RangeToInclusive, and RangeFull, and for f16/f64/f128
trait Ord {
fn clamp_to(self, range: impl ClampBounds<Self>) -> Self;
}
// For each floating-point type:
impl f32 {
fn clamp_to(self, range: impl ClampBounds<Self>) -> Self;
}
Steps / History
(Remember to update the S-tracking-* label when checking boxes.)
Unresolved Questions
Is having these functions, where clamp_min == max, actually less confusing than the status quo?
- It is not. Switched to
clamp_to with ranges.
- Should there be a lint that suggests replacing
x.max(y) with x.clamp_to(y..)?
- What semantics should the float versions have regarding NaN?
NAN.max(0.0) is 0, while NAN.clamp(0.0, 0.0) is NaN, and 0.0.clamp(NAN, NAN) panics.
Feature gate:
#![feature(clamp_to)], as well as possibly perma-unstable#[feature(clamp_bounds)].This is a tracking issue for rust-lang/libs-team#665, which adds less confusable alternatives for
x.min(y)andx.max(y).Public API
Steps / History
(Remember to update the
S-tracking-*label when checking boxes.).min()and.max()libs-team#665Unresolved Questions
Is having these functions, where clamp_min == max, actually less confusing than the status quo?clamp_towith ranges.x.max(y)withx.clamp_to(y..)?NAN.max(0.0)is 0, whileNAN.clamp(0.0, 0.0)is NaN, and0.0.clamp(NAN, NAN)panics.Footnotes
https://std-dev-guide.rust-lang.org/feature-lifecycle/stabilization.html ↩