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;
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
36const SIGN_MASK: u64 = 0x8000000000000000u64;
38const EXP_MASK: u64 = 0x7ff0000000000000u64;
39const MAN_MASK: u64 = 0x000fffffffffffffu64;
40
41const CANONICAL_NAN_BITS: u64 = 0x7ff8000000000000u64;
43
44#[inline(always)]
45fn canonicalize_signed_zero<T: FloatCore>(x: T) -> T {
46 x + T::zero()
50}
51
52#[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 #[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 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 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 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 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
670impl<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 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 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#[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 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 #[inline]
1297 pub fn into_inner(self) -> T {
1298 self.0
1299 }
1300
1301 #[inline]
1307 pub const unsafe fn new_unchecked(val: T) -> Self {
1308 NotNan(val)
1309 }
1310
1311 #[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 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 pub fn as_f32(self) -> NotNan<f32> {
1387 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 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
1473impl<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
1485impl<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
1501impl<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
1513impl<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
1538impl<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
1550impl<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
1663macro_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
1718macro_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#[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]
1807fn 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 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#[derive(Copy, Clone, PartialEq, Eq, Debug)]
1948pub enum ParseNotNanError<E> {
1949 ParseFloatError(E),
1951 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);
2052impl_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 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 #[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 #[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 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 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 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 unsafe impl<T: Zeroable> Zeroable for NotNan<T> {}
2857
2858 unsafe impl<T: Pod> Pod for OrderedFloat<T> {}
2859
2860 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 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}