@@ -1519,6 +1519,104 @@ mod impl_serde {
15191519 ) ;
15201520 }
15211521}
1522+
1523+ #[ cfg( feature = "rkyv" ) ]
1524+ mod impl_rkyv {
1525+ use super :: { NotNan , OrderedFloat } ;
1526+ #[ cfg( not( feature = "std" ) ) ]
1527+ use num_traits:: float:: FloatCore as Float ;
1528+ #[ cfg( feature = "std" ) ]
1529+ use num_traits:: Float ;
1530+ #[ cfg( test) ]
1531+ use rkyv:: { archived_root, ser:: Serializer } ;
1532+ use rkyv:: { from_archived, Archive , Deserialize , Fallible , Serialize } ;
1533+
1534+ #[ cfg( test) ]
1535+ type DefaultSerializer = rkyv:: ser:: serializers:: CoreSerializer < 16 , 16 > ;
1536+ #[ cfg( test) ]
1537+ type DefaultDeserializer = rkyv:: Infallible ;
1538+
1539+ impl < T : Float + Archive > Archive for OrderedFloat < T > {
1540+ type Archived = OrderedFloat < T > ;
1541+
1542+ type Resolver = ( ) ;
1543+
1544+ unsafe fn resolve ( & self , _: usize , _: Self :: Resolver , out : * mut Self :: Archived ) {
1545+ out. write ( * self ) ;
1546+ }
1547+ }
1548+
1549+ impl < T : Float + Serialize < S > , S : Fallible + ?Sized > Serialize < S > for OrderedFloat < T > {
1550+ fn serialize ( & self , _: & mut S ) -> Result < Self :: Resolver , S :: Error > {
1551+ Ok ( ( ) )
1552+ }
1553+ }
1554+
1555+ impl < T : Float + Deserialize < T , D > , D : Fallible + ?Sized > Deserialize < OrderedFloat < T > , D >
1556+ for OrderedFloat < T >
1557+ {
1558+ fn deserialize ( & self , _: & mut D ) -> Result < OrderedFloat < T > , D :: Error > {
1559+ Ok ( from_archived ! ( * self ) )
1560+ }
1561+ }
1562+
1563+ impl < T : Float + Archive > Archive for NotNan < T > {
1564+ type Archived = NotNan < T > ;
1565+
1566+ type Resolver = ( ) ;
1567+
1568+ unsafe fn resolve ( & self , _: usize , _: Self :: Resolver , out : * mut Self :: Archived ) {
1569+ out. write ( * self ) ;
1570+ }
1571+ }
1572+
1573+ impl < T : Float + Serialize < S > , S : Fallible + ?Sized > Serialize < S > for NotNan < T > {
1574+ fn serialize ( & self , _: & mut S ) -> Result < Self :: Resolver , S :: Error > {
1575+ Ok ( ( ) )
1576+ }
1577+ }
1578+
1579+ impl < T : Float + Deserialize < T , D > , D : Fallible + ?Sized > Deserialize < NotNan < T > , D > for NotNan < T > {
1580+ fn deserialize ( & self , _: & mut D ) -> Result < NotNan < T > , D :: Error > {
1581+ Ok ( from_archived ! ( * self ) )
1582+ }
1583+ }
1584+
1585+ #[ test]
1586+ fn test_ordered_float ( ) {
1587+ let float = OrderedFloat ( 1.0f64 ) ;
1588+ let mut serializer = DefaultSerializer :: default ( ) ;
1589+ serializer
1590+ . serialize_value ( & float)
1591+ . expect ( "failed to archive value" ) ;
1592+ let len = serializer. pos ( ) ;
1593+ let buffer = serializer. into_serializer ( ) . into_inner ( ) ;
1594+
1595+ let archived_value = unsafe { archived_root :: < OrderedFloat < f64 > > ( & buffer[ 0 ..len] ) } ;
1596+ assert_eq ! ( archived_value, & float) ;
1597+ let mut deserializer = DefaultDeserializer :: default ( ) ;
1598+ let deser_float: OrderedFloat < f64 > = archived_value. deserialize ( & mut deserializer) . unwrap ( ) ;
1599+ assert_eq ! ( deser_float, float) ;
1600+ }
1601+
1602+ #[ test]
1603+ fn test_not_nan ( ) {
1604+ let float = NotNan ( 1.0f64 ) ;
1605+ let mut serializer = DefaultSerializer :: default ( ) ;
1606+ serializer
1607+ . serialize_value ( & float)
1608+ . expect ( "failed to archive value" ) ;
1609+ let len = serializer. pos ( ) ;
1610+ let buffer = serializer. into_serializer ( ) . into_inner ( ) ;
1611+
1612+ let archived_value = unsafe { archived_root :: < NotNan < f64 > > ( & buffer[ 0 ..len] ) } ;
1613+ assert_eq ! ( archived_value, & float) ;
1614+ let mut deserializer = DefaultDeserializer :: default ( ) ;
1615+ let deser_float: NotNan < f64 > = archived_value. deserialize ( & mut deserializer) . unwrap ( ) ;
1616+ assert_eq ! ( deser_float, float) ;
1617+ }
1618+ }
1619+
15221620#[ cfg( all( feature = "std" , feature = "schemars" ) ) ]
15231621mod impl_schemars {
15241622 extern crate schemars;
0 commit comments