add bytecheck impls
This commit is contained in:
parent
7b5fb956d0
commit
b6c061f6bc
|
@ -307,3 +307,25 @@ mod rkyv_impl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "rkyv-serialize")]
|
||||||
|
mod bytecheck_impl {
|
||||||
|
use std::ptr::addr_of;
|
||||||
|
|
||||||
|
use bytecheck::{ArrayCheckError, CheckBytes};
|
||||||
|
|
||||||
|
use super::ArrayStorage;
|
||||||
|
|
||||||
|
impl<__C: ?Sized, T, const R: usize, const C: usize> CheckBytes<__C> for ArrayStorage<T, R, C>
|
||||||
|
where
|
||||||
|
T: CheckBytes<__C>,
|
||||||
|
{
|
||||||
|
type Error = ArrayCheckError<ArrayCheckError<<T as CheckBytes<__C>>::Error>>;
|
||||||
|
unsafe fn check_bytes<'a>(
|
||||||
|
value: *const ArrayStorage<T, R, C>,
|
||||||
|
context: &mut __C,
|
||||||
|
) -> Result<&'a Self, Self::Error> {
|
||||||
|
let _ = <[[T; R]; C] as CheckBytes<__C>>::check_bytes(addr_of!((*value).0), context)?;
|
||||||
|
Ok(&*value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -257,6 +257,21 @@ mod rkyv_impl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "rkyv-serialize")]
|
||||||
|
mod bytecheck_impl {
|
||||||
|
use bytecheck::CheckBytes;
|
||||||
|
|
||||||
|
use super::Const;
|
||||||
|
impl<__C: ?Sized, const R: usize> CheckBytes<__C> for Const<R> {
|
||||||
|
type Error = core::convert::Infallible;
|
||||||
|
unsafe fn check_bytes<'a>(
|
||||||
|
value: *const Const<R>,
|
||||||
|
_context: &mut __C,
|
||||||
|
) -> Result<&'a Self, Self::Error> {
|
||||||
|
Ok(&*value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub trait ToConst {
|
pub trait ToConst {
|
||||||
type Const: DimName;
|
type Const: DimName;
|
||||||
|
|
|
@ -293,7 +293,6 @@ mod rkyv_impl {
|
||||||
use super::Matrix;
|
use super::Matrix;
|
||||||
use core::marker::PhantomData;
|
use core::marker::PhantomData;
|
||||||
use rkyv::{out_field, Archive, Deserialize, Fallible, Serialize};
|
use rkyv::{out_field, Archive, Deserialize, Fallible, Serialize};
|
||||||
use bytecheck::CheckBytes;
|
|
||||||
|
|
||||||
impl<T: Archive, R: Archive, C: Archive, S: Archive> Archive for Matrix<T, R, C, S> {
|
impl<T: Archive, R: Archive, C: Archive, S: Archive> Archive for Matrix<T, R, C, S> {
|
||||||
type Archived = Matrix<T::Archived, R::Archived, C::Archived, S::Archived>;
|
type Archived = Matrix<T::Archived, R::Archived, C::Archived, S::Archived>;
|
||||||
|
@ -326,10 +325,15 @@ mod rkyv_impl {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
#[cfg(feature = "rkyv-serialize")]
|
||||||
|
mod bytecheck_impl {
|
||||||
|
use bytecheck::CheckBytes;
|
||||||
|
use std::ptr::addr_of;
|
||||||
|
|
||||||
impl<__C: ?Sized, T, R, C, S: CheckBytes<__C>>
|
use super::Matrix;
|
||||||
CheckBytes<__C>
|
|
||||||
for Matrix<T, R, C, S>
|
impl<__C: ?Sized, T, R, C, S: CheckBytes<__C>> CheckBytes<__C> for Matrix<T, R, C, S>
|
||||||
where
|
where
|
||||||
S: CheckBytes<__C>,
|
S: CheckBytes<__C>,
|
||||||
{
|
{
|
||||||
|
@ -338,7 +342,7 @@ mod rkyv_impl {
|
||||||
value: *const Matrix<T, R, C, S>,
|
value: *const Matrix<T, R, C, S>,
|
||||||
context: &mut __C,
|
context: &mut __C,
|
||||||
) -> Result<&'a Self, Self::Error> {
|
) -> Result<&'a Self, Self::Error> {
|
||||||
let _ = S::check_bytes(::core::ptr::addr_of!((*value).data), context)?;
|
let _ = S::check_bytes(addr_of!((*value).data), context)?;
|
||||||
Ok(&*value)
|
Ok(&*value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,6 +90,27 @@ mod rkyv_impl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "rkyv-serialize")]
|
||||||
|
mod bytecheck_impl {
|
||||||
|
use std::ptr::addr_of;
|
||||||
|
|
||||||
|
use bytecheck::CheckBytes;
|
||||||
|
|
||||||
|
use super::Unit;
|
||||||
|
impl<__C: ?Sized, T: CheckBytes<__C>> CheckBytes<__C> for Unit<T>
|
||||||
|
where
|
||||||
|
T: CheckBytes<__C>,
|
||||||
|
{
|
||||||
|
type Error = <T as CheckBytes<__C>>::Error;
|
||||||
|
unsafe fn check_bytes<'a>(
|
||||||
|
value: *const Unit<T>,
|
||||||
|
context: &mut __C,
|
||||||
|
) -> Result<&'a Self, Self::Error> {
|
||||||
|
let _ = T::check_bytes(addr_of!((*value).value), context)?;
|
||||||
|
Ok(&*value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(feature = "cuda")]
|
#[cfg(feature = "cuda")]
|
||||||
unsafe impl<T: cust_core::DeviceCopy, R, C, S> cust_core::DeviceCopy for Unit<Matrix<T, R, C, S>>
|
unsafe impl<T: cust_core::DeviceCopy, R, C, S> cust_core::DeviceCopy for Unit<Matrix<T, R, C, S>>
|
||||||
|
|
|
@ -121,6 +121,48 @@ mod rkyv_impl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "rkyv-serialize")]
|
||||||
|
mod bytecheck_impl {
|
||||||
|
use crate::{Isometry, Scalar, Translation};
|
||||||
|
use bytecheck::CheckBytes;
|
||||||
|
use std::{error::Error, fmt, ptr::addr_of};
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum IsometryCheckBytesError<T, R> {
|
||||||
|
Rotation(R),
|
||||||
|
Translation(T),
|
||||||
|
}
|
||||||
|
impl<T, R> fmt::Display for IsometryCheckBytesError<T, R> {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
match self {
|
||||||
|
Self::Rotation(_) => write!(f, "failed to check bytes of isometry rotation"),
|
||||||
|
Self::Translation(_) => write!(f, "failed to check bytes of isometry translation"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl<T: Error, R: Error> Error for IsometryCheckBytesError<T, R> {}
|
||||||
|
|
||||||
|
impl<__C: ?Sized, T: Scalar + CheckBytes<__C>, R: CheckBytes<__C>, const D: usize>
|
||||||
|
CheckBytes<__C> for Isometry<T, R, D>
|
||||||
|
where
|
||||||
|
T: CheckBytes<__C>,
|
||||||
|
{
|
||||||
|
type Error = IsometryCheckBytesError<
|
||||||
|
<Translation<T, D> as CheckBytes<__C>>::Error,
|
||||||
|
<R as CheckBytes<__C>>::Error,
|
||||||
|
>;
|
||||||
|
unsafe fn check_bytes<'a>(
|
||||||
|
value: *const Isometry<T, R, D>,
|
||||||
|
context: &mut __C,
|
||||||
|
) -> Result<&'a Self, Self::Error> {
|
||||||
|
let _ = R::check_bytes(addr_of!((*value).rotation), context)
|
||||||
|
.map_err(|e| IsometryCheckBytesError::Rotation(e))?;
|
||||||
|
let _ = Translation::<T, D>::check_bytes(addr_of!((*value).translation), context)
|
||||||
|
.map_err(|e| IsometryCheckBytesError::Translation(e))?;
|
||||||
|
Ok(&*value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<T: Scalar + hash::Hash, R: hash::Hash, const D: usize> hash::Hash for Isometry<T, R, D>
|
impl<T: Scalar + hash::Hash, R: hash::Hash, const D: usize> hash::Hash for Isometry<T, R, D>
|
||||||
where
|
where
|
||||||
|
|
|
@ -130,6 +130,28 @@ mod rkyv_impl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "rkyv-serialize")]
|
||||||
|
mod bytecheck_impl {
|
||||||
|
use std::ptr::addr_of;
|
||||||
|
|
||||||
|
use bytecheck::CheckBytes;
|
||||||
|
|
||||||
|
use super::Quaternion;
|
||||||
|
use crate::Vector4;
|
||||||
|
impl<__C: ?Sized, T: CheckBytes<__C>> CheckBytes<__C> for Quaternion<T>
|
||||||
|
where
|
||||||
|
T: CheckBytes<__C>,
|
||||||
|
{
|
||||||
|
type Error = <Vector4<T> as CheckBytes<__C>>::Error;
|
||||||
|
unsafe fn check_bytes<'a>(
|
||||||
|
value: *const Quaternion<T>,
|
||||||
|
context: &mut __C,
|
||||||
|
) -> Result<&'a Self, Self::Error> {
|
||||||
|
let _ = Vector4::check_bytes(addr_of!((*value).coords), context)?;
|
||||||
|
Ok(&*value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<T: SimdRealField> Quaternion<T>
|
impl<T: SimdRealField> Quaternion<T>
|
||||||
where
|
where
|
||||||
|
|
|
@ -118,6 +118,27 @@ mod rkyv_impl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "rkyv-serialize")]
|
||||||
|
mod bytecheck_impl {
|
||||||
|
use std::ptr::addr_of;
|
||||||
|
|
||||||
|
use bytecheck::CheckBytes;
|
||||||
|
|
||||||
|
use crate::{SVector, Scale};
|
||||||
|
impl<__C: ?Sized, T: CheckBytes<__C>, const D: usize> CheckBytes<__C> for Scale<T, D>
|
||||||
|
where
|
||||||
|
T: CheckBytes<__C>,
|
||||||
|
{
|
||||||
|
type Error = <SVector<T, D> as CheckBytes<__C>>::Error;
|
||||||
|
unsafe fn check_bytes<'a>(
|
||||||
|
value: *const Scale<T, D>,
|
||||||
|
context: &mut __C,
|
||||||
|
) -> Result<&'a Self, Self::Error> {
|
||||||
|
let _ = SVector::<T, D>::check_bytes(addr_of!((*value).vector), context)?;
|
||||||
|
Ok(&*value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<T: Scalar, const D: usize> Scale<T, D> {
|
impl<T: Scalar, const D: usize> Scale<T, D> {
|
||||||
/// Inverts `self`.
|
/// Inverts `self`.
|
||||||
|
|
|
@ -118,6 +118,27 @@ mod rkyv_impl {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#[cfg(feature = "rkyv-serialize")]
|
||||||
|
mod bytecheck_impl {
|
||||||
|
use std::ptr::addr_of;
|
||||||
|
|
||||||
|
use bytecheck::CheckBytes;
|
||||||
|
|
||||||
|
use crate::{SVector, Translation};
|
||||||
|
impl<__C: ?Sized, T: CheckBytes<__C>, const D: usize> CheckBytes<__C> for Translation<T, D>
|
||||||
|
where
|
||||||
|
T: CheckBytes<__C>,
|
||||||
|
{
|
||||||
|
type Error = <SVector<T, D> as CheckBytes<__C>>::Error;
|
||||||
|
unsafe fn check_bytes<'a>(
|
||||||
|
value: *const Translation<T, D>,
|
||||||
|
context: &mut __C,
|
||||||
|
) -> Result<&'a Self, Self::Error> {
|
||||||
|
let _ = SVector::<T, D>::check_bytes(addr_of!((*value).vector), context)?;
|
||||||
|
Ok(&*value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<T: Scalar, const D: usize> Translation<T, D> {
|
impl<T: Scalar, const D: usize> Translation<T, D> {
|
||||||
/// Creates a new translation from the given vector.
|
/// Creates a new translation from the given vector.
|
||||||
|
|
Loading…
Reference in New Issue