From ec1d4b1630807b3afd9840e2b3b77a11c72bef7c Mon Sep 17 00:00:00 2001 From: Raman Hafiyatulin Date: Tue, 3 Feb 2026 00:18:00 +0200 Subject: [PATCH] feat: rkyv for `FixedPoint` --- Cargo.toml | 2 ++ src/lib.rs | 4 ++++ tests/it/main.rs | 1 + tests/it/rkyv.rs | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 tests/it/rkyv.rs diff --git a/Cargo.toml b/Cargo.toml index 0c72359..b140467 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,12 +37,14 @@ i16 = [] i32 = [] i64 = [] i128 = ["dep:i256"] +rkyv = ["dep:rkyv"] serde = ["dep:serde"] schemars = ["dep:schemars"] parity = ["parity-scale-codec"] quick-xml = ["serde?/derive", "serde?/alloc"] # FIXME: quick-xml#473 [dependencies] +rkyv = { version = "0.8.14", optional = true } serde = { version = "1.0", default-features = false, optional = true } schemars = { version = "0.8", default-features = false, optional = true } typenum = "1.12.0" diff --git a/src/lib.rs b/src/lib.rs index 0a6ef88..37c7a25 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -201,6 +201,10 @@ type Result = core::result::Result; docsrs, doc(cfg(any(feature = "i128", feature = "i64", feature = "i32", feature = "i16"))) )] +#[cfg_attr( + feature = "rkyv", + derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize) +)] #[repr(transparent)] pub struct FixedPoint { inner: I, diff --git a/tests/it/main.rs b/tests/it/main.rs index 6bad759..a98033f 100644 --- a/tests/it/main.rs +++ b/tests/it/main.rs @@ -185,3 +185,4 @@ mod convert_f64; mod convert_str; mod ops; mod serde; +mod rkyv; diff --git a/tests/it/rkyv.rs b/tests/it/rkyv.rs new file mode 100644 index 0000000..d448f09 --- /dev/null +++ b/tests/it/rkyv.rs @@ -0,0 +1,33 @@ +#![cfg(feature = "rkyv")] + +use fixnum::*; +use anyhow::Result; +use rkyv::rancor::Error; + +#[test] +fn rkyv_basic() -> Result<()> { + test_fixed_point! { + case (a: FixedPoint, b: FixedPoint) => { + let a_ = rkyv::to_bytes::(&a)?; + let b_ = rkyv::to_bytes::(&b)?; + assert_eq!( + rkyv::deserialize::( + rkyv::access::<::Archived, Error>(&a_)?)?, a); + assert_eq!( + rkyv::deserialize::( + rkyv::access::<::Archived, Error>(&b_)?)?, b); + + + let ab = vec![a,b]; + let ab_ = rkyv::to_bytes::(&ab)?; + let ab_access = rkyv::access::< as rkyv::Archive>::Archived, Error>(&ab_)?; + assert_eq!(rkyv::deserialize::(&ab_access[0])?, a); + assert_eq!(rkyv::deserialize::(&ab_access[1])?, b); + }, + all { + (fp!(64.0), fp!(13.13)); + }, + }; + Ok(()) +} +