@@ -1519,6 +1519,104 @@ mod impl_serde {
1519
1519
) ;
1520
1520
}
1521
1521
}
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
+
1522
1620
#[ cfg( all( feature = "std" , feature = "schemars" ) ) ]
1523
1621
mod impl_schemars {
1524
1622
extern crate schemars;
0 commit comments