ordered_float/
lib.rs

1#![no_std]
2#![cfg_attr(test, deny(warnings))]
3#![deny(missing_docs)]
4#![allow(clippy::derive_partial_eq_without_eq)]
5
6//! Wrappers for total order on Floats.  See the [`OrderedFloat`] and [`NotNan`] docs for details.
7
8#[cfg(feature = "std")]
9extern crate std;
10#[cfg(feature = "std")]
11use std::error::Error;
12
13use core::borrow::Borrow;
14use core::cmp::Ordering;
15use core::convert::TryFrom;
16use core::fmt;
17use core::hash::{Hash, Hasher};
18use core::iter::{Product, Sum};
19use core::num::FpCategory;
20use core::ops::{
21    Add, AddAssign, Deref, DerefMut, Div, DivAssign, Mul, MulAssign, Neg, Rem, RemAssign, Sub,
22    SubAssign,
23};
24use core::str::FromStr;
25
26pub use num_traits::float::FloatCore;
27use num_traits::{
28    AsPrimitive, Bounded, FloatConst, FromPrimitive, Num, NumCast, One, Signed, ToPrimitive, Zero,
29};
30#[cfg(any(feature = "std", feature = "libm"))]
31pub use num_traits::{Float, Pow};
32
33#[cfg(feature = "rand")]
34pub use impl_rand::{UniformNotNan, UniformOrdered};
35
36/// A wrapper around floats providing implementations of `Eq`, `Ord`, and `Hash`.
37///
38/// NaN is sorted as *greater* than all other values and *equal*
39/// to itself, in contradiction with the IEEE standard.
40///
41/// ```
42/// use ordered_float::OrderedFloat;
43/// use std::f32::NAN;
44///
45/// let mut v = [OrderedFloat(NAN), OrderedFloat(2.0), OrderedFloat(1.0)];
46/// v.sort();
47/// assert_eq!(v, [OrderedFloat(1.0), OrderedFloat(2.0), OrderedFloat(NAN)]);
48/// ```
49///
50/// Because `OrderedFloat` implements `Ord` and `Eq`, it can be used as a key in a `HashSet`,
51/// `HashMap`, `BTreeMap`, or `BTreeSet` (unlike the primitive `f32` or `f64` types):
52///
53/// ```
54/// # use ordered_float::OrderedFloat;
55/// # use std::collections::HashSet;
56/// # use std::f32::NAN;
57/// let mut s: HashSet<OrderedFloat<f32>> = HashSet::new();
58/// s.insert(OrderedFloat(NAN));
59/// assert!(s.contains(&OrderedFloat(NAN)));
60/// ```
61///
62/// Some non-identical values are still considered equal by the [`PartialEq`] implementation,
63/// and will therefore also be considered equal by maps, sets, and the `==` operator:
64///
65/// * `-0.0` and `+0.0` are considered equal.
66///   This different sign may show up in printing, or when dividing by zero (the sign of the zero
67///   becomes the sign of the resulting infinity).
68/// * All NaN values are considered equal, even though they may have different
69///   [bits](https://doc.rust-lang.org/std/primitive.f64.html#method.to_bits), and therefore
70///   different [sign](https://doc.rust-lang.org/std/primitive.f64.html#method.is_sign_positive),
71///   signaling/quiet status, and NaN payload bits.
72///   
73/// Therefore, `OrderedFloat` may be unsuitable for use as a key in interning and memoization
74/// applications which require equal results from equal inputs, unless these cases make no
75/// difference or are canonicalized before insertion.
76///
77/// # Representation
78///
79/// `OrderedFloat` has `#[repr(transparent)]` and permits any value, so it is sound to use
80/// [transmute](core::mem::transmute) or pointer casts to convert between any type `T` and
81/// `OrderedFloat<T>`.
82/// However, consider using [`bytemuck`] as a safe alternative if possible.
83///
84#[cfg_attr(
85    not(feature = "bytemuck"),
86    doc = "[`bytemuck`]: https://docs.rs/bytemuck/1/"
87)]
88#[derive(Default, Clone, Copy)]
89#[repr(transparent)]
90pub struct OrderedFloat<T>(pub T);
91
92#[cfg(feature = "derive-visitor")]
93mod impl_derive_visitor {
94    use crate::OrderedFloat;
95    use derive_visitor::{Drive, DriveMut, Event, Visitor, VisitorMut};
96
97    impl<T: 'static> Drive for OrderedFloat<T> {
98        fn drive<V: Visitor>(&self, visitor: &mut V) {
99            visitor.visit(self, Event::Enter);
100            visitor.visit(self, Event::Exit);
101        }
102    }
103
104    impl<T: 'static> DriveMut for OrderedFloat<T> {
105        fn drive_mut<V: VisitorMut>(&mut self, visitor: &mut V) {
106            visitor.visit(self, Event::Enter);
107            visitor.visit(self, Event::Exit);
108        }
109    }
110
111    #[test]
112    pub fn test_derive_visitor() {
113        #[derive(Debug, Clone, PartialEq, Eq, Drive, DriveMut)]
114        pub enum Literal {
115            Null,
116            Float(OrderedFloat<f64>),
117        }
118
119        #[derive(Visitor, VisitorMut)]
120        #[visitor(Literal(enter))]
121        struct FloatExpr(bool);
122
123        impl FloatExpr {
124            fn enter_literal(&mut self, lit: &Literal) {
125                if let Literal::Float(_) = lit {
126                    self.0 = true;
127                }
128            }
129        }
130
131        assert!({
132            let mut visitor = FloatExpr(false);
133            Literal::Null.drive(&mut visitor);
134            !visitor.0
135        });
136
137        assert!({
138            let mut visitor = FloatExpr(false);
139            Literal::Null.drive_mut(&mut visitor);
140            !visitor.0
141        });
142
143        assert!({
144            let mut visitor = FloatExpr(false);
145            Literal::Float(OrderedFloat(0.0)).drive(&mut visitor);
146            visitor.0
147        });
148
149        assert!({
150            let mut visitor = FloatExpr(false);
151            Literal::Float(OrderedFloat(0.0)).drive_mut(&mut visitor);
152            visitor.0
153        });
154    }
155}
156
157#[cfg(feature = "num-cmp")]
158mod impl_num_cmp {
159    use super::OrderedFloat;
160    use core::cmp::Ordering;
161    use num_cmp::NumCmp;
162    use num_traits::float::FloatCore;
163
164    impl<T, U> NumCmp<U> for OrderedFloat<T>
165    where
166        T: FloatCore + NumCmp<U>,
167        U: Copy,
168    {
169        fn num_cmp(self, other: U) -> Option<Ordering> {
170            NumCmp::num_cmp(self.0, other)
171        }
172
173        fn num_eq(self, other: U) -> bool {
174            NumCmp::num_eq(self.0, other)
175        }
176
177        fn num_ne(self, other: U) -> bool {
178            NumCmp::num_ne(self.0, other)
179        }
180
181        fn num_lt(self, other: U) -> bool {
182            NumCmp::num_lt(self.0, other)
183        }
184
185        fn num_gt(self, other: U) -> bool {
186            NumCmp::num_gt(self.0, other)
187        }
188
189        fn num_le(self, other: U) -> bool {
190            NumCmp::num_le(self.0, other)
191        }
192
193        fn num_ge(self, other: U) -> bool {
194            NumCmp::num_ge(self.0, other)
195        }
196    }
197
198    #[test]
199    pub fn test_num_cmp() {
200        let f = OrderedFloat(1.0);
201
202        assert_eq!(NumCmp::num_cmp(f, 1.0), Some(Ordering::Equal));
203        assert_eq!(NumCmp::num_cmp(f, -1.0), Some(Ordering::Greater));
204        assert_eq!(NumCmp::num_cmp(f, 2.0), Some(Ordering::Less));
205
206        assert!(NumCmp::num_eq(f, 1));
207        assert!(NumCmp::num_ne(f, -1));
208        assert!(NumCmp::num_lt(f, 100));
209        assert!(NumCmp::num_gt(f, 0));
210        assert!(NumCmp::num_le(f, 1));
211        assert!(NumCmp::num_le(f, 2));
212        assert!(NumCmp::num_ge(f, 1));
213        assert!(NumCmp::num_ge(f, -1));
214    }
215}
216
217impl<T: FloatCore> OrderedFloat<T> {
218    /// Get the value out.
219    #[inline]
220    pub fn into_inner(self) -> T {
221        self.0
222    }
223}
224
225impl<T: FloatCore> AsRef<T> for OrderedFloat<T> {
226    #[inline]
227    fn as_ref(&self) -> &T {
228        &self.0
229    }
230}
231
232impl<T: FloatCore> AsMut<T> for OrderedFloat<T> {
233    #[inline]
234    fn as_mut(&mut self) -> &mut T {
235        &mut self.0
236    }
237}
238
239impl<'a, T: FloatCore> From<&'a T> for &'a OrderedFloat<T> {
240    #[inline]
241    fn from(t: &'a T) -> &'a OrderedFloat<T> {
242        // Safety: OrderedFloat is #[repr(transparent)] and has no invalid values.
243        unsafe { &*(t as *const T as *const OrderedFloat<T>) }
244    }
245}
246
247impl<'a, T: FloatCore> From<&'a mut T> for &'a mut OrderedFloat<T> {
248    #[inline]
249    fn from(t: &'a mut T) -> &'a mut OrderedFloat<T> {
250        // Safety: OrderedFloat is #[repr(transparent)] and has no invalid values.
251        unsafe { &mut *(t as *mut T as *mut OrderedFloat<T>) }
252    }
253}
254
255impl<T: FloatCore> PartialOrd for OrderedFloat<T> {
256    #[inline]
257    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
258        Some(self.cmp(other))
259    }
260
261    #[inline]
262    fn lt(&self, other: &Self) -> bool {
263        !self.ge(other)
264    }
265
266    #[inline]
267    fn le(&self, other: &Self) -> bool {
268        other.ge(self)
269    }
270
271    #[inline]
272    fn gt(&self, other: &Self) -> bool {
273        !other.ge(self)
274    }
275
276    #[inline]
277    fn ge(&self, other: &Self) -> bool {
278        // We consider all NaNs equal, and NaN is the largest possible
279        // value. Thus if self is NaN we always return true. Otherwise
280        // self >= other is correct. If other is also not NaN it is trivially
281        // correct, and if it is we note that nothing can be greater or
282        // equal to NaN except NaN itself, which we already handled earlier.
283        self.0.is_nan() | (self.0 >= other.0)
284    }
285}
286
287impl<T: FloatCore> Ord for OrderedFloat<T> {
288    #[inline]
289    fn cmp(&self, other: &Self) -> Ordering {
290        #[allow(clippy::comparison_chain)]
291        if self < other {
292            Ordering::Less
293        } else if self > other {
294            Ordering::Greater
295        } else {
296            Ordering::Equal
297        }
298    }
299}
300
301impl<T: FloatCore> PartialEq for OrderedFloat<T> {
302    #[inline]
303    fn eq(&self, other: &OrderedFloat<T>) -> bool {
304        if self.0.is_nan() {
305            other.0.is_nan()
306        } else {
307            self.0 == other.0
308        }
309    }
310}
311
312impl<T: FloatCore> PartialEq<T> for OrderedFloat<T> {
313    #[inline]
314    fn eq(&self, other: &T) -> bool {
315        self.0 == *other
316    }
317}
318
319impl<T: fmt::Debug> fmt::Debug for OrderedFloat<T> {
320    #[inline]
321    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
322        self.0.fmt(f)
323    }
324}
325
326impl<T: FloatCore + fmt::Display> fmt::Display for OrderedFloat<T> {
327    #[inline]
328    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
329        self.0.fmt(f)
330    }
331}
332
333impl<T: FloatCore + fmt::LowerExp> fmt::LowerExp for OrderedFloat<T> {
334    #[inline]
335    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
336        self.0.fmt(f)
337    }
338}
339
340impl<T: FloatCore + fmt::UpperExp> fmt::UpperExp for OrderedFloat<T> {
341    #[inline]
342    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
343        self.0.fmt(f)
344    }
345}
346
347impl From<OrderedFloat<f32>> for f32 {
348    #[inline]
349    fn from(f: OrderedFloat<f32>) -> f32 {
350        f.0
351    }
352}
353
354impl From<OrderedFloat<f64>> for f64 {
355    #[inline]
356    fn from(f: OrderedFloat<f64>) -> f64 {
357        f.0
358    }
359}
360
361impl<T: FloatCore> From<T> for OrderedFloat<T> {
362    #[inline]
363    fn from(val: T) -> Self {
364        OrderedFloat(val)
365    }
366}
367
368impl From<bool> for OrderedFloat<f32> {
369    fn from(val: bool) -> Self {
370        OrderedFloat(val as u8 as f32)
371    }
372}
373
374impl From<bool> for OrderedFloat<f64> {
375    fn from(val: bool) -> Self {
376        OrderedFloat(val as u8 as f64)
377    }
378}
379
380macro_rules! impl_ordered_float_from {
381    ($dst:ty, $src:ty) => {
382        impl From<$src> for OrderedFloat<$dst> {
383            fn from(val: $src) -> Self {
384                OrderedFloat(val.into())
385            }
386        }
387    };
388}
389impl_ordered_float_from! {f64, i8}
390impl_ordered_float_from! {f64, i16}
391impl_ordered_float_from! {f64, i32}
392impl_ordered_float_from! {f64, u8}
393impl_ordered_float_from! {f64, u16}
394impl_ordered_float_from! {f64, u32}
395impl_ordered_float_from! {f32, i8}
396impl_ordered_float_from! {f32, i16}
397impl_ordered_float_from! {f32, u8}
398impl_ordered_float_from! {f32, u16}
399
400impl<T: FloatCore> Deref for OrderedFloat<T> {
401    type Target = T;
402
403    #[inline]
404    fn deref(&self) -> &Self::Target {
405        &self.0
406    }
407}
408
409impl<T: FloatCore> DerefMut for OrderedFloat<T> {
410    #[inline]
411    fn deref_mut(&mut self) -> &mut Self::Target {
412        &mut self.0
413    }
414}
415
416impl<T: FloatCore> Eq for OrderedFloat<T> {}
417
418macro_rules! impl_ordered_float_binop {
419    ($imp:ident, $method:ident, $assign_imp:ident, $assign_method:ident) => {
420        impl<T: $imp> $imp for OrderedFloat<T> {
421            type Output = OrderedFloat<T::Output>;
422
423            #[inline]
424            fn $method(self, other: Self) -> Self::Output {
425                OrderedFloat((self.0).$method(other.0))
426            }
427        }
428
429        // Work around for: https://github.com/reem/rust-ordered-float/issues/91
430        impl<'a, T: $imp + Copy> $imp<Self> for &'a OrderedFloat<T> {
431            type Output = OrderedFloat<T::Output>;
432
433            #[inline]
434            fn $method(self, other: Self) -> Self::Output {
435                OrderedFloat((self.0).$method(other.0))
436            }
437        }
438
439        impl<T: $imp> $imp<T> for OrderedFloat<T> {
440            type Output = OrderedFloat<T::Output>;
441
442            #[inline]
443            fn $method(self, other: T) -> Self::Output {
444                OrderedFloat((self.0).$method(other))
445            }
446        }
447
448        impl<'a, T> $imp<&'a T> for OrderedFloat<T>
449        where
450            T: $imp<&'a T>,
451        {
452            type Output = OrderedFloat<<T as $imp<&'a T>>::Output>;
453
454            #[inline]
455            fn $method(self, other: &'a T) -> Self::Output {
456                OrderedFloat((self.0).$method(other))
457            }
458        }
459
460        impl<'a, T> $imp<&'a Self> for OrderedFloat<T>
461        where
462            T: $imp<&'a T>,
463        {
464            type Output = OrderedFloat<<T as $imp<&'a T>>::Output>;
465
466            #[inline]
467            fn $method(self, other: &'a Self) -> Self::Output {
468                OrderedFloat((self.0).$method(&other.0))
469            }
470        }
471
472        impl<'a, T> $imp<OrderedFloat<T>> for &'a OrderedFloat<T>
473        where
474            &'a T: $imp<T>,
475        {
476            type Output = OrderedFloat<<&'a T as $imp<T>>::Output>;
477
478            #[inline]
479            fn $method(self, other: OrderedFloat<T>) -> Self::Output {
480                OrderedFloat((self.0).$method(other.0))
481            }
482        }
483
484        impl<'a, T> $imp<T> for &'a OrderedFloat<T>
485        where
486            &'a T: $imp<T>,
487        {
488            type Output = OrderedFloat<<&'a T as $imp<T>>::Output>;
489
490            #[inline]
491            fn $method(self, other: T) -> Self::Output {
492                OrderedFloat((self.0).$method(other))
493            }
494        }
495
496        impl<'a, T> $imp<&'a T> for &'a OrderedFloat<T>
497        where
498            &'a T: $imp,
499        {
500            type Output = OrderedFloat<<&'a T as $imp>::Output>;
501
502            #[inline]
503            fn $method(self, other: &'a T) -> Self::Output {
504                OrderedFloat((self.0).$method(other))
505            }
506        }
507
508        impl<T: $assign_imp> $assign_imp<T> for OrderedFloat<T> {
509            #[inline]
510            fn $assign_method(&mut self, other: T) {
511                (self.0).$assign_method(other);
512            }
513        }
514
515        impl<'a, T: $assign_imp<&'a T>> $assign_imp<&'a T> for OrderedFloat<T> {
516            #[inline]
517            fn $assign_method(&mut self, other: &'a T) {
518                (self.0).$assign_method(other);
519            }
520        }
521
522        impl<T: $assign_imp> $assign_imp for OrderedFloat<T> {
523            #[inline]
524            fn $assign_method(&mut self, other: Self) {
525                (self.0).$assign_method(other.0);
526            }
527        }
528
529        impl<'a, T: $assign_imp<&'a T>> $assign_imp<&'a Self> for OrderedFloat<T> {
530            #[inline]
531            fn $assign_method(&mut self, other: &'a Self) {
532                (self.0).$assign_method(&other.0);
533            }
534        }
535    };
536}
537
538impl_ordered_float_binop! {Add, add, AddAssign, add_assign}
539impl_ordered_float_binop! {Sub, sub, SubAssign, sub_assign}
540impl_ordered_float_binop! {Mul, mul, MulAssign, mul_assign}
541impl_ordered_float_binop! {Div, div, DivAssign, div_assign}
542impl_ordered_float_binop! {Rem, rem, RemAssign, rem_assign}
543
544macro_rules! impl_ordered_float_pow {
545    ($inner:ty, $rhs:ty) => {
546        #[cfg(any(feature = "std", feature = "libm"))]
547        impl Pow<$rhs> for OrderedFloat<$inner> {
548            type Output = OrderedFloat<$inner>;
549            #[inline]
550            fn pow(self, rhs: $rhs) -> OrderedFloat<$inner> {
551                OrderedFloat(<$inner>::pow(self.0, rhs))
552            }
553        }
554
555        #[cfg(any(feature = "std", feature = "libm"))]
556        impl<'a> Pow<&'a $rhs> for OrderedFloat<$inner> {
557            type Output = OrderedFloat<$inner>;
558            #[inline]
559            fn pow(self, rhs: &'a $rhs) -> OrderedFloat<$inner> {
560                OrderedFloat(<$inner>::pow(self.0, *rhs))
561            }
562        }
563
564        #[cfg(any(feature = "std", feature = "libm"))]
565        impl<'a> Pow<$rhs> for &'a OrderedFloat<$inner> {
566            type Output = OrderedFloat<$inner>;
567            #[inline]
568            fn pow(self, rhs: $rhs) -> OrderedFloat<$inner> {
569                OrderedFloat(<$inner>::pow(self.0, rhs))
570            }
571        }
572
573        #[cfg(any(feature = "std", feature = "libm"))]
574        impl<'a, 'b> Pow<&'a $rhs> for &'b OrderedFloat<$inner> {
575            type Output = OrderedFloat<$inner>;
576            #[inline]
577            fn pow(self, rhs: &'a $rhs) -> OrderedFloat<$inner> {
578                OrderedFloat(<$inner>::pow(self.0, *rhs))
579            }
580        }
581    };
582}
583
584impl_ordered_float_pow! {f32, i8}
585impl_ordered_float_pow! {f32, i16}
586impl_ordered_float_pow! {f32, u8}
587impl_ordered_float_pow! {f32, u16}
588impl_ordered_float_pow! {f32, i32}
589impl_ordered_float_pow! {f64, i8}
590impl_ordered_float_pow! {f64, i16}
591impl_ordered_float_pow! {f64, u8}
592impl_ordered_float_pow! {f64, u16}
593impl_ordered_float_pow! {f64, i32}
594impl_ordered_float_pow! {f32, f32}
595impl_ordered_float_pow! {f64, f32}
596impl_ordered_float_pow! {f64, f64}
597
598macro_rules! impl_ordered_float_self_pow {
599    ($base:ty, $exp:ty) => {
600        #[cfg(any(feature = "std", feature = "libm"))]
601        impl Pow<OrderedFloat<$exp>> for OrderedFloat<$base> {
602            type Output = OrderedFloat<$base>;
603            #[inline]
604            fn pow(self, rhs: OrderedFloat<$exp>) -> OrderedFloat<$base> {
605                OrderedFloat(<$base>::pow(self.0, rhs.0))
606            }
607        }
608
609        #[cfg(any(feature = "std", feature = "libm"))]
610        impl<'a> Pow<&'a OrderedFloat<$exp>> for OrderedFloat<$base> {
611            type Output = OrderedFloat<$base>;
612            #[inline]
613            fn pow(self, rhs: &'a OrderedFloat<$exp>) -> OrderedFloat<$base> {
614                OrderedFloat(<$base>::pow(self.0, rhs.0))
615            }
616        }
617
618        #[cfg(any(feature = "std", feature = "libm"))]
619        impl<'a> Pow<OrderedFloat<$exp>> for &'a OrderedFloat<$base> {
620            type Output = OrderedFloat<$base>;
621            #[inline]
622            fn pow(self, rhs: OrderedFloat<$exp>) -> OrderedFloat<$base> {
623                OrderedFloat(<$base>::pow(self.0, rhs.0))
624            }
625        }
626
627        #[cfg(any(feature = "std", feature = "libm"))]
628        impl<'a, 'b> Pow<&'a OrderedFloat<$exp>> for &'b OrderedFloat<$base> {
629            type Output = OrderedFloat<$base>;
630            #[inline]
631            fn pow(self, rhs: &'a OrderedFloat<$exp>) -> OrderedFloat<$base> {
632                OrderedFloat(<$base>::pow(self.0, rhs.0))
633            }
634        }
635    };
636}
637
638impl_ordered_float_self_pow! {f32, f32}
639impl_ordered_float_self_pow! {f64, f32}
640impl_ordered_float_self_pow! {f64, f64}
641
642/// Adds a float directly.
643impl<T: FloatCore + Sum> Sum for OrderedFloat<T> {
644    fn sum<I: Iterator<Item = OrderedFloat<T>>>(iter: I) -> Self {
645        OrderedFloat(iter.map(|v| v.0).sum())
646    }
647}
648
649impl<'a, T: FloatCore + Sum + 'a> Sum<&'a OrderedFloat<T>> for OrderedFloat<T> {
650    #[inline]
651    fn sum<I: Iterator<Item = &'a OrderedFloat<T>>>(iter: I) -> Self {
652        iter.cloned().sum()
653    }
654}
655
656impl<T: FloatCore + Product> Product for OrderedFloat<T> {
657    fn product<I: Iterator<Item = OrderedFloat<T>>>(iter: I) -> Self {
658        OrderedFloat(iter.map(|v| v.0).product())
659    }
660}
661
662impl<'a, T: FloatCore + Product + 'a> Product<&'a OrderedFloat<T>> for OrderedFloat<T> {
663    #[inline]
664    fn product<I: Iterator<Item = &'a OrderedFloat<T>>>(iter: I) -> Self {
665        iter.cloned().product()
666    }
667}
668
669impl<T: FloatCore + Signed> Signed for OrderedFloat<T> {
670    #[inline]
671    fn abs(&self) -> Self {
672        OrderedFloat(self.0.abs())
673    }
674
675    fn abs_sub(&self, other: &Self) -> Self {
676        OrderedFloat(Signed::abs_sub(&self.0, &other.0))
677    }
678
679    #[inline]
680    fn signum(&self) -> Self {
681        OrderedFloat(self.0.signum())
682    }
683    #[inline]
684    fn is_positive(&self) -> bool {
685        self.0.is_positive()
686    }
687    #[inline]
688    fn is_negative(&self) -> bool {
689        self.0.is_negative()
690    }
691}
692
693impl<T: Bounded> Bounded for OrderedFloat<T> {
694    #[inline]
695    fn min_value() -> Self {
696        OrderedFloat(T::min_value())
697    }
698
699    #[inline]
700    fn max_value() -> Self {
701        OrderedFloat(T::max_value())
702    }
703}
704
705impl<T: FromStr> FromStr for OrderedFloat<T> {
706    type Err = T::Err;
707
708    /// Convert a &str to `OrderedFloat`. Returns an error if the string fails to parse.
709    ///
710    /// ```
711    /// use ordered_float::OrderedFloat;
712    ///
713    /// assert!("-10".parse::<OrderedFloat<f32>>().is_ok());
714    /// assert!("abc".parse::<OrderedFloat<f32>>().is_err());
715    /// assert!("NaN".parse::<OrderedFloat<f32>>().is_ok());
716    /// ```
717    fn from_str(s: &str) -> Result<Self, Self::Err> {
718        T::from_str(s).map(OrderedFloat)
719    }
720}
721
722impl<T: Neg> Neg for OrderedFloat<T> {
723    type Output = OrderedFloat<T::Output>;
724
725    #[inline]
726    fn neg(self) -> Self::Output {
727        OrderedFloat(-self.0)
728    }
729}
730
731impl<'a, T> Neg for &'a OrderedFloat<T>
732where
733    &'a T: Neg,
734{
735    type Output = OrderedFloat<<&'a T as Neg>::Output>;
736
737    #[inline]
738    fn neg(self) -> Self::Output {
739        OrderedFloat(-(&self.0))
740    }
741}
742
743impl<T: Zero> Zero for OrderedFloat<T> {
744    #[inline]
745    fn zero() -> Self {
746        OrderedFloat(T::zero())
747    }
748
749    #[inline]
750    fn is_zero(&self) -> bool {
751        self.0.is_zero()
752    }
753}
754
755impl<T: One> One for OrderedFloat<T> {
756    #[inline]
757    fn one() -> Self {
758        OrderedFloat(T::one())
759    }
760}
761
762impl<T: NumCast> NumCast for OrderedFloat<T> {
763    #[inline]
764    fn from<F: ToPrimitive>(n: F) -> Option<Self> {
765        T::from(n).map(OrderedFloat)
766    }
767}
768
769macro_rules! impl_as_primitive {
770    (@ (NotNan<$T: ty>) => $(#[$cfg:meta])* impl (NotNan<$U: ty>) ) => {
771        $(#[$cfg])*
772        impl AsPrimitive<NotNan<$U>> for NotNan<$T> {
773            #[inline] fn as_(self) -> NotNan<$U> {
774                // Safety: `NotNan` guarantees that the value is not NaN.
775                unsafe {NotNan::new_unchecked(self.0 as $U) }
776            }
777        }
778    };
779    (@ ($T: ty) => $(#[$cfg:meta])* impl (NotNan<$U: ty>) ) => {
780        $(#[$cfg])*
781        impl AsPrimitive<NotNan<$U>> for $T {
782            #[inline] fn as_(self) -> NotNan<$U> { NotNan(self as $U) }
783        }
784    };
785    (@ (NotNan<$T: ty>) => $(#[$cfg:meta])* impl ($U: ty) ) => {
786        $(#[$cfg])*
787        impl AsPrimitive<$U> for NotNan<$T> {
788            #[inline] fn as_(self) -> $U { self.0 as $U }
789        }
790    };
791    (@ (OrderedFloat<$T: ty>) => $(#[$cfg:meta])* impl (OrderedFloat<$U: ty>) ) => {
792        $(#[$cfg])*
793        impl AsPrimitive<OrderedFloat<$U>> for OrderedFloat<$T> {
794            #[inline] fn as_(self) -> OrderedFloat<$U> { OrderedFloat(self.0 as $U) }
795        }
796    };
797    (@ ($T: ty) => $(#[$cfg:meta])* impl (OrderedFloat<$U: ty>) ) => {
798        $(#[$cfg])*
799        impl AsPrimitive<OrderedFloat<$U>> for $T {
800            #[inline] fn as_(self) -> OrderedFloat<$U> { OrderedFloat(self as $U) }
801        }
802    };
803    (@ (OrderedFloat<$T: ty>) => $(#[$cfg:meta])* impl ($U: ty) ) => {
804        $(#[$cfg])*
805        impl AsPrimitive<$U> for OrderedFloat<$T> {
806            #[inline] fn as_(self) -> $U { self.0 as $U }
807        }
808    };
809    ($T: tt => { $( $U: tt ),* } ) => {$(
810        impl_as_primitive!(@ $T => impl $U);
811    )*};
812}
813
814impl_as_primitive!((OrderedFloat<f32>) => { (OrderedFloat<f32>), (OrderedFloat<f64>) });
815impl_as_primitive!((OrderedFloat<f64>) => { (OrderedFloat<f32>), (OrderedFloat<f64>) });
816
817impl_as_primitive!((NotNan<f32>) => { (NotNan<f32>), (NotNan<f64>) });
818impl_as_primitive!((NotNan<f64>) => { (NotNan<f32>), (NotNan<f64>) });
819
820impl_as_primitive!((u8) => { (OrderedFloat<f32>), (OrderedFloat<f64>) });
821impl_as_primitive!((i8) => { (OrderedFloat<f32>), (OrderedFloat<f64>) });
822impl_as_primitive!((u16) => { (OrderedFloat<f32>), (OrderedFloat<f64>) });
823impl_as_primitive!((i16) => { (OrderedFloat<f32>), (OrderedFloat<f64>) });
824impl_as_primitive!((u32) => { (OrderedFloat<f32>), (OrderedFloat<f64>) });
825impl_as_primitive!((i32) => { (OrderedFloat<f32>), (OrderedFloat<f64>) });
826impl_as_primitive!((u64) => { (OrderedFloat<f32>), (OrderedFloat<f64>) });
827impl_as_primitive!((i64) => { (OrderedFloat<f32>), (OrderedFloat<f64>) });
828impl_as_primitive!((usize) => { (OrderedFloat<f32>), (OrderedFloat<f64>) });
829impl_as_primitive!((isize) => { (OrderedFloat<f32>), (OrderedFloat<f64>) });
830impl_as_primitive!((f32) => { (OrderedFloat<f32>), (OrderedFloat<f64>) });
831impl_as_primitive!((f64) => { (OrderedFloat<f32>), (OrderedFloat<f64>) });
832
833impl_as_primitive!((u8) => { (NotNan<f32>), (NotNan<f64>) });
834impl_as_primitive!((i8) => { (NotNan<f32>), (NotNan<f64>) });
835impl_as_primitive!((u16) => { (NotNan<f32>), (NotNan<f64>) });
836impl_as_primitive!((i16) => { (NotNan<f32>), (NotNan<f64>) });
837impl_as_primitive!((u32) => { (NotNan<f32>), (NotNan<f64>) });
838impl_as_primitive!((i32) => { (NotNan<f32>), (NotNan<f64>) });
839impl_as_primitive!((u64) => { (NotNan<f32>), (NotNan<f64>) });
840impl_as_primitive!((i64) => { (NotNan<f32>), (NotNan<f64>) });
841impl_as_primitive!((usize) => { (NotNan<f32>), (NotNan<f64>) });
842impl_as_primitive!((isize) => { (NotNan<f32>), (NotNan<f64>) });
843
844impl_as_primitive!((OrderedFloat<f32>) => { (u8), (u16), (u32), (u64), (usize), (i8), (i16), (i32), (i64), (isize), (f32), (f64) });
845impl_as_primitive!((OrderedFloat<f64>) => { (u8), (u16), (u32), (u64), (usize), (i8), (i16), (i32), (i64), (isize), (f32), (f64) });
846
847impl_as_primitive!((NotNan<f32>) => { (u8), (u16), (u32), (u64), (usize), (i8), (i16), (i32), (i64), (isize), (f32), (f64) });
848impl_as_primitive!((NotNan<f64>) => { (u8), (u16), (u32), (u64), (usize), (i8), (i16), (i32), (i64), (isize), (f32), (f64) });
849
850impl<T: FromPrimitive> FromPrimitive for OrderedFloat<T> {
851    fn from_i64(n: i64) -> Option<Self> {
852        T::from_i64(n).map(OrderedFloat)
853    }
854    fn from_u64(n: u64) -> Option<Self> {
855        T::from_u64(n).map(OrderedFloat)
856    }
857    fn from_isize(n: isize) -> Option<Self> {
858        T::from_isize(n).map(OrderedFloat)
859    }
860    fn from_i8(n: i8) -> Option<Self> {
861        T::from_i8(n).map(OrderedFloat)
862    }
863    fn from_i16(n: i16) -> Option<Self> {
864        T::from_i16(n).map(OrderedFloat)
865    }
866    fn from_i32(n: i32) -> Option<Self> {
867        T::from_i32(n).map(OrderedFloat)
868    }
869    fn from_usize(n: usize) -> Option<Self> {
870        T::from_usize(n).map(OrderedFloat)
871    }
872    fn from_u8(n: u8) -> Option<Self> {
873        T::from_u8(n).map(OrderedFloat)
874    }
875    fn from_u16(n: u16) -> Option<Self> {
876        T::from_u16(n).map(OrderedFloat)
877    }
878    fn from_u32(n: u32) -> Option<Self> {
879        T::from_u32(n).map(OrderedFloat)
880    }
881    fn from_f32(n: f32) -> Option<Self> {
882        T::from_f32(n).map(OrderedFloat)
883    }
884    fn from_f64(n: f64) -> Option<Self> {
885        T::from_f64(n).map(OrderedFloat)
886    }
887}
888
889impl<T: ToPrimitive> ToPrimitive for OrderedFloat<T> {
890    fn to_i64(&self) -> Option<i64> {
891        self.0.to_i64()
892    }
893    fn to_u64(&self) -> Option<u64> {
894        self.0.to_u64()
895    }
896    fn to_isize(&self) -> Option<isize> {
897        self.0.to_isize()
898    }
899    fn to_i8(&self) -> Option<i8> {
900        self.0.to_i8()
901    }
902    fn to_i16(&self) -> Option<i16> {
903        self.0.to_i16()
904    }
905    fn to_i32(&self) -> Option<i32> {
906        self.0.to_i32()
907    }
908    fn to_usize(&self) -> Option<usize> {
909        self.0.to_usize()
910    }
911    fn to_u8(&self) -> Option<u8> {
912        self.0.to_u8()
913    }
914    fn to_u16(&self) -> Option<u16> {
915        self.0.to_u16()
916    }
917    fn to_u32(&self) -> Option<u32> {
918        self.0.to_u32()
919    }
920    fn to_f32(&self) -> Option<f32> {
921        self.0.to_f32()
922    }
923    fn to_f64(&self) -> Option<f64> {
924        self.0.to_f64()
925    }
926}
927
928impl<T: FloatCore> FloatCore for OrderedFloat<T> {
929    fn nan() -> Self {
930        OrderedFloat(T::nan())
931    }
932    fn infinity() -> Self {
933        OrderedFloat(T::infinity())
934    }
935    fn neg_infinity() -> Self {
936        OrderedFloat(T::neg_infinity())
937    }
938    fn neg_zero() -> Self {
939        OrderedFloat(T::neg_zero())
940    }
941    fn min_value() -> Self {
942        OrderedFloat(T::min_value())
943    }
944    fn min_positive_value() -> Self {
945        OrderedFloat(T::min_positive_value())
946    }
947    fn max_value() -> Self {
948        OrderedFloat(T::max_value())
949    }
950    fn is_nan(self) -> bool {
951        self.0.is_nan()
952    }
953    fn is_infinite(self) -> bool {
954        self.0.is_infinite()
955    }
956    fn is_finite(self) -> bool {
957        self.0.is_finite()
958    }
959    fn is_normal(self) -> bool {
960        self.0.is_normal()
961    }
962    fn classify(self) -> FpCategory {
963        self.0.classify()
964    }
965    fn floor(self) -> Self {
966        OrderedFloat(self.0.floor())
967    }
968    fn ceil(self) -> Self {
969        OrderedFloat(self.0.ceil())
970    }
971    fn round(self) -> Self {
972        OrderedFloat(self.0.round())
973    }
974    fn trunc(self) -> Self {
975        OrderedFloat(self.0.trunc())
976    }
977    fn fract(self) -> Self {
978        OrderedFloat(self.0.fract())
979    }
980    fn abs(self) -> Self {
981        OrderedFloat(self.0.abs())
982    }
983    fn signum(self) -> Self {
984        OrderedFloat(self.0.signum())
985    }
986    fn is_sign_positive(self) -> bool {
987        self.0.is_sign_positive()
988    }
989    fn is_sign_negative(self) -> bool {
990        self.0.is_sign_negative()
991    }
992    fn recip(self) -> Self {
993        OrderedFloat(self.0.recip())
994    }
995    fn powi(self, n: i32) -> Self {
996        OrderedFloat(self.0.powi(n))
997    }
998    fn integer_decode(self) -> (u64, i16, i8) {
999        self.0.integer_decode()
1000    }
1001    fn epsilon() -> Self {
1002        OrderedFloat(T::epsilon())
1003    }
1004    fn to_degrees(self) -> Self {
1005        OrderedFloat(self.0.to_degrees())
1006    }
1007    fn to_radians(self) -> Self {
1008        OrderedFloat(self.0.to_radians())
1009    }
1010}
1011
1012#[cfg(any(feature = "std", feature = "libm"))]
1013impl<T: Float + FloatCore> Float for OrderedFloat<T> {
1014    fn nan() -> Self {
1015        OrderedFloat(<T as Float>::nan())
1016    }
1017    fn infinity() -> Self {
1018        OrderedFloat(<T as Float>::infinity())
1019    }
1020    fn neg_infinity() -> Self {
1021        OrderedFloat(<T as Float>::neg_infinity())
1022    }
1023    fn neg_zero() -> Self {
1024        OrderedFloat(<T as Float>::neg_zero())
1025    }
1026    fn min_value() -> Self {
1027        OrderedFloat(<T as Float>::min_value())
1028    }
1029    fn min_positive_value() -> Self {
1030        OrderedFloat(<T as Float>::min_positive_value())
1031    }
1032    fn max_value() -> Self {
1033        OrderedFloat(<T as Float>::max_value())
1034    }
1035    fn is_nan(self) -> bool {
1036        Float::is_nan(self.0)
1037    }
1038    fn is_infinite(self) -> bool {
1039        Float::is_infinite(self.0)
1040    }
1041    fn is_finite(self) -> bool {
1042        Float::is_finite(self.0)
1043    }
1044    fn is_normal(self) -> bool {
1045        Float::is_normal(self.0)
1046    }
1047    fn classify(self) -> FpCategory {
1048        Float::classify(self.0)
1049    }
1050    fn floor(self) -> Self {
1051        OrderedFloat(Float::floor(self.0))
1052    }
1053    fn ceil(self) -> Self {
1054        OrderedFloat(Float::ceil(self.0))
1055    }
1056    fn round(self) -> Self {
1057        OrderedFloat(Float::round(self.0))
1058    }
1059    fn trunc(self) -> Self {
1060        OrderedFloat(Float::trunc(self.0))
1061    }
1062    fn fract(self) -> Self {
1063        OrderedFloat(Float::fract(self.0))
1064    }
1065    fn abs(self) -> Self {
1066        OrderedFloat(Float::abs(self.0))
1067    }
1068    fn signum(self) -> Self {
1069        OrderedFloat(Float::signum(self.0))
1070    }
1071    fn is_sign_positive(self) -> bool {
1072        Float::is_sign_positive(self.0)
1073    }
1074    fn is_sign_negative(self) -> bool {
1075        Float::is_sign_negative(self.0)
1076    }
1077    fn mul_add(self, a: Self, b: Self) -> Self {
1078        OrderedFloat(self.0.mul_add(a.0, b.0))
1079    }
1080    fn recip(self) -> Self {
1081        OrderedFloat(Float::recip(self.0))
1082    }
1083    fn powi(self, n: i32) -> Self {
1084        OrderedFloat(Float::powi(self.0, n))
1085    }
1086    fn powf(self, n: Self) -> Self {
1087        OrderedFloat(self.0.powf(n.0))
1088    }
1089    fn sqrt(self) -> Self {
1090        OrderedFloat(self.0.sqrt())
1091    }
1092    fn exp(self) -> Self {
1093        OrderedFloat(self.0.exp())
1094    }
1095    fn exp2(self) -> Self {
1096        OrderedFloat(self.0.exp2())
1097    }
1098    fn ln(self) -> Self {
1099        OrderedFloat(self.0.ln())
1100    }
1101    fn log(self, base: Self) -> Self {
1102        OrderedFloat(self.0.log(base.0))
1103    }
1104    fn log2(self) -> Self {
1105        OrderedFloat(self.0.log2())
1106    }
1107    fn log10(self) -> Self {
1108        OrderedFloat(self.0.log10())
1109    }
1110    fn max(self, other: Self) -> Self {
1111        OrderedFloat(Float::max(self.0, other.0))
1112    }
1113    fn min(self, other: Self) -> Self {
1114        OrderedFloat(Float::min(self.0, other.0))
1115    }
1116    fn abs_sub(self, other: Self) -> Self {
1117        OrderedFloat(self.0.abs_sub(other.0))
1118    }
1119    fn cbrt(self) -> Self {
1120        OrderedFloat(self.0.cbrt())
1121    }
1122    fn hypot(self, other: Self) -> Self {
1123        OrderedFloat(self.0.hypot(other.0))
1124    }
1125    fn sin(self) -> Self {
1126        OrderedFloat(self.0.sin())
1127    }
1128    fn cos(self) -> Self {
1129        OrderedFloat(self.0.cos())
1130    }
1131    fn tan(self) -> Self {
1132        OrderedFloat(self.0.tan())
1133    }
1134    fn asin(self) -> Self {
1135        OrderedFloat(self.0.asin())
1136    }
1137    fn acos(self) -> Self {
1138        OrderedFloat(self.0.acos())
1139    }
1140    fn atan(self) -> Self {
1141        OrderedFloat(self.0.atan())
1142    }
1143    fn atan2(self, other: Self) -> Self {
1144        OrderedFloat(self.0.atan2(other.0))
1145    }
1146    fn sin_cos(self) -> (Self, Self) {
1147        let (a, b) = self.0.sin_cos();
1148        (OrderedFloat(a), OrderedFloat(b))
1149    }
1150    fn exp_m1(self) -> Self {
1151        OrderedFloat(self.0.exp_m1())
1152    }
1153    fn ln_1p(self) -> Self {
1154        OrderedFloat(self.0.ln_1p())
1155    }
1156    fn sinh(self) -> Self {
1157        OrderedFloat(self.0.sinh())
1158    }
1159    fn cosh(self) -> Self {
1160        OrderedFloat(self.0.cosh())
1161    }
1162    fn tanh(self) -> Self {
1163        OrderedFloat(self.0.tanh())
1164    }
1165    fn asinh(self) -> Self {
1166        OrderedFloat(self.0.asinh())
1167    }
1168    fn acosh(self) -> Self {
1169        OrderedFloat(self.0.acosh())
1170    }
1171    fn atanh(self) -> Self {
1172        OrderedFloat(self.0.atanh())
1173    }
1174    fn integer_decode(self) -> (u64, i16, i8) {
1175        Float::integer_decode(self.0)
1176    }
1177    fn epsilon() -> Self {
1178        OrderedFloat(<T as Float>::epsilon())
1179    }
1180    fn to_degrees(self) -> Self {
1181        OrderedFloat(Float::to_degrees(self.0))
1182    }
1183    fn to_radians(self) -> Self {
1184        OrderedFloat(Float::to_radians(self.0))
1185    }
1186}
1187
1188impl<T: FloatCore + Num> Num for OrderedFloat<T> {
1189    type FromStrRadixErr = T::FromStrRadixErr;
1190    fn from_str_radix(str: &str, radix: u32) -> Result<Self, Self::FromStrRadixErr> {
1191        T::from_str_radix(str, radix).map(OrderedFloat)
1192    }
1193}
1194
1195/// A wrapper around floats providing an implementation of `Eq`, `Ord` and `Hash`.
1196///
1197/// A NaN value cannot be stored in this type.
1198///
1199/// ```
1200/// use ordered_float::NotNan;
1201///
1202/// let mut v = [NotNan::new(2.0).unwrap(), NotNan::new(1.0).unwrap()];
1203/// v.sort();
1204/// assert_eq!(v, [1.0, 2.0]);
1205/// ```
1206///
1207/// Because `NotNan` implements `Ord` and `Eq`, it can be used as a key in a `HashSet`,
1208/// `HashMap`, `BTreeMap`, or `BTreeSet` (unlike the primitive `f32` or `f64` types):
1209///
1210/// ```
1211/// # use ordered_float::NotNan;
1212/// # use std::collections::HashSet;
1213/// let mut s: HashSet<NotNan<f32>> = HashSet::new();
1214/// let key = NotNan::new(1.0).unwrap();
1215/// s.insert(key);
1216/// assert!(s.contains(&key));
1217/// ```
1218///
1219/// `-0.0` and `+0.0` are still considered equal. This different sign may show up in printing,
1220/// or when dividing by zero (the sign of the zero becomes the sign of the resulting infinity).
1221/// Therefore, `NotNan` may be unsuitable for use as a key in interning and memoization
1222/// applications which require equal results from equal inputs, unless signed zeros make no
1223/// difference or are canonicalized before insertion.
1224///
1225/// Arithmetic on NotNan values will panic if it produces a NaN value:
1226///
1227/// ```should_panic
1228/// # use ordered_float::NotNan;
1229/// let a = NotNan::new(std::f32::INFINITY).unwrap();
1230/// let b = NotNan::new(std::f32::NEG_INFINITY).unwrap();
1231///
1232/// // This will panic:
1233/// let c = a + b;
1234/// ```
1235///
1236/// # Representation
1237///
1238/// `NotNan` has `#[repr(transparent)]`, so it is sound to use
1239/// [transmute](core::mem::transmute) or pointer casts to convert between any type `T` and
1240/// `NotNan<T>`, as long as this does not create a NaN value.
1241/// However, consider using [`bytemuck`] as a safe alternative if possible.
1242#[cfg_attr(
1243    not(feature = "bytemuck"),
1244    doc = "[`bytemuck`]: https://docs.rs/bytemuck/1/"
1245)]
1246#[derive(PartialOrd, PartialEq, Default, Clone, Copy)]
1247#[repr(transparent)]
1248pub struct NotNan<T>(T);
1249
1250impl<T: FloatCore> NotNan<T> {
1251    /// Create a `NotNan` value.
1252    ///
1253    /// Returns `Err` if `val` is NaN
1254    pub fn new(val: T) -> Result<Self, FloatIsNan> {
1255        match val {
1256            ref val if val.is_nan() => Err(FloatIsNan),
1257            val => Ok(NotNan(val)),
1258        }
1259    }
1260}
1261
1262impl<T> NotNan<T> {
1263    /// Get the value out.
1264    #[inline]
1265    pub fn into_inner(self) -> T {
1266        self.0
1267    }
1268
1269    /// Create a `NotNan` value from a value that is guaranteed to not be NaN
1270    ///
1271    /// # Safety
1272    ///
1273    /// Behaviour is undefined if `val` is NaN
1274    #[inline]
1275    pub const unsafe fn new_unchecked(val: T) -> Self {
1276        NotNan(val)
1277    }
1278
1279    /// Create a `NotNan` value from a value that is guaranteed to not be NaN
1280    ///
1281    /// # Safety
1282    ///
1283    /// Behaviour is undefined if `val` is NaN
1284    #[deprecated(
1285        since = "2.5.0",
1286        note = "Please use the new_unchecked function instead."
1287    )]
1288    #[inline]
1289    pub const unsafe fn unchecked_new(val: T) -> Self {
1290        Self::new_unchecked(val)
1291    }
1292}
1293
1294impl<T: FloatCore> AsRef<T> for NotNan<T> {
1295    #[inline]
1296    fn as_ref(&self) -> &T {
1297        &self.0
1298    }
1299}
1300
1301impl Borrow<f32> for NotNan<f32> {
1302    #[inline]
1303    fn borrow(&self) -> &f32 {
1304        &self.0
1305    }
1306}
1307
1308impl Borrow<f64> for NotNan<f64> {
1309    #[inline]
1310    fn borrow(&self) -> &f64 {
1311        &self.0
1312    }
1313}
1314
1315#[allow(clippy::derive_ord_xor_partial_ord)]
1316impl<T: FloatCore> Ord for NotNan<T> {
1317    fn cmp(&self, other: &NotNan<T>) -> Ordering {
1318        // Can't use unreachable_unchecked because unsafe code can't depend on FloatCore impl.
1319        // https://github.com/reem/rust-ordered-float/issues/150
1320        self.partial_cmp(other)
1321            .expect("partial_cmp failed for non-NaN value")
1322    }
1323}
1324
1325impl<T: fmt::Debug> fmt::Debug for NotNan<T> {
1326    #[inline]
1327    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1328        self.0.fmt(f)
1329    }
1330}
1331
1332impl<T: FloatCore + fmt::Display> fmt::Display for NotNan<T> {
1333    #[inline]
1334    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1335        self.0.fmt(f)
1336    }
1337}
1338
1339impl NotNan<f64> {
1340    /// Converts this [`NotNan`]`<`[`f64`]`>` to a [`NotNan`]`<`[`f32`]`>` while giving up on
1341    /// precision, [using `roundTiesToEven` as rounding mode, yielding `Infinity` on
1342    /// overflow](https://doc.rust-lang.org/reference/expressions/operator-expr.html#semantics).
1343    ///
1344    /// Note: For the reverse conversion (from `NotNan<f32>` to `NotNan<f64>`), you can use
1345    /// `.into()`.
1346    pub fn as_f32(self) -> NotNan<f32> {
1347        // This is not destroying invariants, as it is a pure rounding operation. The only two
1348        // special cases are where f32 would be overflowing, then the operation yields
1349        // Infinity, or where the input is already NaN, in which case the invariant is
1350        // already broken elsewhere.
1351        NotNan(self.0 as f32)
1352    }
1353}
1354
1355impl From<NotNan<f32>> for f32 {
1356    #[inline]
1357    fn from(value: NotNan<f32>) -> Self {
1358        value.0
1359    }
1360}
1361
1362impl From<NotNan<f64>> for f64 {
1363    #[inline]
1364    fn from(value: NotNan<f64>) -> Self {
1365        value.0
1366    }
1367}
1368
1369impl TryFrom<f32> for NotNan<f32> {
1370    type Error = FloatIsNan;
1371    #[inline]
1372    fn try_from(v: f32) -> Result<Self, Self::Error> {
1373        NotNan::new(v)
1374    }
1375}
1376
1377impl TryFrom<f64> for NotNan<f64> {
1378    type Error = FloatIsNan;
1379    #[inline]
1380    fn try_from(v: f64) -> Result<Self, Self::Error> {
1381        NotNan::new(v)
1382    }
1383}
1384
1385macro_rules! impl_from_int_primitive {
1386    ($primitive:ty, $inner:ty) => {
1387        impl From<$primitive> for NotNan<$inner> {
1388            fn from(source: $primitive) -> Self {
1389                // the primitives with which this macro will be called cannot hold a value that
1390                // f64::from would convert to NaN, so this does not hurt invariants
1391                NotNan(<$inner as From<$primitive>>::from(source))
1392            }
1393        }
1394    };
1395}
1396
1397impl_from_int_primitive!(i8, f64);
1398impl_from_int_primitive!(i16, f64);
1399impl_from_int_primitive!(i32, f64);
1400impl_from_int_primitive!(u8, f64);
1401impl_from_int_primitive!(u16, f64);
1402impl_from_int_primitive!(u32, f64);
1403
1404impl_from_int_primitive!(i8, f32);
1405impl_from_int_primitive!(i16, f32);
1406impl_from_int_primitive!(u8, f32);
1407impl_from_int_primitive!(u16, f32);
1408
1409impl From<NotNan<f32>> for NotNan<f64> {
1410    #[inline]
1411    fn from(v: NotNan<f32>) -> NotNan<f64> {
1412        unsafe { NotNan::new_unchecked(v.0 as f64) }
1413    }
1414}
1415
1416impl<T: FloatCore> Deref for NotNan<T> {
1417    type Target = T;
1418
1419    #[inline]
1420    fn deref(&self) -> &Self::Target {
1421        &self.0
1422    }
1423}
1424
1425impl<T: FloatCore + PartialEq> Eq for NotNan<T> {}
1426
1427impl<T: FloatCore> PartialEq<T> for NotNan<T> {
1428    #[inline]
1429    fn eq(&self, other: &T) -> bool {
1430        self.0 == *other
1431    }
1432}
1433
1434/// Adds a float directly.
1435///
1436/// This returns a `T` and not a `NotNan<T>` because if the added value is NaN, this will be NaN
1437impl<T: FloatCore> Add<T> for NotNan<T> {
1438    type Output = T;
1439
1440    #[inline]
1441    fn add(self, other: T) -> Self::Output {
1442        self.0 + other
1443    }
1444}
1445
1446/// Adds a float directly.
1447///
1448/// Panics if the provided value is NaN.
1449impl<T: FloatCore + Sum> Sum for NotNan<T> {
1450    fn sum<I: Iterator<Item = NotNan<T>>>(iter: I) -> Self {
1451        NotNan::new(iter.map(|v| v.0).sum()).expect("Sum resulted in NaN")
1452    }
1453}
1454
1455impl<'a, T: FloatCore + Sum + 'a> Sum<&'a NotNan<T>> for NotNan<T> {
1456    #[inline]
1457    fn sum<I: Iterator<Item = &'a NotNan<T>>>(iter: I) -> Self {
1458        iter.cloned().sum()
1459    }
1460}
1461
1462/// Subtracts a float directly.
1463///
1464/// This returns a `T` and not a `NotNan<T>` because if the substracted value is NaN, this will be
1465/// NaN
1466impl<T: FloatCore> Sub<T> for NotNan<T> {
1467    type Output = T;
1468
1469    #[inline]
1470    fn sub(self, other: T) -> Self::Output {
1471        self.0 - other
1472    }
1473}
1474
1475/// Multiplies a float directly.
1476///
1477/// This returns a `T` and not a `NotNan<T>` because if the multiplied value is NaN, this will be
1478/// NaN
1479impl<T: FloatCore> Mul<T> for NotNan<T> {
1480    type Output = T;
1481
1482    #[inline]
1483    fn mul(self, other: T) -> Self::Output {
1484        self.0 * other
1485    }
1486}
1487
1488impl<T: FloatCore + Product> Product for NotNan<T> {
1489    fn product<I: Iterator<Item = NotNan<T>>>(iter: I) -> Self {
1490        NotNan::new(iter.map(|v| v.0).product()).expect("Product resulted in NaN")
1491    }
1492}
1493
1494impl<'a, T: FloatCore + Product + 'a> Product<&'a NotNan<T>> for NotNan<T> {
1495    #[inline]
1496    fn product<I: Iterator<Item = &'a NotNan<T>>>(iter: I) -> Self {
1497        iter.cloned().product()
1498    }
1499}
1500
1501/// Divides a float directly.
1502///
1503/// This returns a `T` and not a `NotNan<T>` because if the divided-by value is NaN, this will be
1504/// NaN
1505impl<T: FloatCore> Div<T> for NotNan<T> {
1506    type Output = T;
1507
1508    #[inline]
1509    fn div(self, other: T) -> Self::Output {
1510        self.0 / other
1511    }
1512}
1513
1514/// Calculates `%` with a float directly.
1515///
1516/// This returns a `T` and not a `NotNan<T>` because if the RHS is NaN, this will be NaN
1517impl<T: FloatCore> Rem<T> for NotNan<T> {
1518    type Output = T;
1519
1520    #[inline]
1521    fn rem(self, other: T) -> Self::Output {
1522        self.0 % other
1523    }
1524}
1525
1526macro_rules! impl_not_nan_binop {
1527    ($imp:ident, $method:ident, $assign_imp:ident, $assign_method:ident) => {
1528        impl<T: FloatCore> $imp for NotNan<T> {
1529            type Output = Self;
1530
1531            #[inline]
1532            fn $method(self, other: Self) -> Self {
1533                NotNan::new(self.0.$method(other.0))
1534                    .expect("Operation on two NotNan resulted in NaN")
1535            }
1536        }
1537
1538        impl<T: FloatCore> $imp<&T> for NotNan<T> {
1539            type Output = T;
1540
1541            #[inline]
1542            fn $method(self, other: &T) -> Self::Output {
1543                self.$method(*other)
1544            }
1545        }
1546
1547        impl<T: FloatCore> $imp<&Self> for NotNan<T> {
1548            type Output = NotNan<T>;
1549
1550            #[inline]
1551            fn $method(self, other: &Self) -> Self::Output {
1552                self.$method(*other)
1553            }
1554        }
1555
1556        impl<T: FloatCore> $imp for &NotNan<T> {
1557            type Output = NotNan<T>;
1558
1559            #[inline]
1560            fn $method(self, other: Self) -> Self::Output {
1561                (*self).$method(*other)
1562            }
1563        }
1564
1565        impl<T: FloatCore> $imp<NotNan<T>> for &NotNan<T> {
1566            type Output = NotNan<T>;
1567
1568            #[inline]
1569            fn $method(self, other: NotNan<T>) -> Self::Output {
1570                (*self).$method(other)
1571            }
1572        }
1573
1574        impl<T: FloatCore> $imp<T> for &NotNan<T> {
1575            type Output = T;
1576
1577            #[inline]
1578            fn $method(self, other: T) -> Self::Output {
1579                (*self).$method(other)
1580            }
1581        }
1582
1583        impl<T: FloatCore> $imp<&T> for &NotNan<T> {
1584            type Output = T;
1585
1586            #[inline]
1587            fn $method(self, other: &T) -> Self::Output {
1588                (*self).$method(*other)
1589            }
1590        }
1591
1592        impl<T: FloatCore + $assign_imp> $assign_imp for NotNan<T> {
1593            #[inline]
1594            fn $assign_method(&mut self, other: Self) {
1595                *self = (*self).$method(other);
1596            }
1597        }
1598
1599        impl<T: FloatCore + $assign_imp> $assign_imp<&Self> for NotNan<T> {
1600            #[inline]
1601            fn $assign_method(&mut self, other: &Self) {
1602                *self = (*self).$method(*other);
1603            }
1604        }
1605    };
1606}
1607
1608impl_not_nan_binop! {Add, add, AddAssign, add_assign}
1609impl_not_nan_binop! {Sub, sub, SubAssign, sub_assign}
1610impl_not_nan_binop! {Mul, mul, MulAssign, mul_assign}
1611impl_not_nan_binop! {Div, div, DivAssign, div_assign}
1612impl_not_nan_binop! {Rem, rem, RemAssign, rem_assign}
1613
1614// Will panic if NaN value is return from the operation
1615macro_rules! impl_not_nan_pow {
1616    ($inner:ty, $rhs:ty) => {
1617        #[cfg(any(feature = "std", feature = "libm"))]
1618        impl Pow<$rhs> for NotNan<$inner> {
1619            type Output = NotNan<$inner>;
1620            #[inline]
1621            fn pow(self, rhs: $rhs) -> NotNan<$inner> {
1622                NotNan::new(<$inner>::pow(self.0, rhs)).expect("Pow resulted in NaN")
1623            }
1624        }
1625
1626        #[cfg(any(feature = "std", feature = "libm"))]
1627        impl<'a> Pow<&'a $rhs> for NotNan<$inner> {
1628            type Output = NotNan<$inner>;
1629            #[inline]
1630            fn pow(self, rhs: &'a $rhs) -> NotNan<$inner> {
1631                NotNan::new(<$inner>::pow(self.0, *rhs)).expect("Pow resulted in NaN")
1632            }
1633        }
1634
1635        #[cfg(any(feature = "std", feature = "libm"))]
1636        impl<'a> Pow<$rhs> for &'a NotNan<$inner> {
1637            type Output = NotNan<$inner>;
1638            #[inline]
1639            fn pow(self, rhs: $rhs) -> NotNan<$inner> {
1640                NotNan::new(<$inner>::pow(self.0, rhs)).expect("Pow resulted in NaN")
1641            }
1642        }
1643
1644        #[cfg(any(feature = "std", feature = "libm"))]
1645        impl<'a, 'b> Pow<&'a $rhs> for &'b NotNan<$inner> {
1646            type Output = NotNan<$inner>;
1647            #[inline]
1648            fn pow(self, rhs: &'a $rhs) -> NotNan<$inner> {
1649                NotNan::new(<$inner>::pow(self.0, *rhs)).expect("Pow resulted in NaN")
1650            }
1651        }
1652    };
1653}
1654
1655impl_not_nan_pow! {f32, i8}
1656impl_not_nan_pow! {f32, i16}
1657impl_not_nan_pow! {f32, u8}
1658impl_not_nan_pow! {f32, u16}
1659impl_not_nan_pow! {f32, i32}
1660impl_not_nan_pow! {f64, i8}
1661impl_not_nan_pow! {f64, i16}
1662impl_not_nan_pow! {f64, u8}
1663impl_not_nan_pow! {f64, u16}
1664impl_not_nan_pow! {f64, i32}
1665impl_not_nan_pow! {f32, f32}
1666impl_not_nan_pow! {f64, f32}
1667impl_not_nan_pow! {f64, f64}
1668
1669// This also should panic on NaN
1670macro_rules! impl_not_nan_self_pow {
1671    ($base:ty, $exp:ty) => {
1672        #[cfg(any(feature = "std", feature = "libm"))]
1673        impl Pow<NotNan<$exp>> for NotNan<$base> {
1674            type Output = NotNan<$base>;
1675            #[inline]
1676            fn pow(self, rhs: NotNan<$exp>) -> NotNan<$base> {
1677                NotNan::new(self.0.pow(rhs.0)).expect("Pow resulted in NaN")
1678            }
1679        }
1680
1681        #[cfg(any(feature = "std", feature = "libm"))]
1682        impl<'a> Pow<&'a NotNan<$exp>> for NotNan<$base> {
1683            type Output = NotNan<$base>;
1684            #[inline]
1685            fn pow(self, rhs: &'a NotNan<$exp>) -> NotNan<$base> {
1686                NotNan::new(self.0.pow(rhs.0)).expect("Pow resulted in NaN")
1687            }
1688        }
1689
1690        #[cfg(any(feature = "std", feature = "libm"))]
1691        impl<'a> Pow<NotNan<$exp>> for &'a NotNan<$base> {
1692            type Output = NotNan<$base>;
1693            #[inline]
1694            fn pow(self, rhs: NotNan<$exp>) -> NotNan<$base> {
1695                NotNan::new(self.0.pow(rhs.0)).expect("Pow resulted in NaN")
1696            }
1697        }
1698
1699        #[cfg(any(feature = "std", feature = "libm"))]
1700        impl<'a, 'b> Pow<&'a NotNan<$exp>> for &'b NotNan<$base> {
1701            type Output = NotNan<$base>;
1702            #[inline]
1703            fn pow(self, rhs: &'a NotNan<$exp>) -> NotNan<$base> {
1704                NotNan::new(self.0.pow(rhs.0)).expect("Pow resulted in NaN")
1705            }
1706        }
1707    };
1708}
1709
1710impl_not_nan_self_pow! {f32, f32}
1711impl_not_nan_self_pow! {f64, f32}
1712impl_not_nan_self_pow! {f64, f64}
1713
1714impl<T: FloatCore> Neg for NotNan<T> {
1715    type Output = Self;
1716
1717    #[inline]
1718    fn neg(self) -> Self {
1719        NotNan(-self.0)
1720    }
1721}
1722
1723impl<T: FloatCore> Neg for &NotNan<T> {
1724    type Output = NotNan<T>;
1725
1726    #[inline]
1727    fn neg(self) -> Self::Output {
1728        NotNan(-self.0)
1729    }
1730}
1731
1732/// An error indicating an attempt to construct NotNan from a NaN
1733#[derive(Copy, Clone, PartialEq, Eq, Debug)]
1734pub struct FloatIsNan;
1735
1736#[cfg(feature = "std")]
1737impl Error for FloatIsNan {
1738    fn description(&self) -> &str {
1739        "NotNan constructed with NaN"
1740    }
1741}
1742
1743impl fmt::Display for FloatIsNan {
1744    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1745        write!(f, "NotNan constructed with NaN")
1746    }
1747}
1748
1749#[cfg(feature = "std")]
1750impl From<FloatIsNan> for std::io::Error {
1751    #[inline]
1752    fn from(e: FloatIsNan) -> std::io::Error {
1753        std::io::Error::new(std::io::ErrorKind::InvalidInput, e)
1754    }
1755}
1756
1757impl<T: FloatCore> Zero for NotNan<T> {
1758    #[inline]
1759    fn zero() -> Self {
1760        NotNan(T::zero())
1761    }
1762
1763    #[inline]
1764    fn is_zero(&self) -> bool {
1765        self.0.is_zero()
1766    }
1767}
1768
1769impl<T: FloatCore> One for NotNan<T> {
1770    #[inline]
1771    fn one() -> Self {
1772        NotNan(T::one())
1773    }
1774}
1775
1776impl<T: FloatCore> Bounded for NotNan<T> {
1777    #[inline]
1778    fn min_value() -> Self {
1779        NotNan(T::min_value())
1780    }
1781
1782    #[inline]
1783    fn max_value() -> Self {
1784        NotNan(T::max_value())
1785    }
1786}
1787
1788impl<T: FloatCore + FromStr> FromStr for NotNan<T> {
1789    type Err = ParseNotNanError<T::Err>;
1790
1791    /// Convert a &str to `NotNan`. Returns an error if the string fails to parse,
1792    /// or if the resulting value is NaN
1793    ///
1794    /// ```
1795    /// use ordered_float::NotNan;
1796    ///
1797    /// assert!("-10".parse::<NotNan<f32>>().is_ok());
1798    /// assert!("abc".parse::<NotNan<f32>>().is_err());
1799    /// assert!("NaN".parse::<NotNan<f32>>().is_err());
1800    /// ```
1801    fn from_str(src: &str) -> Result<Self, Self::Err> {
1802        src.parse()
1803            .map_err(ParseNotNanError::ParseFloatError)
1804            .and_then(|f| NotNan::new(f).map_err(|_| ParseNotNanError::IsNaN))
1805    }
1806}
1807
1808impl<T: FloatCore + FromPrimitive> FromPrimitive for NotNan<T> {
1809    fn from_i64(n: i64) -> Option<Self> {
1810        T::from_i64(n).and_then(|n| NotNan::new(n).ok())
1811    }
1812    fn from_u64(n: u64) -> Option<Self> {
1813        T::from_u64(n).and_then(|n| NotNan::new(n).ok())
1814    }
1815
1816    fn from_isize(n: isize) -> Option<Self> {
1817        T::from_isize(n).and_then(|n| NotNan::new(n).ok())
1818    }
1819    fn from_i8(n: i8) -> Option<Self> {
1820        T::from_i8(n).and_then(|n| NotNan::new(n).ok())
1821    }
1822    fn from_i16(n: i16) -> Option<Self> {
1823        T::from_i16(n).and_then(|n| NotNan::new(n).ok())
1824    }
1825    fn from_i32(n: i32) -> Option<Self> {
1826        T::from_i32(n).and_then(|n| NotNan::new(n).ok())
1827    }
1828    fn from_usize(n: usize) -> Option<Self> {
1829        T::from_usize(n).and_then(|n| NotNan::new(n).ok())
1830    }
1831    fn from_u8(n: u8) -> Option<Self> {
1832        T::from_u8(n).and_then(|n| NotNan::new(n).ok())
1833    }
1834    fn from_u16(n: u16) -> Option<Self> {
1835        T::from_u16(n).and_then(|n| NotNan::new(n).ok())
1836    }
1837    fn from_u32(n: u32) -> Option<Self> {
1838        T::from_u32(n).and_then(|n| NotNan::new(n).ok())
1839    }
1840    fn from_f32(n: f32) -> Option<Self> {
1841        T::from_f32(n).and_then(|n| NotNan::new(n).ok())
1842    }
1843    fn from_f64(n: f64) -> Option<Self> {
1844        T::from_f64(n).and_then(|n| NotNan::new(n).ok())
1845    }
1846}
1847
1848impl<T: FloatCore> ToPrimitive for NotNan<T> {
1849    fn to_i64(&self) -> Option<i64> {
1850        self.0.to_i64()
1851    }
1852    fn to_u64(&self) -> Option<u64> {
1853        self.0.to_u64()
1854    }
1855
1856    fn to_isize(&self) -> Option<isize> {
1857        self.0.to_isize()
1858    }
1859    fn to_i8(&self) -> Option<i8> {
1860        self.0.to_i8()
1861    }
1862    fn to_i16(&self) -> Option<i16> {
1863        self.0.to_i16()
1864    }
1865    fn to_i32(&self) -> Option<i32> {
1866        self.0.to_i32()
1867    }
1868    fn to_usize(&self) -> Option<usize> {
1869        self.0.to_usize()
1870    }
1871    fn to_u8(&self) -> Option<u8> {
1872        self.0.to_u8()
1873    }
1874    fn to_u16(&self) -> Option<u16> {
1875        self.0.to_u16()
1876    }
1877    fn to_u32(&self) -> Option<u32> {
1878        self.0.to_u32()
1879    }
1880    fn to_f32(&self) -> Option<f32> {
1881        self.0.to_f32()
1882    }
1883    fn to_f64(&self) -> Option<f64> {
1884        self.0.to_f64()
1885    }
1886}
1887
1888/// An error indicating a parse error from a string for `NotNan`.
1889#[derive(Copy, Clone, PartialEq, Eq, Debug)]
1890pub enum ParseNotNanError<E> {
1891    /// A plain parse error from the underlying float type.
1892    ParseFloatError(E),
1893    /// The parsed float value resulted in a NaN.
1894    IsNaN,
1895}
1896
1897#[cfg(feature = "std")]
1898impl<E: fmt::Debug + Error + 'static> Error for ParseNotNanError<E> {
1899    fn description(&self) -> &str {
1900        "Error parsing a not-NaN floating point value"
1901    }
1902
1903    fn source(&self) -> Option<&(dyn Error + 'static)> {
1904        match self {
1905            ParseNotNanError::ParseFloatError(e) => Some(e),
1906            ParseNotNanError::IsNaN => None,
1907        }
1908    }
1909}
1910
1911impl<E: fmt::Display> fmt::Display for ParseNotNanError<E> {
1912    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1913        match self {
1914            ParseNotNanError::ParseFloatError(e) => write!(f, "Parse error: {}", e),
1915            ParseNotNanError::IsNaN => write!(f, "NotNan parser encounter a NaN"),
1916        }
1917    }
1918}
1919
1920impl<T: FloatCore> Num for NotNan<T> {
1921    type FromStrRadixErr = ParseNotNanError<T::FromStrRadixErr>;
1922
1923    fn from_str_radix(src: &str, radix: u32) -> Result<Self, Self::FromStrRadixErr> {
1924        T::from_str_radix(src, radix)
1925            .map_err(ParseNotNanError::ParseFloatError)
1926            .and_then(|n| NotNan::new(n).map_err(|_| ParseNotNanError::IsNaN))
1927    }
1928}
1929
1930impl<T: FloatCore + Signed> Signed for NotNan<T> {
1931    #[inline]
1932    fn abs(&self) -> Self {
1933        NotNan(self.0.abs())
1934    }
1935
1936    fn abs_sub(&self, other: &Self) -> Self {
1937        NotNan::new(Signed::abs_sub(&self.0, &other.0)).expect("Subtraction resulted in NaN")
1938    }
1939
1940    #[inline]
1941    fn signum(&self) -> Self {
1942        NotNan(self.0.signum())
1943    }
1944    #[inline]
1945    fn is_positive(&self) -> bool {
1946        self.0.is_positive()
1947    }
1948    #[inline]
1949    fn is_negative(&self) -> bool {
1950        self.0.is_negative()
1951    }
1952}
1953
1954impl<T: FloatCore> NumCast for NotNan<T> {
1955    fn from<F: ToPrimitive>(n: F) -> Option<Self> {
1956        T::from(n).and_then(|n| NotNan::new(n).ok())
1957    }
1958}
1959
1960macro_rules! impl_float_const_method {
1961    ($wrapper:expr, $method:ident) => {
1962        #[allow(non_snake_case)]
1963        #[allow(clippy::redundant_closure_call)]
1964        fn $method() -> Self {
1965            $wrapper(T::$method())
1966        }
1967    };
1968}
1969
1970macro_rules! impl_float_const {
1971    ($type:ident, $wrapper:expr) => {
1972        impl<T: FloatConst> FloatConst for $type<T> {
1973            impl_float_const_method!($wrapper, E);
1974            impl_float_const_method!($wrapper, FRAC_1_PI);
1975            impl_float_const_method!($wrapper, FRAC_1_SQRT_2);
1976            impl_float_const_method!($wrapper, FRAC_2_PI);
1977            impl_float_const_method!($wrapper, FRAC_2_SQRT_PI);
1978            impl_float_const_method!($wrapper, FRAC_PI_2);
1979            impl_float_const_method!($wrapper, FRAC_PI_3);
1980            impl_float_const_method!($wrapper, FRAC_PI_4);
1981            impl_float_const_method!($wrapper, FRAC_PI_6);
1982            impl_float_const_method!($wrapper, FRAC_PI_8);
1983            impl_float_const_method!($wrapper, LN_10);
1984            impl_float_const_method!($wrapper, LN_2);
1985            impl_float_const_method!($wrapper, LOG10_E);
1986            impl_float_const_method!($wrapper, LOG2_E);
1987            impl_float_const_method!($wrapper, PI);
1988            impl_float_const_method!($wrapper, SQRT_2);
1989        }
1990    };
1991}
1992
1993impl_float_const!(OrderedFloat, OrderedFloat);
1994// Float constants are not NaN.
1995impl_float_const!(NotNan, |x| unsafe { NotNan::new_unchecked(x) });
1996
1997// canonical raw bit patterns (for hashing)
1998
1999mod hash_internals {
2000    pub trait SealedTrait: Copy + num_traits::float::FloatCore {
2001        type Bits: core::hash::Hash;
2002
2003        const CANONICAL_NAN_BITS: Self::Bits;
2004
2005        fn canonical_bits(self) -> Self::Bits;
2006    }
2007
2008    impl SealedTrait for f32 {
2009        type Bits = u32;
2010
2011        const CANONICAL_NAN_BITS: u32 = 0x7fc00000;
2012
2013        fn canonical_bits(self) -> u32 {
2014            // -0.0 + 0.0 == +0.0 under IEEE754 roundTiesToEven rounding mode,
2015            // which Rust guarantees. Thus by adding a positive zero we
2016            // canonicalize signed zero without any branches in one instruction.
2017            (self + 0.0).to_bits()
2018        }
2019    }
2020
2021    impl SealedTrait for f64 {
2022        type Bits = u64;
2023
2024        const CANONICAL_NAN_BITS: u64 = 0x7ff8000000000000;
2025
2026        fn canonical_bits(self) -> u64 {
2027            (self + 0.0).to_bits()
2028        }
2029    }
2030}
2031
2032/// The built-in floating point types `f32` and `f64`.
2033///
2034/// This is a "sealed" trait that cannot be implemented for any other types.
2035pub trait PrimitiveFloat: hash_internals::SealedTrait {}
2036impl PrimitiveFloat for f32 {}
2037impl PrimitiveFloat for f64 {}
2038
2039impl<T: PrimitiveFloat> Hash for OrderedFloat<T> {
2040    fn hash<H: Hasher>(&self, hasher: &mut H) {
2041        let bits = if self.0.is_nan() {
2042            T::CANONICAL_NAN_BITS
2043        } else {
2044            self.0.canonical_bits()
2045        };
2046        bits.hash(hasher);
2047    }
2048}
2049
2050impl<T: PrimitiveFloat> Hash for NotNan<T> {
2051    fn hash<H: Hasher>(&self, hasher: &mut H) {
2052        self.0.canonical_bits().hash(hasher);
2053    }
2054}
2055
2056#[cfg(feature = "serde")]
2057mod impl_serde {
2058    extern crate serde;
2059    use self::serde::de::{Error, Unexpected};
2060    use self::serde::{Deserialize, Deserializer, Serialize, Serializer};
2061    use super::{NotNan, OrderedFloat};
2062    use core::f64;
2063    use num_traits::float::FloatCore;
2064
2065    #[cfg(test)]
2066    extern crate serde_test;
2067    #[cfg(test)]
2068    use self::serde_test::{assert_de_tokens_error, assert_tokens, Token};
2069
2070    impl<T: FloatCore + Serialize> Serialize for OrderedFloat<T> {
2071        #[inline]
2072        fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2073            self.0.serialize(s)
2074        }
2075    }
2076
2077    impl<'de, T: FloatCore + Deserialize<'de>> Deserialize<'de> for OrderedFloat<T> {
2078        #[inline]
2079        fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
2080            T::deserialize(d).map(OrderedFloat)
2081        }
2082    }
2083
2084    impl<T: FloatCore + Serialize> Serialize for NotNan<T> {
2085        #[inline]
2086        fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
2087            self.0.serialize(s)
2088        }
2089    }
2090
2091    impl<'de, T: FloatCore + Deserialize<'de>> Deserialize<'de> for NotNan<T> {
2092        fn deserialize<D: Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
2093            let float = T::deserialize(d)?;
2094            NotNan::new(float).map_err(|_| {
2095                Error::invalid_value(Unexpected::Float(f64::NAN), &"float (but not NaN)")
2096            })
2097        }
2098    }
2099
2100    #[test]
2101    fn test_ordered_float() {
2102        let float = OrderedFloat(1.0f64);
2103        assert_tokens(&float, &[Token::F64(1.0)]);
2104    }
2105
2106    #[test]
2107    fn test_not_nan() {
2108        let float = NotNan(1.0f64);
2109        assert_tokens(&float, &[Token::F64(1.0)]);
2110    }
2111
2112    #[test]
2113    fn test_fail_on_nan() {
2114        assert_de_tokens_error::<NotNan<f64>>(
2115            &[Token::F64(f64::NAN)],
2116            "invalid value: floating point `NaN`, expected float (but not NaN)",
2117        );
2118    }
2119}
2120
2121#[cfg(any(feature = "rkyv_16", feature = "rkyv_32", feature = "rkyv_64"))]
2122mod impl_rkyv {
2123    use super::{NotNan, OrderedFloat};
2124    use num_traits::float::FloatCore;
2125    #[cfg(test)]
2126    use rkyv::{archived_root, ser::Serializer};
2127    use rkyv::{Archive, Deserialize, Fallible, Serialize};
2128
2129    #[cfg(test)]
2130    type DefaultSerializer = rkyv::ser::serializers::CoreSerializer<16, 16>;
2131    #[cfg(test)]
2132    type DefaultDeserializer = rkyv::Infallible;
2133
2134    impl<T: FloatCore + Archive> Archive for OrderedFloat<T> {
2135        type Archived = OrderedFloat<T::Archived>;
2136
2137        type Resolver = T::Resolver;
2138
2139        unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) {
2140            self.0.resolve(pos, resolver, out.cast())
2141        }
2142    }
2143
2144    impl<T: FloatCore + Serialize<S>, S: Fallible + ?Sized> Serialize<S> for OrderedFloat<T> {
2145        fn serialize(&self, s: &mut S) -> Result<Self::Resolver, S::Error> {
2146            self.0.serialize(s)
2147        }
2148    }
2149
2150    impl<T: FloatCore, AT: Deserialize<T, D>, D: Fallible + ?Sized> Deserialize<OrderedFloat<T>, D>
2151        for OrderedFloat<AT>
2152    {
2153        fn deserialize(&self, d: &mut D) -> Result<OrderedFloat<T>, D::Error> {
2154            self.0.deserialize(d).map(OrderedFloat)
2155        }
2156    }
2157
2158    impl<T: FloatCore + Archive> Archive for NotNan<T> {
2159        type Archived = NotNan<T::Archived>;
2160
2161        type Resolver = T::Resolver;
2162
2163        unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) {
2164            self.0.resolve(pos, resolver, out.cast())
2165        }
2166    }
2167
2168    impl<T: FloatCore + Serialize<S>, S: Fallible + ?Sized> Serialize<S> for NotNan<T> {
2169        fn serialize(&self, s: &mut S) -> Result<Self::Resolver, S::Error> {
2170            self.0.serialize(s)
2171        }
2172    }
2173
2174    impl<T: FloatCore, AT: Deserialize<T, D>, D: Fallible + ?Sized> Deserialize<NotNan<T>, D>
2175        for NotNan<AT>
2176    {
2177        fn deserialize(&self, d: &mut D) -> Result<NotNan<T>, D::Error> {
2178            self.0.deserialize(d).map(NotNan)
2179        }
2180    }
2181
2182    macro_rules! rkyv_eq_ord {
2183        ($main:ident, $float:ty, $rend:ty) => {
2184            impl PartialEq<$main<$float>> for $main<$rend> {
2185                fn eq(&self, other: &$main<$float>) -> bool {
2186                    other.eq(&self.0.value())
2187                }
2188            }
2189            impl PartialEq<$main<$rend>> for $main<$float> {
2190                fn eq(&self, other: &$main<$rend>) -> bool {
2191                    self.eq(&other.0.value())
2192                }
2193            }
2194
2195            impl PartialOrd<$main<$float>> for $main<$rend> {
2196                fn partial_cmp(&self, other: &$main<$float>) -> Option<core::cmp::Ordering> {
2197                    self.0.value().partial_cmp(other)
2198                }
2199            }
2200
2201            impl PartialOrd<$main<$rend>> for $main<$float> {
2202                fn partial_cmp(&self, other: &$main<$rend>) -> Option<core::cmp::Ordering> {
2203                    other
2204                        .0
2205                        .value()
2206                        .partial_cmp(self)
2207                        .map(core::cmp::Ordering::reverse)
2208                }
2209            }
2210        };
2211    }
2212
2213    rkyv_eq_ord! { OrderedFloat, f32, rkyv::rend::f32_le }
2214    rkyv_eq_ord! { OrderedFloat, f32, rkyv::rend::f32_be }
2215    rkyv_eq_ord! { OrderedFloat, f64, rkyv::rend::f64_le }
2216    rkyv_eq_ord! { OrderedFloat, f64, rkyv::rend::f64_be }
2217    rkyv_eq_ord! { NotNan, f32, rkyv::rend::f32_le }
2218    rkyv_eq_ord! { NotNan, f32, rkyv::rend::f32_be }
2219    rkyv_eq_ord! { NotNan, f64, rkyv::rend::f64_le }
2220    rkyv_eq_ord! { NotNan, f64, rkyv::rend::f64_be }
2221
2222    #[cfg(feature = "rkyv_ck")]
2223    use super::FloatIsNan;
2224    #[cfg(feature = "rkyv_ck")]
2225    use core::convert::Infallible;
2226    #[cfg(feature = "rkyv_ck")]
2227    use rkyv::bytecheck::CheckBytes;
2228
2229    #[cfg(feature = "rkyv_ck")]
2230    impl<C: ?Sized, T: FloatCore + CheckBytes<C>> CheckBytes<C> for OrderedFloat<T> {
2231        type Error = Infallible;
2232
2233        #[inline]
2234        unsafe fn check_bytes<'a>(value: *const Self, _: &mut C) -> Result<&'a Self, Self::Error> {
2235            Ok(&*value)
2236        }
2237    }
2238
2239    #[cfg(feature = "rkyv_ck")]
2240    impl<C: ?Sized, T: FloatCore + CheckBytes<C>> CheckBytes<C> for NotNan<T> {
2241        type Error = FloatIsNan;
2242
2243        #[inline]
2244        unsafe fn check_bytes<'a>(value: *const Self, _: &mut C) -> Result<&'a Self, Self::Error> {
2245            Self::new(*(value as *const T)).map(|_| &*value)
2246        }
2247    }
2248
2249    #[test]
2250    fn test_ordered_float() {
2251        let float = OrderedFloat(1.0f64);
2252        let mut serializer = DefaultSerializer::default();
2253        serializer
2254            .serialize_value(&float)
2255            .expect("failed to archive value");
2256        let len = serializer.pos();
2257        let buffer = serializer.into_serializer().into_inner();
2258
2259        let archived_value = unsafe { archived_root::<OrderedFloat<f64>>(&buffer[0..len]) };
2260        assert_eq!(archived_value, &float);
2261        let mut deserializer = DefaultDeserializer::default();
2262        let deser_float: OrderedFloat<f64> = archived_value.deserialize(&mut deserializer).unwrap();
2263        assert_eq!(deser_float, float);
2264    }
2265
2266    #[test]
2267    fn test_not_nan() {
2268        let float = NotNan(1.0f64);
2269        let mut serializer = DefaultSerializer::default();
2270        serializer
2271            .serialize_value(&float)
2272            .expect("failed to archive value");
2273        let len = serializer.pos();
2274        let buffer = serializer.into_serializer().into_inner();
2275
2276        let archived_value = unsafe { archived_root::<NotNan<f64>>(&buffer[0..len]) };
2277        assert_eq!(archived_value, &float);
2278        let mut deserializer = DefaultDeserializer::default();
2279        let deser_float: NotNan<f64> = archived_value.deserialize(&mut deserializer).unwrap();
2280        assert_eq!(deser_float, float);
2281    }
2282}
2283
2284#[cfg(feature = "speedy")]
2285mod impl_speedy {
2286    use super::{NotNan, OrderedFloat};
2287    use num_traits::float::FloatCore;
2288    use speedy::{Context, Readable, Reader, Writable, Writer};
2289
2290    impl<C, T> Writable<C> for OrderedFloat<T>
2291    where
2292        C: Context,
2293        T: Writable<C>,
2294    {
2295        fn write_to<W: ?Sized + Writer<C>>(&self, writer: &mut W) -> Result<(), C::Error> {
2296            self.0.write_to(writer)
2297        }
2298
2299        fn bytes_needed(&self) -> Result<usize, C::Error> {
2300            self.0.bytes_needed()
2301        }
2302    }
2303
2304    impl<C, T> Writable<C> for NotNan<T>
2305    where
2306        C: Context,
2307        T: Writable<C>,
2308    {
2309        fn write_to<W: ?Sized + Writer<C>>(&self, writer: &mut W) -> Result<(), C::Error> {
2310            self.0.write_to(writer)
2311        }
2312
2313        fn bytes_needed(&self) -> Result<usize, C::Error> {
2314            self.0.bytes_needed()
2315        }
2316    }
2317
2318    impl<'a, T, C: Context> Readable<'a, C> for OrderedFloat<T>
2319    where
2320        T: Readable<'a, C>,
2321    {
2322        fn read_from<R: Reader<'a, C>>(reader: &mut R) -> Result<Self, C::Error> {
2323            T::read_from(reader).map(OrderedFloat)
2324        }
2325
2326        fn minimum_bytes_needed() -> usize {
2327            T::minimum_bytes_needed()
2328        }
2329    }
2330
2331    impl<'a, T: FloatCore, C: Context> Readable<'a, C> for NotNan<T>
2332    where
2333        T: Readable<'a, C>,
2334    {
2335        fn read_from<R: Reader<'a, C>>(reader: &mut R) -> Result<Self, C::Error> {
2336            let value: T = reader.read_value()?;
2337            Self::new(value).map_err(|error| {
2338                speedy::Error::custom(std::format!("failed to read NotNan: {}", error)).into()
2339            })
2340        }
2341
2342        fn minimum_bytes_needed() -> usize {
2343            T::minimum_bytes_needed()
2344        }
2345    }
2346
2347    #[test]
2348    fn test_ordered_float() {
2349        let float = OrderedFloat(1.0f64);
2350        let buffer = float.write_to_vec().unwrap();
2351        let deser_float: OrderedFloat<f64> = OrderedFloat::read_from_buffer(&buffer).unwrap();
2352        assert_eq!(deser_float, float);
2353    }
2354
2355    #[test]
2356    fn test_not_nan() {
2357        let float = NotNan(1.0f64);
2358        let buffer = float.write_to_vec().unwrap();
2359        let deser_float: NotNan<f64> = NotNan::read_from_buffer(&buffer).unwrap();
2360        assert_eq!(deser_float, float);
2361    }
2362
2363    #[test]
2364    fn test_not_nan_with_nan() {
2365        let nan_buf = f64::nan().write_to_vec().unwrap();
2366        let nan_err: Result<NotNan<f64>, _> = NotNan::read_from_buffer(&nan_buf);
2367        assert!(nan_err.is_err());
2368    }
2369}
2370
2371#[cfg(feature = "borsh")]
2372mod impl_borsh {
2373    extern crate borsh;
2374    use super::{NotNan, OrderedFloat};
2375    use num_traits::float::FloatCore;
2376
2377    impl<T> borsh::BorshSerialize for OrderedFloat<T>
2378    where
2379        T: borsh::BorshSerialize,
2380    {
2381        #[inline]
2382        fn serialize<W: borsh::io::Write>(&self, writer: &mut W) -> borsh::io::Result<()> {
2383            <T as borsh::BorshSerialize>::serialize(&self.0, writer)
2384        }
2385    }
2386
2387    impl<T> borsh::BorshDeserialize for OrderedFloat<T>
2388    where
2389        T: borsh::BorshDeserialize,
2390    {
2391        #[inline]
2392        fn deserialize_reader<R: borsh::io::Read>(reader: &mut R) -> borsh::io::Result<Self> {
2393            <T as borsh::BorshDeserialize>::deserialize_reader(reader).map(Self)
2394        }
2395    }
2396
2397    impl<T> borsh::BorshSerialize for NotNan<T>
2398    where
2399        T: borsh::BorshSerialize,
2400    {
2401        #[inline]
2402        fn serialize<W: borsh::io::Write>(&self, writer: &mut W) -> borsh::io::Result<()> {
2403            <T as borsh::BorshSerialize>::serialize(&self.0, writer)
2404        }
2405    }
2406
2407    impl<T> borsh::BorshDeserialize for NotNan<T>
2408    where
2409        T: FloatCore + borsh::BorshDeserialize,
2410    {
2411        #[inline]
2412        fn deserialize_reader<R: borsh::io::Read>(reader: &mut R) -> borsh::io::Result<Self> {
2413            let float = <T as borsh::BorshDeserialize>::deserialize_reader(reader)?;
2414            NotNan::new(float).map_err(|_| {
2415                borsh::io::Error::new(
2416                    borsh::io::ErrorKind::InvalidData,
2417                    "expected a non-NaN float",
2418                )
2419            })
2420        }
2421    }
2422
2423    #[test]
2424    fn test_ordered_float() {
2425        let float = crate::OrderedFloat(1.0f64);
2426        let buffer = borsh::to_vec(&float).expect("failed to serialize value");
2427        let deser_float: crate::OrderedFloat<f64> =
2428            borsh::from_slice(&buffer).expect("failed to deserialize value");
2429        assert_eq!(deser_float, float);
2430    }
2431
2432    #[test]
2433    fn test_not_nan() {
2434        let float = crate::NotNan(1.0f64);
2435        let buffer = borsh::to_vec(&float).expect("failed to serialize value");
2436        let deser_float: crate::NotNan<f64> =
2437            borsh::from_slice(&buffer).expect("failed to deserialize value");
2438        assert_eq!(deser_float, float);
2439    }
2440}
2441
2442#[cfg(all(feature = "std", feature = "schemars"))]
2443mod impl_schemars {
2444    extern crate schemars;
2445    use self::schemars::gen::SchemaGenerator;
2446    use self::schemars::schema::{InstanceType, Schema, SchemaObject};
2447    use super::{NotNan, OrderedFloat};
2448
2449    macro_rules! primitive_float_impl {
2450        ($type:ty, $schema_name:literal) => {
2451            impl schemars::JsonSchema for $type {
2452                fn is_referenceable() -> bool {
2453                    false
2454                }
2455
2456                fn schema_name() -> std::string::String {
2457                    std::string::String::from($schema_name)
2458                }
2459
2460                fn json_schema(_: &mut SchemaGenerator) -> Schema {
2461                    SchemaObject {
2462                        instance_type: Some(InstanceType::Number.into()),
2463                        format: Some(std::string::String::from($schema_name)),
2464                        ..Default::default()
2465                    }
2466                    .into()
2467                }
2468            }
2469        };
2470    }
2471
2472    primitive_float_impl!(OrderedFloat<f32>, "float");
2473    primitive_float_impl!(OrderedFloat<f64>, "double");
2474    primitive_float_impl!(NotNan<f32>, "float");
2475    primitive_float_impl!(NotNan<f64>, "double");
2476
2477    #[test]
2478    fn schema_generation_does_not_panic_for_common_floats() {
2479        {
2480            let schema = schemars::gen::SchemaGenerator::default()
2481                .into_root_schema_for::<OrderedFloat<f32>>();
2482            assert_eq!(
2483                schema.schema.instance_type,
2484                Some(schemars::schema::SingleOrVec::Single(std::boxed::Box::new(
2485                    schemars::schema::InstanceType::Number
2486                )))
2487            );
2488            assert_eq!(
2489                schema.schema.metadata.unwrap().title.unwrap(),
2490                std::string::String::from("float")
2491            );
2492        }
2493        {
2494            let schema = schemars::gen::SchemaGenerator::default()
2495                .into_root_schema_for::<OrderedFloat<f64>>();
2496            assert_eq!(
2497                schema.schema.instance_type,
2498                Some(schemars::schema::SingleOrVec::Single(std::boxed::Box::new(
2499                    schemars::schema::InstanceType::Number
2500                )))
2501            );
2502            assert_eq!(
2503                schema.schema.metadata.unwrap().title.unwrap(),
2504                std::string::String::from("double")
2505            );
2506        }
2507        {
2508            let schema =
2509                schemars::gen::SchemaGenerator::default().into_root_schema_for::<NotNan<f32>>();
2510            assert_eq!(
2511                schema.schema.instance_type,
2512                Some(schemars::schema::SingleOrVec::Single(std::boxed::Box::new(
2513                    schemars::schema::InstanceType::Number
2514                )))
2515            );
2516            assert_eq!(
2517                schema.schema.metadata.unwrap().title.unwrap(),
2518                std::string::String::from("float")
2519            );
2520        }
2521        {
2522            let schema =
2523                schemars::gen::SchemaGenerator::default().into_root_schema_for::<NotNan<f64>>();
2524            assert_eq!(
2525                schema.schema.instance_type,
2526                Some(schemars::schema::SingleOrVec::Single(std::boxed::Box::new(
2527                    schemars::schema::InstanceType::Number
2528                )))
2529            );
2530            assert_eq!(
2531                schema.schema.metadata.unwrap().title.unwrap(),
2532                std::string::String::from("double")
2533            );
2534        }
2535    }
2536    #[test]
2537    fn ordered_float_schema_match_primitive_schema() {
2538        {
2539            let of_schema = schemars::gen::SchemaGenerator::default()
2540                .into_root_schema_for::<OrderedFloat<f32>>();
2541            let prim_schema =
2542                schemars::gen::SchemaGenerator::default().into_root_schema_for::<f32>();
2543            assert_eq!(of_schema, prim_schema);
2544        }
2545        {
2546            let of_schema = schemars::gen::SchemaGenerator::default()
2547                .into_root_schema_for::<OrderedFloat<f64>>();
2548            let prim_schema =
2549                schemars::gen::SchemaGenerator::default().into_root_schema_for::<f64>();
2550            assert_eq!(of_schema, prim_schema);
2551        }
2552        {
2553            let of_schema =
2554                schemars::gen::SchemaGenerator::default().into_root_schema_for::<NotNan<f32>>();
2555            let prim_schema =
2556                schemars::gen::SchemaGenerator::default().into_root_schema_for::<f32>();
2557            assert_eq!(of_schema, prim_schema);
2558        }
2559        {
2560            let of_schema =
2561                schemars::gen::SchemaGenerator::default().into_root_schema_for::<NotNan<f64>>();
2562            let prim_schema =
2563                schemars::gen::SchemaGenerator::default().into_root_schema_for::<f64>();
2564            assert_eq!(of_schema, prim_schema);
2565        }
2566    }
2567}
2568
2569#[cfg(feature = "rand")]
2570mod impl_rand {
2571    use super::{NotNan, OrderedFloat};
2572    use rand::distributions::uniform::*;
2573    use rand::distributions::{Distribution, Open01, OpenClosed01, Standard};
2574    use rand::Rng;
2575
2576    macro_rules! impl_distribution {
2577        ($dist:ident, $($f:ty),+) => {
2578            $(
2579            impl Distribution<NotNan<$f>> for $dist {
2580                fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> NotNan<$f> {
2581                    // 'rand' never generates NaN values in the Standard, Open01, or
2582                    // OpenClosed01 distributions. Using 'new_unchecked' is therefore
2583                    // safe.
2584                    unsafe { NotNan::new_unchecked(self.sample(rng)) }
2585                }
2586            }
2587
2588            impl Distribution<OrderedFloat<$f>> for $dist {
2589                fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> OrderedFloat<$f> {
2590                    OrderedFloat(self.sample(rng))
2591                }
2592            }
2593            )*
2594        }
2595    }
2596
2597    impl_distribution! { Standard, f32, f64 }
2598    impl_distribution! { Open01, f32, f64 }
2599    impl_distribution! { OpenClosed01, f32, f64 }
2600
2601    /// A sampler for a uniform distribution
2602    #[derive(Clone, Copy, Debug)]
2603    #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2604    pub struct UniformNotNan<T>(UniformFloat<T>);
2605    impl SampleUniform for NotNan<f32> {
2606        type Sampler = UniformNotNan<f32>;
2607    }
2608    impl SampleUniform for NotNan<f64> {
2609        type Sampler = UniformNotNan<f64>;
2610    }
2611    impl<T> PartialEq for UniformNotNan<T>
2612    where
2613        UniformFloat<T>: PartialEq,
2614    {
2615        fn eq(&self, other: &Self) -> bool {
2616            self.0 == other.0
2617        }
2618    }
2619
2620    /// A sampler for a uniform distribution
2621    #[derive(Clone, Copy, Debug)]
2622    #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
2623    pub struct UniformOrdered<T>(UniformFloat<T>);
2624    impl SampleUniform for OrderedFloat<f32> {
2625        type Sampler = UniformOrdered<f32>;
2626    }
2627    impl SampleUniform for OrderedFloat<f64> {
2628        type Sampler = UniformOrdered<f64>;
2629    }
2630    impl<T> PartialEq for UniformOrdered<T>
2631    where
2632        UniformFloat<T>: PartialEq,
2633    {
2634        fn eq(&self, other: &Self) -> bool {
2635            self.0 == other.0
2636        }
2637    }
2638
2639    macro_rules! impl_uniform_sampler {
2640        ($f:ty) => {
2641            impl UniformSampler for UniformNotNan<$f> {
2642                type X = NotNan<$f>;
2643                fn new<B1, B2>(low: B1, high: B2) -> Self
2644                where
2645                    B1: SampleBorrow<Self::X> + Sized,
2646                    B2: SampleBorrow<Self::X> + Sized,
2647                {
2648                    UniformNotNan(UniformFloat::<$f>::new(low.borrow().0, high.borrow().0))
2649                }
2650                fn new_inclusive<B1, B2>(low: B1, high: B2) -> Self
2651                where
2652                    B1: SampleBorrow<Self::X> + Sized,
2653                    B2: SampleBorrow<Self::X> + Sized,
2654                {
2655                    UniformSampler::new(low, high)
2656                }
2657                fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X {
2658                    // UniformFloat.sample() will never return NaN.
2659                    unsafe { NotNan::new_unchecked(self.0.sample(rng)) }
2660                }
2661            }
2662
2663            impl UniformSampler for UniformOrdered<$f> {
2664                type X = OrderedFloat<$f>;
2665                fn new<B1, B2>(low: B1, high: B2) -> Self
2666                where
2667                    B1: SampleBorrow<Self::X> + Sized,
2668                    B2: SampleBorrow<Self::X> + Sized,
2669                {
2670                    UniformOrdered(UniformFloat::<$f>::new(low.borrow().0, high.borrow().0))
2671                }
2672                fn new_inclusive<B1, B2>(low: B1, high: B2) -> Self
2673                where
2674                    B1: SampleBorrow<Self::X> + Sized,
2675                    B2: SampleBorrow<Self::X> + Sized,
2676                {
2677                    UniformSampler::new(low, high)
2678                }
2679                fn sample<R: Rng + ?Sized>(&self, rng: &mut R) -> Self::X {
2680                    OrderedFloat(self.0.sample(rng))
2681                }
2682            }
2683        };
2684    }
2685
2686    impl_uniform_sampler! { f32 }
2687    impl_uniform_sampler! { f64 }
2688
2689    #[cfg(all(test, feature = "randtest"))]
2690    mod tests {
2691        use super::*;
2692
2693        fn sample_fuzz<T>()
2694        where
2695            Standard: Distribution<NotNan<T>>,
2696            Open01: Distribution<NotNan<T>>,
2697            OpenClosed01: Distribution<NotNan<T>>,
2698            Standard: Distribution<OrderedFloat<T>>,
2699            Open01: Distribution<OrderedFloat<T>>,
2700            OpenClosed01: Distribution<OrderedFloat<T>>,
2701            T: crate::Float,
2702        {
2703            let mut rng = rand::thread_rng();
2704            let f1: NotNan<T> = rng.sample(Standard);
2705            let f2: NotNan<T> = rng.sample(Open01);
2706            let f3: NotNan<T> = rng.sample(OpenClosed01);
2707            let _: OrderedFloat<T> = rng.sample(Standard);
2708            let _: OrderedFloat<T> = rng.sample(Open01);
2709            let _: OrderedFloat<T> = rng.sample(OpenClosed01);
2710            assert!(!f1.into_inner().is_nan());
2711            assert!(!f2.into_inner().is_nan());
2712            assert!(!f3.into_inner().is_nan());
2713        }
2714
2715        #[test]
2716        fn sampling_f32_does_not_panic() {
2717            sample_fuzz::<f32>();
2718        }
2719
2720        #[test]
2721        fn sampling_f64_does_not_panic() {
2722            sample_fuzz::<f64>();
2723        }
2724
2725        #[test]
2726        #[should_panic]
2727        fn uniform_sampling_panic_on_infinity_notnan() {
2728            let (low, high) = (
2729                NotNan::new(0f64).unwrap(),
2730                NotNan::new(f64::INFINITY).unwrap(),
2731            );
2732            let uniform = Uniform::new(low, high);
2733            let _ = uniform.sample(&mut rand::thread_rng());
2734        }
2735
2736        #[test]
2737        #[should_panic]
2738        fn uniform_sampling_panic_on_infinity_ordered() {
2739            let (low, high) = (OrderedFloat(0f64), OrderedFloat(f64::INFINITY));
2740            let uniform = Uniform::new(low, high);
2741            let _ = uniform.sample(&mut rand::thread_rng());
2742        }
2743
2744        #[test]
2745        #[should_panic]
2746        fn uniform_sampling_panic_on_nan_ordered() {
2747            let (low, high) = (OrderedFloat(0f64), OrderedFloat(f64::NAN));
2748            let uniform = Uniform::new(low, high);
2749            let _ = uniform.sample(&mut rand::thread_rng());
2750        }
2751    }
2752}
2753
2754#[cfg(feature = "proptest")]
2755mod impl_proptest {
2756    use super::{NotNan, OrderedFloat};
2757    use proptest::arbitrary::{Arbitrary, StrategyFor};
2758    use proptest::num::{f32, f64};
2759    use proptest::strategy::{FilterMap, Map, Strategy};
2760    use std::convert::TryFrom;
2761
2762    macro_rules! impl_arbitrary {
2763        ($($f:ident),+) => {
2764            $(
2765                impl Arbitrary for NotNan<$f> {
2766                    type Strategy = FilterMap<StrategyFor<$f>, fn(_: $f) -> Option<NotNan<$f>>>;
2767                    type Parameters = <$f as Arbitrary>::Parameters;
2768                    fn arbitrary_with(params: Self::Parameters) -> Self::Strategy {
2769                        <$f>::arbitrary_with(params)
2770                            .prop_filter_map("filter nan values", |f| NotNan::try_from(f).ok())
2771                    }
2772                }
2773
2774                impl Arbitrary for OrderedFloat<$f> {
2775                    type Strategy = Map<StrategyFor<$f>, fn(_: $f) -> OrderedFloat<$f>>;
2776                    type Parameters = <$f as Arbitrary>::Parameters;
2777                    fn arbitrary_with(params: Self::Parameters) -> Self::Strategy {
2778                        <$f>::arbitrary_with(params).prop_map(|f| OrderedFloat::from(f))
2779                    }
2780                }
2781            )*
2782        }
2783    }
2784    impl_arbitrary! { f32, f64 }
2785}
2786
2787#[cfg(feature = "arbitrary")]
2788mod impl_arbitrary {
2789    use super::{FloatIsNan, NotNan, OrderedFloat};
2790    use arbitrary::{Arbitrary, Unstructured};
2791    use num_traits::FromPrimitive;
2792
2793    macro_rules! impl_arbitrary {
2794        ($($f:ident),+) => {
2795            $(
2796                impl<'a> Arbitrary<'a> for NotNan<$f> {
2797                    fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result<Self> {
2798                        let float: $f = u.arbitrary()?;
2799                        match NotNan::new(float) {
2800                            Ok(notnan_value) => Ok(notnan_value),
2801                            Err(FloatIsNan) => {
2802                                // If our arbitrary float input was a NaN (encoded by exponent = max
2803                                // value), then replace it with a finite float, reusing the mantissa
2804                                // bits.
2805                                //
2806                                // This means the output is not uniformly distributed among all
2807                                // possible float values, but Arbitrary makes no promise that that
2808                                // is true.
2809                                //
2810                                // An alternative implementation would be to return an
2811                                // `arbitrary::Error`, but that is not as useful since it forces the
2812                                // caller to retry with new random/fuzzed data; and the precendent of
2813                                // `arbitrary`'s built-in implementations is to prefer the approach of
2814                                // mangling the input bits to fit.
2815
2816                                let (mantissa, _exponent, sign) =
2817                                    num_traits::float::FloatCore::integer_decode(float);
2818                                let revised_float = <$f>::from_i64(
2819                                    i64::from(sign) * mantissa as i64
2820                                ).unwrap();
2821
2822                                // If this unwrap() fails, then there is a bug in the above code.
2823                                Ok(NotNan::new(revised_float).unwrap())
2824                            }
2825                        }
2826                    }
2827
2828                    fn size_hint(depth: usize) -> (usize, Option<usize>) {
2829                        <$f as Arbitrary>::size_hint(depth)
2830                    }
2831                }
2832
2833                impl<'a> Arbitrary<'a> for OrderedFloat<$f> {
2834                    fn arbitrary(u: &mut Unstructured<'a>) -> arbitrary::Result<Self> {
2835                        let float: $f = u.arbitrary()?;
2836                        Ok(OrderedFloat::from(float))
2837                    }
2838
2839                    fn size_hint(depth: usize) -> (usize, Option<usize>) {
2840                        <$f as Arbitrary>::size_hint(depth)
2841                    }
2842                }
2843            )*
2844        }
2845    }
2846    impl_arbitrary! { f32, f64 }
2847}
2848
2849#[cfg(feature = "bytemuck")]
2850mod impl_bytemuck {
2851    use super::{FloatCore, NotNan, OrderedFloat};
2852    use bytemuck::{AnyBitPattern, CheckedBitPattern, NoUninit, Pod, TransparentWrapper, Zeroable};
2853
2854    unsafe impl<T: Zeroable> Zeroable for OrderedFloat<T> {}
2855
2856    // The zero bit pattern is indeed not a NaN bit pattern.
2857    unsafe impl<T: Zeroable> Zeroable for NotNan<T> {}
2858
2859    unsafe impl<T: Pod> Pod for OrderedFloat<T> {}
2860
2861    // `NotNan<T>` can only implement `NoUninit` and not `Pod`, since not every bit pattern is
2862    // valid (NaN bit patterns are invalid). `NoUninit` guarantees that we can read any bit pattern
2863    // from the value, which is fine in this case.
2864    unsafe impl<T: NoUninit> NoUninit for NotNan<T> {}
2865
2866    unsafe impl<T: FloatCore + AnyBitPattern> CheckedBitPattern for NotNan<T> {
2867        type Bits = T;
2868
2869        fn is_valid_bit_pattern(bits: &Self::Bits) -> bool {
2870            !bits.is_nan()
2871        }
2872    }
2873
2874    // OrderedFloat allows any value of the contained type, so it is a TransparentWrapper.
2875    // NotNan does not, so it is not.
2876    unsafe impl<T> TransparentWrapper<T> for OrderedFloat<T> {}
2877
2878    #[test]
2879    fn test_not_nan_bit_pattern() {
2880        use bytemuck::checked::{try_cast, CheckedCastError};
2881
2882        let nan = f64::NAN;
2883        assert_eq!(
2884            try_cast::<f64, NotNan<f64>>(nan),
2885            Err(CheckedCastError::InvalidBitPattern),
2886        );
2887
2888        let pi = core::f64::consts::PI;
2889        assert!(try_cast::<f64, NotNan<f64>>(pi).is_ok());
2890    }
2891}