@@ -1702,6 +1702,93 @@ mod impl_rkyv {
17021702 }
17031703}
17041704
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+
17051792#[ cfg( all( feature = "std" , feature = "schemars" ) ) ]
17061793mod impl_schemars {
17071794 extern crate schemars;
0 commit comments