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)] 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 );