Skip to main content

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