Skip to content

Commit fae27b3

Browse files
authored
Merge pull request #188 from max-heller/nalgebra
Fix nalgebra schema
2 parents bcbb917 + 5edcc9a commit fae27b3

File tree

3 files changed

+33
-2
lines changed

3 files changed

+33
-2
lines changed

ci.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ cargo_test() {
2929
cargo test --all "$@"
3030
}
3131

32-
cargo_test --features=alloc,experimental-derive,use-std,use-crc,derive
32+
cargo_test --features=alloc,experimental-derive,use-std,use-crc,derive,nalgebra-v0_33
3333

3434
# NOTE: we exclude postcard-dyn for these checks because it is std-only
3535

source/postcard-schema/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,12 @@ path = "../postcard"
6868
version = "1.0"
6969
features = ["use-std"]
7070

71+
[dev-dependencies.nalgebra_v0_33]
72+
package = "nalgebra"
73+
version = "0.33.0"
74+
default-features = false
75+
features = ["serde-serialize-no-std"]
76+
7177
[features]
7278
default = []
7379
use-std = ["serde/std"]

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

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,31 @@ where
1818
{
1919
const SCHEMA: &'static NamedType = &NamedType {
2020
name: "nalgebra::Matrix<T, R, C, ArrayStorage<T, R, C>>",
21-
ty: &DataModelType::Seq(T::SCHEMA),
21+
ty: &DataModelType::Tuple(flatten(&[[T::SCHEMA; R]; C])),
2222
};
2323
}
24+
25+
/// Const version of the const-unstable [`<[[T; N]]>::as_flattened()`]
26+
const fn flatten<T, const N: usize>(slice: &[[T; N]]) -> &[T] {
27+
const {
28+
assert!(size_of::<T>() != 0);
29+
}
30+
// SAFETY: `self.len() * N` cannot overflow because `self` is
31+
// already in the address space.
32+
let len = unsafe { slice.len().unchecked_mul(N) };
33+
// SAFETY: `[T]` is layout-identical to `[T; N]`
34+
unsafe { core::slice::from_raw_parts(slice.as_ptr().cast(), len) }
35+
}
36+
37+
#[test]
38+
fn flattened() {
39+
type T = nalgebra_v0_33::SMatrix<u8, 3, 3>;
40+
assert_eq!(T::SCHEMA.ty, <[u8; 9]>::SCHEMA.ty);
41+
}
42+
43+
#[test]
44+
fn smoke() {
45+
let x = nalgebra_v0_33::SMatrix::<u8, 3, 3>::new(1, 2, 3, 4, 5, 6, 7, 8, 9);
46+
let y = postcard::to_stdvec(&x).unwrap();
47+
assert_eq!(&[1, 4, 7, 2, 5, 8, 3, 6, 9], y.as_slice());
48+
}

0 commit comments

Comments
 (0)