blob: 5c6efdc00a3120fbb0d91091c1bafd3bd304e21f [file] [log] [blame]
#[cfg(feature = "bytecheck")]
macro_rules! impl_rkyv {
(@bytecheck $type:ty) => {
impl<C: ?Sized> bytecheck::CheckBytes<C> for $type {
type Error = core::convert::Infallible;
#[inline]
unsafe fn check_bytes<'a>(
value: *const Self,
_: &mut C,
) -> Result<&'a Self, Self::Error> {
Ok(&*value)
}
}
};
($type:ty) => {
impl_rkyv_derive!(@serialize $type);
impl_rkyv_derive!(@archive_deserialize $type);
impl_rkyv!(@bytecheck $type);
};
}
#[cfg(not(feature = "bytecheck"))]
macro_rules! impl_rkyv {
($type:ty) => {
impl_rkyv_derive!(@serialize $type);
impl_rkyv_derive!(@archive_deserialize $type);
};
}
macro_rules! impl_rkyv_derive {
(@serialize $type:ty) => {
impl<S: Fallible + ?Sized> Serialize<S> for $type {
#[inline]
fn serialize(&self, _: &mut S) -> Result<Self::Resolver, S::Error> {
Ok(())
}
}
};
(@archive_deserialize $type:ty) => {
impl Archive for $type {
type Archived = $type;
type Resolver = ();
#[inline]
unsafe fn resolve(&self, _: usize, _: Self::Resolver, out: *mut Self::Archived) {
out.write(to_archived!(*self as Self));
}
}
impl<D: Fallible + ?Sized> Deserialize<$type, D> for $type {
#[inline]
fn deserialize(&self, _: &mut D) -> Result<$type, D::Error> {
Ok(from_archived!(*self))
}
}
};
}
mod f32 {
use crate::{Affine2, Affine3A, Mat2, Mat3, Mat3A, Mat4, Quat, Vec2, Vec3, Vec3A, Vec4};
use rkyv::{from_archived, to_archived, Archive, Deserialize, Fallible, Serialize};
impl_rkyv!(Affine2);
impl_rkyv!(Affine3A);
impl_rkyv!(Mat2);
impl_rkyv!(Mat3);
impl_rkyv!(Mat3A);
impl_rkyv!(Mat4);
impl_rkyv!(Quat);
impl_rkyv!(Vec2);
impl_rkyv!(Vec3);
impl_rkyv!(Vec3A);
impl_rkyv!(Vec4);
}
mod f64 {
use crate::{DAffine2, DAffine3, DMat2, DMat3, DMat4, DQuat, DVec2, DVec3, DVec4};
use rkyv::{from_archived, to_archived, Archive, Deserialize, Fallible, Serialize};
impl_rkyv!(DAffine2);
impl_rkyv!(DAffine3);
impl_rkyv!(DMat2);
impl_rkyv!(DMat3);
impl_rkyv!(DMat4);
impl_rkyv!(DQuat);
impl_rkyv!(DVec2);
impl_rkyv!(DVec3);
impl_rkyv!(DVec4);
}
mod i32 {
use crate::{IVec2, IVec3, IVec4};
use rkyv::{from_archived, to_archived, Archive, Deserialize, Fallible, Serialize};
impl_rkyv!(IVec2);
impl_rkyv!(IVec3);
impl_rkyv!(IVec4);
}
mod u32 {
use crate::{UVec2, UVec3, UVec4};
use rkyv::{from_archived, to_archived, Archive, Deserialize, Fallible, Serialize};
impl_rkyv!(UVec2);
impl_rkyv!(UVec3);
impl_rkyv!(UVec4);
}
#[cfg(test)]
mod test {
pub type DefaultSerializer = rkyv::ser::serializers::CoreSerializer<256, 256>;
pub type DefaultDeserializer = rkyv::Infallible;
use rkyv::ser::Serializer;
use rkyv::*;
pub fn test_archive<T>(value: &T)
where
T: core::fmt::Debug + PartialEq + rkyv::Serialize<DefaultSerializer>,
T::Archived: core::fmt::Debug + PartialEq<T> + rkyv::Deserialize<T, DefaultDeserializer>,
{
let mut serializer = DefaultSerializer::default();
serializer
.serialize_value(value)
.expect("failed to archive value");
let len = serializer.pos();
let buffer = serializer.into_serializer().into_inner();
let archived_value = unsafe { rkyv::archived_root::<T>(&buffer[0..len]) };
assert_eq!(archived_value, value);
let mut deserializer = DefaultDeserializer::default();
assert_eq!(
&archived_value.deserialize(&mut deserializer).unwrap(),
value
);
}
#[test]
fn test_rkyv() {
use crate::{Affine2, Affine3A, Mat2, Mat3, Mat3A, Mat4, Quat, Vec2, Vec3, Vec3A, Vec4};
test_archive(&Affine2::from_cols_array(&[1.0, 0.0, 2.0, 0.0, 3.0, 4.0]));
test_archive(&Affine3A::from_cols_array(&[
1.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 3.0, 4.0, 5.0, 6.0,
]));
test_archive(&Mat2::from_cols_array(&[1.0, 2.0, 3.0, 4.0]));
test_archive(&Mat3::from_cols_array(&[
1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0,
]));
test_archive(&Mat3A::from_cols_array(&[
1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0,
]));
test_archive(&Mat4::from_cols_array(&[
1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0,
]));
test_archive(&Quat::from_xyzw(1.0, 2.0, 3.0, 4.0));
test_archive(&Vec2::new(1.0, 2.0));
test_archive(&Vec3::new(1.0, 2.0, 3.0));
test_archive(&Vec3A::new(1.0, 2.0, 3.0));
test_archive(&Vec4::new(1.0, 2.0, 3.0, 4.0));
use crate::{DAffine2, DAffine3, DMat2, DMat3, DMat4, DQuat, DVec2, DVec3, DVec4};
test_archive(&DAffine2::from_cols_array(&[1.0, 0.0, 2.0, 0.0, 3.0, 4.0]));
test_archive(&DAffine3::from_cols_array(&[
1.0, 0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 0.0, 3.0, 4.0, 5.0, 6.0,
]));
test_archive(&DMat2::from_cols_array(&[1.0, 2.0, 3.0, 4.0]));
test_archive(&DMat3::from_cols_array(&[
1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0,
]));
test_archive(&DMat4::from_cols_array(&[
1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0,
]));
test_archive(&DQuat::from_xyzw(1.0, 2.0, 3.0, 4.0));
test_archive(&DVec2::new(1.0, 2.0));
test_archive(&DVec3::new(1.0, 2.0, 3.0));
test_archive(&DVec4::new(1.0, 2.0, 3.0, 4.0));
use crate::{IVec2, IVec3, IVec4};
test_archive(&IVec2::new(-1, 2));
test_archive(&IVec3::new(-1, 2, 3));
test_archive(&IVec4::new(-1, 2, 3, 4));
use crate::{UVec2, UVec3, UVec4};
test_archive(&UVec2::new(1, 2));
test_archive(&UVec3::new(1, 2, 3));
test_archive(&UVec4::new(1, 2, 3, 4));
}
}