diff --git a/ci.sh b/ci.sh index 5ff845d..0edbc55 100755 --- a/ci.sh +++ b/ci.sh @@ -29,7 +29,7 @@ cargo_test() { cargo test --all "$@" } -cargo_test --features=alloc,experimental-derive,use-std,use-crc,derive,nalgebra-v0_33,heapless-v0_8,heapless-v0_9,embedded-io-v0_7 +cargo_test --features=alloc,experimental-derive,use-std,use-crc,derive,nalgebra-v0_33,nalgebra-v0_34,num-complex-v0_4,heapless-v0_8,heapless-v0_9,embedded-io-v0_7 # NOTE: we exclude postcard-dyn for these checks because it is std-only diff --git a/source/postcard-schema-ng/Cargo.toml b/source/postcard-schema-ng/Cargo.toml index 7c781bb..238a751 100644 --- a/source/postcard-schema-ng/Cargo.toml +++ b/source/postcard-schema-ng/Cargo.toml @@ -64,6 +64,18 @@ version = "0.33.0" optional = true default-features = false +[dependencies.nalgebra_v0_34] +package = "nalgebra" +version = "0.34.0" +optional = true +default-features = false + +[dependencies.num_complex_v0_4] +package = "num-complex" +version = "0.4" +optional = true +default-features = false + [dependencies.fixed_v1_0] package = "fixed" version = "1.0" @@ -96,6 +108,18 @@ version = "0.33.0" default-features = false features = ["serde-serialize-no-std"] +[dev-dependencies.nalgebra_v0_34] +package = "nalgebra" +version = "0.34.0" +default-features = false +features = ["serde-serialize-no-std"] + +[dev-dependencies.num_complex_v0_4] +package = "num-complex" +version = "0.4" +default-features = false +features = ["serde"] + [features] default = [] use-std = ["serde/std"] @@ -111,6 +135,8 @@ fixed-v1_0 = ["fixed_v1_0"] heapless-v0_7 = ["heapless_v0_7"] heapless-v0_8 = ["heapless_v0_8"] heapless-v0_9 = ["heapless_v0_9"] -nalgebra-v0_33 = ["nalgebra_v0_33"] +nalgebra-v0_33 = ["nalgebra_v0_33", "num-complex-v0_4"] +nalgebra-v0_34 = ["nalgebra_v0_34", "num-complex-v0_4"] +num-complex-v0_4 = ["num_complex_v0_4"] serde-big-array-v0_5 = ["serde-big-array_v0_5"] uuid-v1_0 = ["uuid_v1_0"] diff --git a/source/postcard-schema-ng/src/impls/mod.rs b/source/postcard-schema-ng/src/impls/mod.rs index 041ce36..8cc2892 100644 --- a/source/postcard-schema-ng/src/impls/mod.rs +++ b/source/postcard-schema-ng/src/impls/mod.rs @@ -38,6 +38,21 @@ pub mod heapless_v0_9; #[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_33")))] pub mod nalgebra_v0_33; +#[cfg(feature = "nalgebra-v0_34")] +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))] +pub mod nalgebra_v0_34; + +#[cfg(feature = "num-complex-v0_4")] +#[cfg_attr( + docsrs, + doc(cfg(any( + feature = "num-complex-v0_4", + feature = "nalgebra-v0_33", + feature = "nalgebra-v0_34" + ))) +)] +pub mod num_complex_v0_4; + #[cfg(feature = "serde-big-array-v0_5")] #[cfg_attr(docsrs, doc(cfg(feature = "serde-big-array-v0_5")))] pub mod serde_big_array_v0_5; diff --git a/source/postcard-schema-ng/src/impls/nalgebra_v0_33.rs b/source/postcard-schema-ng/src/impls/nalgebra_v0_33.rs index 1eb8a2a..c9d8325 100644 --- a/source/postcard-schema-ng/src/impls/nalgebra_v0_33.rs +++ b/source/postcard-schema-ng/src/impls/nalgebra_v0_33.rs @@ -1,21 +1,35 @@ //! Implementations of the [`Schema`] trait for the `nalgebra` crate v0.33 -use crate::{schema::DataModelType, Schema}; +use crate::{ + schema::{Data, DataModelType, NamedField}, + Schema, +}; #[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_33")))] -impl Schema - for nalgebra_v0_33::Matrix< +impl Schema + for nalgebra_v0_33::Matrix, nalgebra_v0_33::Const, S> +where + T: Schema + nalgebra_v0_33::Scalar, + S: nalgebra_v0_33::base::storage::Storage< T, nalgebra_v0_33::Const, nalgebra_v0_33::Const, - nalgebra_v0_33::ArrayStorage, - > -where - T: Schema + nalgebra_v0_33::Scalar, + >, { const SCHEMA: &'static DataModelType = &DataModelType::Tuple(flatten(&[[T::SCHEMA; R]; C])); } +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_33")))] +impl Schema + for nalgebra_v0_33::OPoint> +where + nalgebra_v0_33::base::default_allocator::DefaultAllocator: + nalgebra_v0_33::base::allocator::Allocator>, +{ + const SCHEMA: &'static DataModelType = + nalgebra_v0_33::OVector::>::SCHEMA; +} + #[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_33")))] impl Schema for nalgebra_v0_33::Unit { const SCHEMA: &'static DataModelType = T::SCHEMA; @@ -26,6 +40,32 @@ impl Schema for nalgebra_v0_33::Quaternion::SCHEMA; } +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_33")))] +impl Schema + for nalgebra_v0_33::Translation +{ + const SCHEMA: &'static DataModelType = nalgebra_v0_33::SVector::::SCHEMA; +} + +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_33")))] +impl Schema + for nalgebra_v0_33::Isometry +{ + const SCHEMA: &'static DataModelType = &DataModelType::Struct { + name: "Isometry", + data: Data::Struct(&[ + &NamedField { + name: "rotation", + ty: R::SCHEMA, + }, + &NamedField { + name: "translation", + ty: nalgebra_v0_33::Translation::::SCHEMA, + }, + ]), + }; +} + /// Const version of the const-unstable [`<[[T; N]]>::as_flattened()`] const fn flatten(slice: &[[T; N]]) -> &[T] { const { diff --git a/source/postcard-schema-ng/src/impls/nalgebra_v0_34.rs b/source/postcard-schema-ng/src/impls/nalgebra_v0_34.rs new file mode 100644 index 0000000..31276cd --- /dev/null +++ b/source/postcard-schema-ng/src/impls/nalgebra_v0_34.rs @@ -0,0 +1,92 @@ +//! Implementations of the [`Schema`] trait for the `nalgebra` crate v0.34 + +use crate::{ + schema::{Data, DataModelType, NamedField}, + Schema, +}; + +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))] +impl Schema + for nalgebra_v0_34::Matrix, nalgebra_v0_34::Const, S> +where + T: Schema + nalgebra_v0_34::Scalar, + S: nalgebra_v0_34::base::storage::Storage< + T, + nalgebra_v0_34::Const, + nalgebra_v0_34::Const, + >, +{ + const SCHEMA: &'static DataModelType = &DataModelType::Tuple(flatten(&[[T::SCHEMA; R]; C])); +} + +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))] +impl Schema + for nalgebra_v0_34::OPoint> +where + nalgebra_v0_34::base::default_allocator::DefaultAllocator: + nalgebra_v0_34::base::allocator::Allocator>, +{ + const SCHEMA: &'static DataModelType = + nalgebra_v0_34::OVector::>::SCHEMA; +} + +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))] +impl Schema for nalgebra_v0_34::Unit { + const SCHEMA: &'static DataModelType = T::SCHEMA; +} + +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))] +impl Schema for nalgebra_v0_34::Quaternion { + const SCHEMA: &'static DataModelType = nalgebra_v0_34::Vector4::::SCHEMA; +} + +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))] +impl Schema + for nalgebra_v0_34::Translation +{ + const SCHEMA: &'static DataModelType = nalgebra_v0_34::SVector::::SCHEMA; +} + +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))] +impl Schema + for nalgebra_v0_34::Isometry +{ + const SCHEMA: &'static DataModelType = &DataModelType::Struct { + name: "Isometry", + data: Data::Struct(&[ + &NamedField { + name: "rotation", + ty: R::SCHEMA, + }, + &NamedField { + name: "translation", + ty: nalgebra_v0_34::Translation::::SCHEMA, + }, + ]), + }; +} + +/// Const version of the const-unstable [`<[[T; N]]>::as_flattened()`] +const fn flatten(slice: &[[T; N]]) -> &[T] { + const { + assert!(size_of::() != 0); + } + // SAFETY: `self.len() * N` cannot overflow because `self` is + // already in the address space. + let len = unsafe { slice.len().unchecked_mul(N) }; + // SAFETY: `[T]` is layout-identical to `[T; N]` + unsafe { core::slice::from_raw_parts(slice.as_ptr().cast(), len) } +} + +#[test] +fn flattened() { + type T = nalgebra_v0_34::SMatrix; + assert_eq!(T::SCHEMA, <[u8; 9]>::SCHEMA); +} + +#[test] +fn smoke() { + let x = nalgebra_v0_34::SMatrix::::new(1, 2, 3, 4, 5, 6, 7, 8, 9); + let y = postcard::to_stdvec(&x).unwrap(); + assert_eq!(&[1, 4, 7, 2, 5, 8, 3, 6, 9], y.as_slice()); +} diff --git a/source/postcard-schema-ng/src/impls/num_complex_v0_4.rs b/source/postcard-schema-ng/src/impls/num_complex_v0_4.rs new file mode 100644 index 0000000..5982428 --- /dev/null +++ b/source/postcard-schema-ng/src/impls/num_complex_v0_4.rs @@ -0,0 +1,15 @@ +//! Implementations of the [`Schema`] trait for the `num-complex` crate v0.4 + +use crate::{schema::DataModelType, Schema}; + +#[cfg_attr( + docsrs, + doc(cfg(any( + feature = "num-complex-v0_4", + feature = "nalgebra-v0_33", + feature = "nalgebra-v0_34" + ))) +)] +impl Schema for num_complex_v0_4::Complex { + const SCHEMA: &'static DataModelType = <[T; 2]>::SCHEMA; +} diff --git a/source/postcard-schema/Cargo.toml b/source/postcard-schema/Cargo.toml index 89287fb..d52c565 100644 --- a/source/postcard-schema/Cargo.toml +++ b/source/postcard-schema/Cargo.toml @@ -70,6 +70,12 @@ version = "0.34.1" optional = true default-features = false +[dependencies.num_complex_v0_4] +package = "num-complex" +version = "0.4" +optional = true +default-features = false + [dependencies.fixed_v1_0] package = "fixed" version = "1.0" @@ -107,6 +113,12 @@ version = "0.34.1" default-features = false features = ["serde-serialize-no-std"] +[dev-dependencies.num_complex_v0_4] +package = "num-complex" +version = "0.4" +default-features = false +features = ["serde"] + [features] default = [] use-std = ["serde/std"] @@ -122,7 +134,8 @@ fixed-v1_0 = ["fixed_v1_0"] heapless-v0_7 = ["heapless_v0_7"] heapless-v0_8 = ["heapless_v0_8"] heapless-v0_9 = ["heapless_v0_9"] -nalgebra-v0_33 = ["nalgebra_v0_33"] -nalgebra-v0_34 = ["nalgebra_v0_34"] +nalgebra-v0_33 = ["nalgebra_v0_33", "num-complex-v0_4"] +nalgebra-v0_34 = ["nalgebra_v0_34", "num-complex-v0_4"] +num-complex-v0_4 = ["num_complex_v0_4"] serde-big-array-v0_5 = ["serde-big-array_v0_5"] uuid-v1_0 = ["uuid_v1_0"] diff --git a/source/postcard-schema/src/impls/mod.rs b/source/postcard-schema/src/impls/mod.rs index ade605a..73e9995 100644 --- a/source/postcard-schema/src/impls/mod.rs +++ b/source/postcard-schema/src/impls/mod.rs @@ -45,6 +45,14 @@ pub mod nalgebra_v0_33; #[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))] pub mod nalgebra_v0_34; +#[cfg(any( + feature = "num-complex-v0_4", + feature = "nalgebra-v0_33", + feature = "nalgebra-v0_34" +))] +#[cfg_attr(docsrs, doc(cfg(feature = "num-complex-v0_4")))] +pub mod num_complex_v0_4; + #[cfg(feature = "serde-big-array-v0_5")] #[cfg_attr(docsrs, doc(cfg(feature = "serde-big-array-v0_5")))] pub mod serde_big_array_v0_5; diff --git a/source/postcard-schema/src/impls/nalgebra_v0_33.rs b/source/postcard-schema/src/impls/nalgebra_v0_33.rs index e4c71ce..576bcd8 100644 --- a/source/postcard-schema/src/impls/nalgebra_v0_33.rs +++ b/source/postcard-schema/src/impls/nalgebra_v0_33.rs @@ -1,27 +1,40 @@ //! Implementations of the [`Schema`] trait for the `nalgebra` crate v0.33 use crate::{ - schema::{DataModelType, NamedType}, + schema::{DataModelType, NamedType, NamedValue}, Schema, }; #[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_33")))] -impl Schema - for nalgebra_v0_33::Matrix< +impl Schema + for nalgebra_v0_33::Matrix, nalgebra_v0_33::Const, S> +where + T: Schema + nalgebra_v0_33::Scalar, + S: nalgebra_v0_33::base::storage::Storage< T, nalgebra_v0_33::Const, nalgebra_v0_33::Const, - nalgebra_v0_33::ArrayStorage, - > -where - T: Schema + nalgebra_v0_33::Scalar, + >, { const SCHEMA: &'static NamedType = &NamedType { - name: "nalgebra::Matrix>", + name: "nalgebra::Matrix", ty: &DataModelType::Tuple(flatten(&[[T::SCHEMA; R]; C])), }; } +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_33")))] +impl Schema + for nalgebra_v0_33::OPoint> +where + nalgebra_v0_33::base::default_allocator::DefaultAllocator: + nalgebra_v0_33::base::allocator::Allocator>, +{ + const SCHEMA: &'static NamedType = &NamedType { + name: "nalgebra::OPoint", + ty: nalgebra_v0_33::OVector::>::SCHEMA.ty, + }; +} + #[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_33")))] impl Schema for nalgebra_v0_33::Unit { const SCHEMA: &'static NamedType = T::SCHEMA; @@ -32,6 +45,32 @@ impl Schema for nalgebra_v0_33::Quaternion::SCHEMA; } +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_33")))] +impl Schema + for nalgebra_v0_33::Translation +{ + const SCHEMA: &'static NamedType = nalgebra_v0_33::SVector::::SCHEMA; +} + +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_33")))] +impl Schema + for nalgebra_v0_33::Isometry +{ + const SCHEMA: &'static NamedType = &NamedType { + name: "nalgebra::Isometry", + ty: &DataModelType::Struct(&[ + &NamedValue { + name: "rotation", + ty: R::SCHEMA, + }, + &NamedValue { + name: "translation", + ty: nalgebra_v0_33::Translation::::SCHEMA, + }, + ]), + }; +} + /// Const version of the const-unstable [`<[[T; N]]>::as_flattened()`] const fn flatten(slice: &[[T; N]]) -> &[T] { const { diff --git a/source/postcard-schema/src/impls/nalgebra_v0_34.rs b/source/postcard-schema/src/impls/nalgebra_v0_34.rs index 504aa2a..5001a15 100644 --- a/source/postcard-schema/src/impls/nalgebra_v0_34.rs +++ b/source/postcard-schema/src/impls/nalgebra_v0_34.rs @@ -1,20 +1,20 @@ //! Implementations of the [`Schema`] trait for the `nalgebra` crate v0.34 use crate::{ - schema::{DataModelType, NamedType}, + schema::{DataModelType, NamedType, NamedValue}, Schema, }; #[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))] -impl Schema - for nalgebra_v0_34::Matrix< +impl Schema + for nalgebra_v0_34::Matrix, nalgebra_v0_34::Const, S> +where + T: Schema + nalgebra_v0_34::Scalar, + S: nalgebra_v0_34::base::storage::Storage< T, nalgebra_v0_34::Const, nalgebra_v0_34::Const, - nalgebra_v0_34::ArrayStorage, - > -where - T: Schema + nalgebra_v0_34::Scalar, + >, { const SCHEMA: &'static NamedType = &NamedType { name: "nalgebra::Matrix>", @@ -22,6 +22,19 @@ where }; } +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))] +impl Schema + for nalgebra_v0_34::OPoint> +where + nalgebra_v0_34::base::default_allocator::DefaultAllocator: + nalgebra_v0_34::base::allocator::Allocator>, +{ + const SCHEMA: &'static NamedType = &NamedType { + name: "nalgebra::OPoint", + ty: nalgebra_v0_34::OVector::>::SCHEMA.ty, + }; +} + #[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))] impl Schema for nalgebra_v0_34::Unit { const SCHEMA: &'static NamedType = T::SCHEMA; @@ -32,6 +45,32 @@ impl Schema for nalgebra_v0_34::Quaternion::SCHEMA; } +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))] +impl Schema + for nalgebra_v0_34::Translation +{ + const SCHEMA: &'static NamedType = nalgebra_v0_34::SVector::::SCHEMA; +} + +#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))] +impl Schema + for nalgebra_v0_34::Isometry +{ + const SCHEMA: &'static NamedType = &NamedType { + name: "nalgebra::Isometry", + ty: &DataModelType::Struct(&[ + &NamedValue { + name: "rotation", + ty: R::SCHEMA, + }, + &NamedValue { + name: "translation", + ty: nalgebra_v0_34::Translation::::SCHEMA, + }, + ]), + }; +} + /// Const version of the const-unstable [`<[[T; N]]>::as_flattened()`] const fn flatten(slice: &[[T; N]]) -> &[T] { const { diff --git a/source/postcard-schema/src/impls/num_complex_v0_4.rs b/source/postcard-schema/src/impls/num_complex_v0_4.rs new file mode 100644 index 0000000..8bfc7d4 --- /dev/null +++ b/source/postcard-schema/src/impls/num_complex_v0_4.rs @@ -0,0 +1,18 @@ +//! Implementations of the [`Schema`] trait for the `num-complex` crate v0.4 + +use crate::{schema::NamedType, Schema}; + +#[cfg_attr( + docsrs, + doc(cfg(any( + feature = "num-complex-v0_4", + feature = "nalgebra-v0_33", + feature = "nalgebra-v0_34" + ))) +)] +impl Schema for num_complex_v0_4::Complex { + const SCHEMA: &'static NamedType = &NamedType { + name: "Complex", + ty: <[T; 2]>::SCHEMA.ty, + }; +}