@@ -1702,6 +1702,93 @@ mod impl_rkyv {
1702
1702
}
1703
1703
}
1704
1704
1705
+ #[ cfg( feature = "speedy" ) ]
1706
+ mod impl_speedy {
1707
+ use super :: { NotNan , OrderedFloat } ;
1708
+ use num_traits:: Float ;
1709
+ use speedy:: { Context , Readable , Reader , Writable , Writer } ;
1710
+
1711
+ impl < C , T > Writable < C > for OrderedFloat < T >
1712
+ where
1713
+ C : Context ,
1714
+ T : Writable < C > ,
1715
+ {
1716
+ fn write_to < W : ?Sized + Writer < C > > ( & self , writer : & mut W ) -> Result < ( ) , C :: Error > {
1717
+ self . 0 . write_to ( writer)
1718
+ }
1719
+
1720
+ fn bytes_needed ( & self ) -> Result < usize , C :: Error > {
1721
+ self . 0 . bytes_needed ( )
1722
+ }
1723
+ }
1724
+
1725
+ impl < C , T > Writable < C > for NotNan < T >
1726
+ where
1727
+ C : Context ,
1728
+ T : Writable < C > ,
1729
+ {
1730
+ fn write_to < W : ?Sized + Writer < C > > ( & self , writer : & mut W ) -> Result < ( ) , C :: Error > {
1731
+ self . 0 . write_to ( writer)
1732
+ }
1733
+
1734
+ fn bytes_needed ( & self ) -> Result < usize , C :: Error > {
1735
+ self . 0 . bytes_needed ( )
1736
+ }
1737
+ }
1738
+
1739
+ impl < ' a , T , C : Context > Readable < ' a , C > for OrderedFloat < T >
1740
+ where
1741
+ T : Readable < ' a , C > ,
1742
+ {
1743
+ fn read_from < R : Reader < ' a , C > > ( reader : & mut R ) -> Result < Self , C :: Error > {
1744
+ T :: read_from ( reader) . map ( OrderedFloat )
1745
+ }
1746
+
1747
+ fn minimum_bytes_needed ( ) -> usize {
1748
+ T :: minimum_bytes_needed ( )
1749
+ }
1750
+ }
1751
+
1752
+ impl < ' a , T : Float , C : Context > Readable < ' a , C > for NotNan < T >
1753
+ where
1754
+ T : Readable < ' a , C > ,
1755
+ {
1756
+ fn read_from < R : Reader < ' a , C > > ( reader : & mut R ) -> Result < Self , C :: Error > {
1757
+ let value: T = reader. read_value ( ) ?;
1758
+ Self :: new ( value) . map_err ( |error| {
1759
+ speedy:: Error :: custom ( std:: format!( "failed to read NotNan: {}" , error) ) . into ( )
1760
+ } )
1761
+ }
1762
+
1763
+ fn minimum_bytes_needed ( ) -> usize {
1764
+ T :: minimum_bytes_needed ( )
1765
+ }
1766
+ }
1767
+
1768
+ #[ test]
1769
+ fn test_ordered_float ( ) {
1770
+ let float = OrderedFloat ( 1.0f64 ) ;
1771
+ let buffer = float. write_to_vec ( ) . unwrap ( ) ;
1772
+ let deser_float: OrderedFloat < f64 > = OrderedFloat :: read_from_buffer ( & buffer) . unwrap ( ) ;
1773
+ assert_eq ! ( deser_float, float) ;
1774
+ }
1775
+
1776
+ #[ test]
1777
+ fn test_not_nan ( ) {
1778
+ let float = NotNan ( 1.0f64 ) ;
1779
+ let buffer = float. write_to_vec ( ) . unwrap ( ) ;
1780
+ let deser_float: NotNan < f64 > = NotNan :: read_from_buffer ( & buffer) . unwrap ( ) ;
1781
+ assert_eq ! ( deser_float, float) ;
1782
+ }
1783
+
1784
+ #[ test]
1785
+ fn test_not_nan_with_nan ( ) {
1786
+ let nan_buf = f64:: nan ( ) . write_to_vec ( ) . unwrap ( ) ;
1787
+ let nan_err: Result < NotNan < f64 > , _ > = NotNan :: read_from_buffer ( & nan_buf) ;
1788
+ assert ! ( nan_err. is_err( ) ) ;
1789
+ }
1790
+ }
1791
+
1705
1792
#[ cfg( all( feature = "std" , feature = "schemars" ) ) ]
1706
1793
mod impl_schemars {
1707
1794
extern crate schemars;
0 commit comments