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