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