From e8dce19146fb3e3fa1ec3cd3918fcade2781e49f Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Sat, 17 Aug 2019 16:45:04 +0900 Subject: [PATCH 1/6] Add clamp_{lower,upper} --- src/lib.rs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 172e714..010ccf1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -371,17 +371,55 @@ pub fn clamp(input: T, min: T, max: T) -> T { } } +/// A value bounded by a minimum value +/// +/// If input is less than min then this returns min. +/// Otherwise this returns input. +/// Preserves `NaN` different from `min`. +#[inline] +pub fn clamp_lower(input: T, min: T) -> T { + if input < min { + min + } else { + input + } +} + +/// A value bounded by a maximum value +/// +/// If input is less than min then this returns min. +/// Otherwise this returns input. +/// Preserves `NaN` different from `max`. +#[inline] +pub fn clamp_upper(input: T, max: T) -> T { + if input > max { + max + } else { + input + } +} + #[test] fn clamp_test() { // Int test assert_eq!(1, clamp(1, -1, 2)); assert_eq!(-1, clamp(-2, -1, 2)); assert_eq!(2, clamp(3, -1, 2)); + assert_eq!(1, clamp_lower(1, -1)); + assert_eq!(-1, clamp_lower(-2, -1)); + assert_eq!(-1, clamp_upper(1, -1)); + assert_eq!(-2, clamp_upper(-2, -1)); // Float test assert_eq!(1.0, clamp(1.0, -1.0, 2.0)); assert_eq!(-1.0, clamp(-2.0, -1.0, 2.0)); assert_eq!(2.0, clamp(3.0, -1.0, 2.0)); + assert_eq!(1.0, clamp_lower(1.0, -1.0)); + assert_eq!(-1.0, clamp_lower(-2.0, -1.0)); + assert_eq!(-1.0, clamp_upper(1.0, -1.0)); + assert_eq!(-2.0, clamp_upper(-2.0, -1.0)); + assert!(clamp_lower(std::f32::NAN, 1.0).is_nan()); + assert!(clamp_upper(std::f32::NAN, 1.0).is_nan()); } #[test] From f20d74fce84facc1a710dab118edbbe0eb22e5da Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Sat, 17 Aug 2019 17:58:02 +0900 Subject: [PATCH 2/6] Use core::f32 instead of std::f32 --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 010ccf1..075a729 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -418,8 +418,8 @@ fn clamp_test() { assert_eq!(-1.0, clamp_lower(-2.0, -1.0)); assert_eq!(-1.0, clamp_upper(1.0, -1.0)); assert_eq!(-2.0, clamp_upper(-2.0, -1.0)); - assert!(clamp_lower(std::f32::NAN, 1.0).is_nan()); - assert!(clamp_upper(std::f32::NAN, 1.0).is_nan()); + assert!(clamp_lower(::core::f32::NAN, 1.0).is_nan()); + assert!(clamp_upper(::core::f32::NAN, 1.0).is_nan()); } #[test] From 2fb8a6e8a9802d22c86a84bbc33d7dc07351ef9b Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Sat, 31 Aug 2019 15:14:49 +0900 Subject: [PATCH 3/6] Add NaN preserving test for clamp --- src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib.rs b/src/lib.rs index 075a729..8e2ce60 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -418,6 +418,7 @@ fn clamp_test() { assert_eq!(-1.0, clamp_lower(-2.0, -1.0)); assert_eq!(-1.0, clamp_upper(1.0, -1.0)); assert_eq!(-2.0, clamp_upper(-2.0, -1.0)); + assert!(clamp(::core::f32::NAN, -1.0, 1.0).is_nan()); assert!(clamp_lower(::core::f32::NAN, 1.0).is_nan()); assert!(clamp_upper(::core::f32::NAN, 1.0).is_nan()); } From e7ba9b62dc4b26766ba5d6249f39a67e6dc84cb5 Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Sat, 31 Aug 2019 15:31:30 +0900 Subject: [PATCH 4/6] Replace lower/upper to min/max --- src/lib.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 8e2ce60..12335ee 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -377,7 +377,7 @@ pub fn clamp(input: T, min: T, max: T) -> T { /// Otherwise this returns input. /// Preserves `NaN` different from `min`. #[inline] -pub fn clamp_lower(input: T, min: T) -> T { +pub fn clamp_min(input: T, min: T) -> T { if input < min { min } else { @@ -391,7 +391,7 @@ pub fn clamp_lower(input: T, min: T) -> T { /// Otherwise this returns input. /// Preserves `NaN` different from `max`. #[inline] -pub fn clamp_upper(input: T, max: T) -> T { +pub fn clamp_max(input: T, max: T) -> T { if input > max { max } else { @@ -405,22 +405,22 @@ fn clamp_test() { assert_eq!(1, clamp(1, -1, 2)); assert_eq!(-1, clamp(-2, -1, 2)); assert_eq!(2, clamp(3, -1, 2)); - assert_eq!(1, clamp_lower(1, -1)); - assert_eq!(-1, clamp_lower(-2, -1)); - assert_eq!(-1, clamp_upper(1, -1)); - assert_eq!(-2, clamp_upper(-2, -1)); + assert_eq!(1, clamp_min(1, -1)); + assert_eq!(-1, clamp_min(-2, -1)); + assert_eq!(-1, clamp_max(1, -1)); + assert_eq!(-2, clamp_max(-2, -1)); // Float test assert_eq!(1.0, clamp(1.0, -1.0, 2.0)); assert_eq!(-1.0, clamp(-2.0, -1.0, 2.0)); assert_eq!(2.0, clamp(3.0, -1.0, 2.0)); - assert_eq!(1.0, clamp_lower(1.0, -1.0)); - assert_eq!(-1.0, clamp_lower(-2.0, -1.0)); - assert_eq!(-1.0, clamp_upper(1.0, -1.0)); - assert_eq!(-2.0, clamp_upper(-2.0, -1.0)); + assert_eq!(1.0, clamp_min(1.0, -1.0)); + assert_eq!(-1.0, clamp_min(-2.0, -1.0)); + assert_eq!(-1.0, clamp_max(1.0, -1.0)); + assert_eq!(-2.0, clamp_max(-2.0, -1.0)); assert!(clamp(::core::f32::NAN, -1.0, 1.0).is_nan()); - assert!(clamp_lower(::core::f32::NAN, 1.0).is_nan()); - assert!(clamp_upper(::core::f32::NAN, 1.0).is_nan()); + assert!(clamp_min(::core::f32::NAN, 1.0).is_nan()); + assert!(clamp_max(::core::f32::NAN, 1.0).is_nan()); } #[test] From 973ba72e4f81a0999181b5134c80a38ed14532ed Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Sat, 31 Aug 2019 15:34:40 +0900 Subject: [PATCH 5/6] Fix doc comment --- src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 12335ee..2215a60 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -375,7 +375,7 @@ pub fn clamp(input: T, min: T, max: T) -> T { /// /// If input is less than min then this returns min. /// Otherwise this returns input. -/// Preserves `NaN` different from `min`. +/// `clamp_min(std::f32::NAN, 1.0)` preserves `NAN` different from `f32::min(std::f32::NAN, 1.0)`. #[inline] pub fn clamp_min(input: T, min: T) -> T { if input < min { @@ -389,7 +389,7 @@ pub fn clamp_min(input: T, min: T) -> T { /// /// If input is less than min then this returns min. /// Otherwise this returns input. -/// Preserves `NaN` different from `max`. +/// `clamp_max(std::f32::NAN, 1.0)` preserves `NAN` different from `f32::max(std::f32::NAN, 1.0)`. #[inline] pub fn clamp_max(input: T, max: T) -> T { if input > max { From 0e7c2a4a004186eed3abdd491c925c0d9d09962e Mon Sep 17 00:00:00 2001 From: Toshiki Teramura Date: Sat, 14 Sep 2019 15:59:10 +0900 Subject: [PATCH 6/6] s/less/greater/g --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 2215a60..da6bb2f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -387,7 +387,7 @@ pub fn clamp_min(input: T, min: T) -> T { /// A value bounded by a maximum value /// -/// If input is less than min then this returns min. +/// If input is greater than max then this returns max. /// Otherwise this returns input. /// `clamp_max(std::f32::NAN, 1.0)` preserves `NAN` different from `f32::max(std::f32::NAN, 1.0)`. #[inline]