mint/
vector.rs

1use crate::IntoMint;
2
3macro_rules! vec {
4    ($name:ident [ $($field:ident),* ] = $fixed:ty) => {
5        #[derive(Clone, Copy, Debug, Hash, PartialEq, PartialOrd, Eq, Ord)]
6        #[repr(C)]
7        #[allow(missing_docs)] //TODO: actually have docs
8        pub struct $name<T> {
9            $( pub $field : T, )*
10        }
11
12        impl<T> IntoMint for $name<T> {
13            type MintType = $name<T>;
14        }
15
16        impl<T> From<$fixed> for $name<T> {
17            fn from([$($field),*]: $fixed) -> Self {
18                $name {
19                    $(
20                        $field,
21                    )*
22                }
23            }
24        }
25
26        impl<T> From<$name<T>> for $fixed {
27            fn from(name: $name<T>) -> $fixed {
28                [$(name.$field.into() ),*]
29            }
30        }
31
32        impl<T> AsRef<$fixed> for $name<T> {
33            fn as_ref(&self) -> &$fixed { unsafe { ::core::mem::transmute(self) } }
34        }
35
36        impl<T> AsMut<$fixed> for $name<T> {
37            fn as_mut(&mut self) -> &mut $fixed { unsafe { ::core::mem::transmute(self) } }
38        }
39
40        impl<T: Clone> $name<T> {
41            #[allow(missing_docs)]
42            pub fn from_slice(slice: &[T]) -> Self {
43                let mut iter = slice.iter();
44                $name {
45                    $(
46                        $field: iter
47                            .next()
48                            .expect(&concat!("Missing ", stringify!($field), "-axis in slice."))
49                            .clone()
50                    ),*
51                }
52            }
53        }
54
55        #[cfg(feature = "serde")]
56        impl<T> ::serde::Serialize for $name<T>
57            where T: ::serde::Serialize
58        {
59            fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
60                where S: ::serde::Serializer
61            {
62                AsRef::<$fixed>::as_ref(self).serialize(serializer)
63            }
64        }
65
66        #[cfg(feature = "serde")]
67        impl<'de, T> ::serde::Deserialize<'de> for $name<T>
68            where T: ::serde::Deserialize<'de>,
69        {
70            fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
71                where D: ::serde::Deserializer<'de>
72            {
73                <$fixed>::deserialize(deserializer).map($name::<T>::from)
74            }
75        }
76    }
77}
78
79macro_rules! from {
80    ($name:ident [ $($field:ident),* ] = $other:ident) => {
81        impl<T> From<$other<T>> for $name<T> {
82            fn from(v: $other<T>) -> Self {
83                $name {
84                    $(
85                        $field: v.$field,
86                    )*
87                }
88            }
89        }
90    }
91}
92
93vec!( Vector2 [x, y] = [T; 2] );
94from!( Vector2 [x,y] = Point2 );
95vec!( Vector3 [x, y, z] = [T; 3] );
96from!( Vector3 [x,y,z] = Point3 );
97vec!( Vector4 [x, y, z, w] = [T; 4] );
98vec!( Point2 [x, y] = [T; 2] );
99from!( Point2 [x,y] = Vector2 );
100vec!( Point3 [x, y, z] = [T; 3] );
101from!( Point3 [x,y,z] = Vector3 );