ordered_float/
lib.rs

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