parry3d/utils/
as_bytes.rs

1use core::mem;
2use core::slice;
3
4use na::{Point2, Point3, Vector2, Vector3};
5use simba::scalar::RealField;
6
7/// Trait that transforms thing to a slice of u8.
8pub trait AsBytes {
9    /// Converts `self` to a slice of bytes.
10    fn as_bytes(&self) -> &[u8];
11}
12
13macro_rules! generic_as_bytes_impl(
14    ($T: ident, $dimension: expr) => (
15        impl<N: RealField> AsBytes for $T<N> {
16            #[inline(always)]
17            fn as_bytes(&self) -> &[u8] {
18                unsafe {
19                    slice::from_raw_parts(self as *const $T<N> as *const u8, mem::size_of::<N>() * $dimension)
20                }
21            }
22        }
23    )
24);
25
26generic_as_bytes_impl!(Vector2, 2);
27generic_as_bytes_impl!(Point2, 2);
28generic_as_bytes_impl!(Vector3, 3);
29generic_as_bytes_impl!(Point3, 3);
30
31// TODO: implement for all `T: Copy` instead?