Skip to content

Commit cc39948

Browse files
Mrmaxmeiermbrubeck
authored andcommitted
add speedy feature with speedy::{Readable,Writable} impl
1 parent 2ff4911 commit cc39948

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ schemars = { version = "0.8.8", optional = true }
2121
rand = { version = "0.8.3", optional = true, default-features = false }
2222
arbitrary = { version = "1.0.0", optional = true }
2323
proptest = { version = "1.0.0", optional = true }
24+
speedy = { version = "0.8.3", optional = true, default-features = false }
2425

2526
[dev-dependencies]
2627
serde_test = "1.0"

src/lib.rs

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

0 commit comments

Comments
 (0)