Skip to content

Commit d56f5ad

Browse files
committed
Implement schema for nalgebra v0.34.
1 parent f8a4064 commit d56f5ad

3 files changed

Lines changed: 75 additions & 0 deletions

File tree

source/postcard-schema/Cargo.toml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,12 @@ version = "0.33.0"
6464
optional = true
6565
default-features = false
6666

67+
[dependencies.nalgebra_v0_34]
68+
package = "nalgebra"
69+
version = "0.34.1"
70+
optional = true
71+
default-features = false
72+
6773
[dependencies.fixed_v1_0]
6874
package = "fixed"
6975
version = "1.0"
@@ -95,6 +101,12 @@ version = "0.33.0"
95101
default-features = false
96102
features = ["serde-serialize-no-std"]
97103

104+
[dev-dependencies.nalgebra_v0_34]
105+
package = "nalgebra"
106+
version = "0.34.1"
107+
default-features = false
108+
features = ["serde-serialize-no-std"]
109+
98110
[features]
99111
default = []
100112
use-std = ["serde/std"]
@@ -111,5 +123,6 @@ heapless-v0_7 = ["heapless_v0_7"]
111123
heapless-v0_8 = ["heapless_v0_8"]
112124
heapless-v0_9 = ["heapless_v0_9"]
113125
nalgebra-v0_33 = ["nalgebra_v0_33"]
126+
nalgebra-v0_34 = ["nalgebra_v0_34"]
114127
serde-big-array-v0_5 = ["serde-big-array_v0_5"]
115128
uuid-v1_0 = ["uuid_v1_0"]

source/postcard-schema/src/impls/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ pub mod heapless_v0_9;
4141
#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_33")))]
4242
pub mod nalgebra_v0_33;
4343

44+
#[cfg(feature = "nalgebra-v0_34")]
45+
#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))]
46+
pub mod nalgebra_v0_34;
47+
4448
#[cfg(feature = "serde-big-array-v0_5")]
4549
#[cfg_attr(docsrs, doc(cfg(feature = "serde-big-array-v0_5")))]
4650
pub mod serde_big_array_v0_5;
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
//! Implementations of the [`Schema`] trait for the `nalgebra` crate v0.34
2+
3+
use crate::{
4+
schema::{DataModelType, NamedType},
5+
Schema,
6+
};
7+
8+
#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))]
9+
impl<T, const R: usize, const C: usize> Schema
10+
for nalgebra_v0_34::Matrix<
11+
T,
12+
nalgebra_v0_34::Const<R>,
13+
nalgebra_v0_34::Const<C>,
14+
nalgebra_v0_34::ArrayStorage<T, R, C>,
15+
>
16+
where
17+
T: Schema + nalgebra_v0_34::Scalar,
18+
{
19+
const SCHEMA: &'static NamedType = &NamedType {
20+
name: "nalgebra::Matrix<T, R, C, ArrayStorage<T, R, C>>",
21+
ty: &DataModelType::Tuple(flatten(&[[T::SCHEMA; R]; C])),
22+
};
23+
}
24+
25+
#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))]
26+
impl<T: Schema> Schema for nalgebra_v0_34::Unit<T> {
27+
const SCHEMA: &'static NamedType = T::SCHEMA;
28+
}
29+
30+
#[cfg_attr(docsrs, doc(cfg(feature = "nalgebra-v0_34")))]
31+
impl<T: Schema + nalgebra_v0_34::Scalar> Schema for nalgebra_v0_34::Quaternion<T> {
32+
const SCHEMA: &'static NamedType = nalgebra_v0_34::Vector4::<T>::SCHEMA;
33+
}
34+
35+
/// Const version of the const-unstable [`<[[T; N]]>::as_flattened()`]
36+
const fn flatten<T, const N: usize>(slice: &[[T; N]]) -> &[T] {
37+
const {
38+
assert!(size_of::<T>() != 0);
39+
}
40+
// SAFETY: `self.len() * N` cannot overflow because `self` is
41+
// already in the address space.
42+
let len = unsafe { slice.len().unchecked_mul(N) };
43+
// SAFETY: `[T]` is layout-identical to `[T; N]`
44+
unsafe { core::slice::from_raw_parts(slice.as_ptr().cast(), len) }
45+
}
46+
47+
#[test]
48+
fn flattened() {
49+
type T = nalgebra_v0_34::SMatrix<u8, 3, 3>;
50+
assert_eq!(T::SCHEMA.ty, <[u8; 9]>::SCHEMA.ty);
51+
}
52+
53+
#[test]
54+
fn smoke() {
55+
let x = nalgebra_v0_34::SMatrix::<u8, 3, 3>::new(1, 2, 3, 4, 5, 6, 7, 8, 9);
56+
let y = postcard::to_stdvec(&x).unwrap();
57+
assert_eq!(&[1, 4, 7, 2, 5, 8, 3, 6, 9], y.as_slice());
58+
}

0 commit comments

Comments
 (0)