Skip to content

Commit 69177df

Browse files
committed
Implement more numeric traits for OrderedFloat
`OrderedFloat<T>` now implements: * `Float` * `Num` * `NumCast` * `FromPrimitive` * `ToPrimitive` * `Add<T>` * `Sub<T>` * `Mul<T>` * `Div<T>` * `Rem<T>` * `Rem<Self>` * `One` Trait bounds on some existing trait impls for `OrderedFloat<T>` have been relaxed. Fixes #73.
1 parent 923c571 commit 69177df

File tree

2 files changed

+175
-19
lines changed

2 files changed

+175
-19
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "ordered-float"
3-
version = "2.0.1"
3+
version = "2.1.0"
44
authors = ["Jonathan Reem <jonathan.reem@gmail.com>", "Matt Brubeck <mbrubeck@limpet.net>"]
55
license = "MIT"
66
description = "Wrappers for total ordering on floats"

src/lib.rs

Lines changed: 174 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -173,39 +173,87 @@ impl<T: Float> DerefMut for OrderedFloat<T> {
173173

174174
impl<T: Float> Eq for OrderedFloat<T> {}
175175

176-
impl<T: Float> Add for OrderedFloat<T> {
177-
type Output = Self;
176+
impl<T: Add> Add for OrderedFloat<T> {
177+
type Output = OrderedFloat<T::Output>;
178178

179-
fn add(self, other: Self) -> Self {
179+
fn add(self, other: Self) -> Self::Output {
180180
OrderedFloat(self.0 + other.0)
181181
}
182182
}
183183

184-
impl<T: Float> Sub for OrderedFloat<T> {
185-
type Output = Self;
184+
impl<T: Add> Add<T> for OrderedFloat<T> {
185+
type Output = OrderedFloat<T::Output>;
186186

187-
fn sub(self, other: Self) -> Self {
187+
fn add(self, other: T) -> Self::Output {
188+
OrderedFloat(self.0 + other)
189+
}
190+
}
191+
192+
impl<T: Sub> Sub for OrderedFloat<T> {
193+
type Output = OrderedFloat<T::Output>;
194+
195+
fn sub(self, other: Self) -> Self::Output {
188196
OrderedFloat(self.0 - other.0)
189197
}
190198
}
191199

192-
impl<T: Float> Mul for OrderedFloat<T> {
193-
type Output = Self;
200+
impl<T: Sub> Sub<T> for OrderedFloat<T> {
201+
type Output = OrderedFloat<T::Output>;
194202

195-
fn mul(self, other: Self) -> Self {
203+
fn sub(self, other: T) -> Self::Output {
204+
OrderedFloat(self.0 - other)
205+
}
206+
}
207+
208+
impl<T: Mul> Mul for OrderedFloat<T> {
209+
type Output = OrderedFloat<T::Output>;
210+
211+
fn mul(self, other: Self) -> Self::Output {
196212
OrderedFloat(self.0 * other.0)
197213
}
198214
}
199215

200-
impl<T: Float> Div for OrderedFloat<T> {
201-
type Output = Self;
216+
impl<T: Mul> Mul<T> for OrderedFloat<T> {
217+
type Output = OrderedFloat<T::Output>;
202218

203-
fn div(self, other: Self) -> Self {
219+
fn mul(self, other: T) -> Self::Output {
220+
OrderedFloat(self.0 * other)
221+
}
222+
}
223+
224+
impl<T: Div> Div for OrderedFloat<T> {
225+
type Output = OrderedFloat<T::Output>;
226+
227+
fn div(self, other: Self) -> Self::Output {
204228
OrderedFloat(self.0 / other.0)
205229
}
206230
}
207231

208-
impl<T: Float> Bounded for OrderedFloat<T> {
232+
impl<T: Div> Div<T> for OrderedFloat<T> {
233+
type Output = OrderedFloat<T::Output>;
234+
235+
fn div(self, other: T) -> Self::Output {
236+
OrderedFloat(self.0 / other)
237+
}
238+
}
239+
240+
impl<T: Rem> Rem for OrderedFloat<T> {
241+
type Output = OrderedFloat<T::Output>;
242+
243+
fn rem(self, other: Self) -> Self::Output {
244+
OrderedFloat(self.0 % other.0)
245+
}
246+
}
247+
248+
impl<T: Rem> Rem<T> for OrderedFloat<T> {
249+
type Output = OrderedFloat<T::Output>;
250+
251+
fn rem(self, other: T) -> Self::Output {
252+
OrderedFloat(self.0 % other)
253+
}
254+
}
255+
256+
impl<T: Bounded> Bounded for OrderedFloat<T> {
209257
fn min_value() -> Self {
210258
OrderedFloat(T::min_value())
211259
}
@@ -215,7 +263,7 @@ impl<T: Float> Bounded for OrderedFloat<T> {
215263
}
216264
}
217265

218-
impl<T: Float + FromStr> FromStr for OrderedFloat<T> {
266+
impl<T: FromStr> FromStr for OrderedFloat<T> {
219267
type Err = T::Err;
220268

221269
/// Convert a &str to `OrderedFloat`. Returns an error if the string fails to parse.
@@ -232,20 +280,128 @@ impl<T: Float + FromStr> FromStr for OrderedFloat<T> {
232280
}
233281
}
234282

235-
impl<T: Float> Neg for OrderedFloat<T> {
236-
type Output = Self;
283+
impl<T: Neg> Neg for OrderedFloat<T> {
284+
type Output = OrderedFloat<T::Output>;
237285

238-
fn neg(self) -> Self {
286+
fn neg(self) -> Self::Output {
239287
OrderedFloat(-self.0)
240288
}
241289
}
242290

243-
impl<T: Float> Zero for OrderedFloat<T> {
291+
impl<T: Zero> Zero for OrderedFloat<T> {
244292
fn zero() -> Self { OrderedFloat(T::zero()) }
245293

246294
fn is_zero(&self) -> bool { self.0.is_zero() }
247295
}
248296

297+
impl<T: One> One for OrderedFloat<T> {
298+
fn one() -> Self { OrderedFloat(T::one()) }
299+
}
300+
301+
impl<T: NumCast> NumCast for OrderedFloat<T> {
302+
fn from<F: ToPrimitive>(n: F) -> Option<Self> {
303+
T::from(n).map(OrderedFloat)
304+
}
305+
}
306+
307+
impl<T: FromPrimitive> FromPrimitive for OrderedFloat<T> {
308+
fn from_i64(n: i64) -> Option<Self> { T::from_i64(n).map(OrderedFloat) }
309+
fn from_u64(n: u64) -> Option<Self> { T::from_u64(n).map(OrderedFloat) }
310+
fn from_isize(n: isize) -> Option<Self> { T::from_isize(n).map(OrderedFloat) }
311+
fn from_i8(n: i8) -> Option<Self> { T::from_i8(n).map(OrderedFloat) }
312+
fn from_i16(n: i16) -> Option<Self> { T::from_i16(n).map(OrderedFloat) }
313+
fn from_i32(n: i32) -> Option<Self> { T::from_i32(n).map(OrderedFloat) }
314+
fn from_usize(n: usize) -> Option<Self> { T::from_usize(n).map(OrderedFloat) }
315+
fn from_u8(n: u8) -> Option<Self> { T::from_u8(n).map(OrderedFloat) }
316+
fn from_u16(n: u16) -> Option<Self> { T::from_u16(n).map(OrderedFloat) }
317+
fn from_u32(n: u32) -> Option<Self> { T::from_u32(n).map(OrderedFloat) }
318+
fn from_f32(n: f32) -> Option<Self> { T::from_f32(n).map(OrderedFloat) }
319+
fn from_f64(n: f64) -> Option<Self> { T::from_f64(n).map(OrderedFloat) }
320+
}
321+
322+
impl<T: ToPrimitive> ToPrimitive for OrderedFloat<T> {
323+
fn to_i64(&self) -> Option<i64> { self.0.to_i64() }
324+
fn to_u64(&self) -> Option<u64> { self.0.to_u64() }
325+
fn to_isize(&self) -> Option<isize> { self.0.to_isize() }
326+
fn to_i8(&self) -> Option<i8> { self.0.to_i8() }
327+
fn to_i16(&self) -> Option<i16> { self.0.to_i16() }
328+
fn to_i32(&self) -> Option<i32> { self.0.to_i32() }
329+
fn to_usize(&self) -> Option<usize> { self.0.to_usize() }
330+
fn to_u8(&self) -> Option<u8> { self.0.to_u8() }
331+
fn to_u16(&self) -> Option<u16> { self.0.to_u16() }
332+
fn to_u32(&self) -> Option<u32> { self.0.to_u32() }
333+
fn to_f32(&self) -> Option<f32> { self.0.to_f32() }
334+
fn to_f64(&self) -> Option<f64> { self.0.to_f64() }
335+
}
336+
337+
impl<T: Float> Float for OrderedFloat<T> {
338+
fn nan() -> Self { OrderedFloat(T::nan()) }
339+
fn infinity() -> Self { OrderedFloat(T::infinity()) }
340+
fn neg_infinity() -> Self { OrderedFloat(T::neg_infinity()) }
341+
fn neg_zero() -> Self { OrderedFloat(T::neg_zero()) }
342+
fn min_value() -> Self { OrderedFloat(T::min_value()) }
343+
fn min_positive_value() -> Self { OrderedFloat(T::min_positive_value()) }
344+
fn max_value() -> Self { OrderedFloat(T::max_value()) }
345+
fn is_nan(self) -> bool { self.0.is_nan() }
346+
fn is_infinite(self) -> bool { self.0.is_infinite() }
347+
fn is_finite(self) -> bool { self.0.is_finite() }
348+
fn is_normal(self) -> bool { self.0.is_normal() }
349+
fn classify(self) -> std::num::FpCategory { self.0.classify() }
350+
fn floor(self) -> Self { OrderedFloat(self.0.floor()) }
351+
fn ceil(self) -> Self { OrderedFloat(self.0.ceil()) }
352+
fn round(self) -> Self { OrderedFloat(self.0.round()) }
353+
fn trunc(self) -> Self { OrderedFloat(self.0.trunc()) }
354+
fn fract(self) -> Self { OrderedFloat(self.0.fract()) }
355+
fn abs(self) -> Self { OrderedFloat(self.0.abs()) }
356+
fn signum(self) -> Self { OrderedFloat(self.0.signum()) }
357+
fn is_sign_positive(self) -> bool { self.0.is_sign_positive() }
358+
fn is_sign_negative(self) -> bool { self.0.is_sign_negative() }
359+
fn mul_add(self, a: Self, b: Self) -> Self { OrderedFloat(self.0.mul_add(a.0, b.0)) }
360+
fn recip(self) -> Self { OrderedFloat(self.0.recip()) }
361+
fn powi(self, n: i32) -> Self { OrderedFloat(self.0.powi(n)) }
362+
fn powf(self, n: Self) -> Self { OrderedFloat(self.0.powf(n.0)) }
363+
fn sqrt(self) -> Self { OrderedFloat(self.0.sqrt()) }
364+
fn exp(self) -> Self { OrderedFloat(self.0.exp()) }
365+
fn exp2(self) -> Self { OrderedFloat(self.0.exp2()) }
366+
fn ln(self) -> Self { OrderedFloat(self.0.ln()) }
367+
fn log(self, base: Self) -> Self { OrderedFloat(self.0.log(base.0)) }
368+
fn log2(self) -> Self { OrderedFloat(self.0.log2()) }
369+
fn log10(self) -> Self { OrderedFloat(self.0.log10()) }
370+
fn max(self, other: Self) -> Self { OrderedFloat(self.0.max(other.0)) }
371+
fn min(self, other: Self) -> Self { OrderedFloat(self.0.min(other.0)) }
372+
fn abs_sub(self, other: Self) -> Self { OrderedFloat(self.0.abs_sub(other.0)) }
373+
fn cbrt(self) -> Self { OrderedFloat(self.0.cbrt()) }
374+
fn hypot(self, other: Self) -> Self { OrderedFloat(self.0.hypot(other.0)) }
375+
fn sin(self) -> Self { OrderedFloat(self.0.sin()) }
376+
fn cos(self) -> Self { OrderedFloat(self.0.cos()) }
377+
fn tan(self) -> Self { OrderedFloat(self.0.tan()) }
378+
fn asin(self) -> Self { OrderedFloat(self.0.asin()) }
379+
fn acos(self) -> Self { OrderedFloat(self.0.acos()) }
380+
fn atan(self) -> Self { OrderedFloat(self.0.atan()) }
381+
fn atan2(self, other: Self) -> Self { OrderedFloat(self.0.atan2(other.0)) }
382+
fn sin_cos(self) -> (Self, Self) {
383+
let (a, b) = self.0.sin_cos();
384+
(OrderedFloat(a), OrderedFloat(b))
385+
}
386+
fn exp_m1(self) -> Self { OrderedFloat(self.0.exp_m1()) }
387+
fn ln_1p(self) -> Self { OrderedFloat(self.0.ln_1p()) }
388+
fn sinh(self) -> Self { OrderedFloat(self.0.sinh()) }
389+
fn cosh(self) -> Self { OrderedFloat(self.0.cosh()) }
390+
fn tanh(self) -> Self { OrderedFloat(self.0.tanh()) }
391+
fn asinh(self) -> Self { OrderedFloat(self.0.asinh()) }
392+
fn acosh(self) -> Self { OrderedFloat(self.0.acosh()) }
393+
fn atanh(self) -> Self { OrderedFloat(self.0.atanh()) }
394+
fn integer_decode(self) -> (u64, i16, i8) { self.0.integer_decode() }
395+
}
396+
397+
398+
impl<T: Float + Num> Num for OrderedFloat<T> {
399+
type FromStrRadixErr = T::FromStrRadixErr;
400+
fn from_str_radix(str: &str, radix: u32) -> Result<Self, Self::FromStrRadixErr> {
401+
T::from_str_radix(str, radix).map(OrderedFloat)
402+
}
403+
}
404+
249405
/// A wrapper around Floats providing an implementation of Ord and Hash.
250406
///
251407
/// A NaN value cannot be stored in this type.

0 commit comments

Comments
 (0)