Skip to content

Commit 9823d42

Browse files
Mustafa Gulermbrubeck
authored andcommitted
Implement rkyv traits for OrderedFloat and NotNan
Similar to serde support this adds support for the `rkyv` (de)serialization framework for `OrderedFloat` and `NotNan`. It is feature-gated the same way serde is.
1 parent 3cfbdd6 commit 9823d42

File tree

2 files changed

+99
-0
lines changed

2 files changed

+99
-0
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ edition = "2018"
1616
[dependencies]
1717
num-traits = { version = "0.2.1", default-features = false }
1818
serde = { version = "1.0", optional = true, default-features = false }
19+
rkyv = { version = "0.7", optional = true, default-features = false, features = ["size_32"] }
1920
schemars = { version = "0.6.5", optional = true }
2021
rand = { version = "0.8.3", optional = true, default-features = false }
2122
proptest = { version = "1.0.0", optional = true }

src/lib.rs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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"))]
15231621
mod impl_schemars {
15241622
extern crate schemars;

0 commit comments

Comments
 (0)