1use crate::lib::*;
5
6use super::{Serialize, Serializer};
7use havok_types::{
8 CString, Matrix3, Matrix4, Pointer, QsTransform, Quaternion, Rotation, StringPtr, Transform,
9 Ulong, Variant, Vector4, f16,
10};
11
12macro_rules! impl_serialize {
13 (*$ty:ty, $fn_name:tt) => {
14 impl Serialize for $ty {
15 #[inline]
16 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
17 serializer.$fn_name(*self)
18 }
19 }
20 };
21 (&$ty:ty, $fn_name:tt) => {
22 impl Serialize for $ty {
23 #[inline]
24 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
25 serializer.$fn_name(&self)
26 }
27 }
28 };
29 ($ty:ty, $fn_name:tt) => {
30 impl Serialize for $ty {
31 #[inline]
32 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
33 serializer.$fn_name(self)
34 }
35 }
36 };
37}
38
39impl_serialize!(*(), serialize_void);
40impl_serialize!(*char, serialize_char);
41impl_serialize!(*bool, serialize_bool);
42impl_serialize!(*i8, serialize_int8);
43impl_serialize!(*i16, serialize_int16);
44impl_serialize!(*i32, serialize_int32);
45impl_serialize!(*i64, serialize_int64);
46impl_serialize!(*u8, serialize_uint8);
47impl_serialize!(*u16, serialize_uint16);
48impl_serialize!(*u32, serialize_uint32);
49impl_serialize!(*u64, serialize_uint64);
50impl_serialize!(*f16, serialize_half);
51impl_serialize!(*f32, serialize_real);
52
53impl_serialize!(Vector4, serialize_vector4);
54impl_serialize!(Quaternion, serialize_quaternion);
55impl_serialize!(Matrix3, serialize_matrix3);
56impl_serialize!(Rotation, serialize_rotation);
57impl_serialize!(QsTransform, serialize_qstransform);
58impl_serialize!(Matrix4, serialize_matrix4);
59impl_serialize!(Transform, serialize_transform);
60
61impl_serialize!(Variant, serialize_variant);
62impl_serialize!(*Pointer, serialize_pointer);
63impl_serialize!(*Ulong, serialize_ulong);
64
65impl Serialize for &str {
66 #[inline]
67 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
68 serializer.serialize_stringptr(&StringPtr::from_str(self))
69 }
70}
71
72impl Serialize for StringPtr<'_> {
73 #[inline]
74 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
75 serializer.serialize_stringptr(self)
76 }
77}
78
79impl Serialize for CString<'_> {
80 #[inline]
81 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
82 serializer.serialize_cstring(self)
83 }
84}
85
86macro_rules! impl_serialize_with_index_array {
87 ($($ty:ty),+ $(,)? => $fn_name:tt) => {
88 $(
89 impl Serialize for Vec<$ty> {
90 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
91 use super::SerializeSeq;
92
93 let mut seq = tri!(serializer.serialize_array(Some(self.len())));
94 for (index, element) in self.iter().enumerate() {
95 tri!(seq.$fn_name(element, index, self.len()));
96 }
97 seq.end()
98 }
99 }
100
101 impl Serialize for &Vec<$ty> {
102 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
103 use super::SerializeSeq;
104
105 let mut seq = tri!(serializer.serialize_array(Some(self.len())));
106 for (index, element) in self.iter().enumerate() {
107 tri!(seq.$fn_name(element, index, self.len()));
108 }
109 seq.end()
110 }
111 }
112
113 impl Serialize for &[$ty] {
114 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
115 use super::SerializeSeq;
116
117 let mut seq = tri!(serializer.serialize_array(Some(self.len())));
118 for (index, element) in self.iter().enumerate() {
119 tri!(seq.$fn_name(element, index, self.len()));
120 }
121 seq.end()
122 }
123 }
124 )*
125 };
126}
127
128impl_serialize_with_index_array!((), bool, char, u8, u16, u32, u64, i8, i16, i32, i64, f16, f32, Pointer, Ulong => serialize_primitive_element);
129
130macro_rules! impl_serialize_vec {
131 ($($ty:ty),+ $(,)? => $fn_name:tt) => {
132 $(
133 impl Serialize for Vec<$ty> {
134 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
135 use super::SerializeSeq;
136
137 let mut seq = tri!(serializer.serialize_array(Some(self.len())));
138 for element in self {
139 tri!(seq.$fn_name(element));
140 }
141 seq.end()
142 }
143 }
144
145 impl Serialize for &Vec<$ty> {
146 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
147 use super::SerializeSeq;
148
149 let mut seq = tri!(serializer.serialize_array(Some(self.len())));
150 for element in *self {
151 tri!(seq.$fn_name(element));
152 }
153 seq.end()
154 }
155 }
156
157 impl Serialize for &[$ty] {
158 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
159 use super::SerializeSeq;
160
161 let mut seq = tri!(serializer.serialize_array(Some(self.len())));
162 for element in *self {
163 tri!(seq.$fn_name(element));
164 }
165 seq.end()
166 }
167 }
168 )*
169 };
170}
171
172impl_serialize_vec!(StringPtr<'_> => serialize_stringptr_element);
173impl_serialize_vec!(CString<'_> => serialize_cstring_element);
174impl_serialize_vec!(Vector4, Quaternion, Matrix3, Rotation, QsTransform, Matrix4, Transform => serialize_math_element);
175
176impl<T: Serialize + crate::HavokClass> Serialize for Vec<T> {
178 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
179 use super::SerializeSeq;
180
181 let mut seq = tri!(serializer.serialize_array(Some(self.len())));
182 for element in self {
183 tri!(seq.serialize_class_element(element));
184 }
185 seq.end()
186 }
187}
188
189impl<T: Serialize + crate::HavokClass> Serialize for &Vec<T> {
191 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
192 use super::SerializeSeq;
193
194 let mut seq = tri!(serializer.serialize_array(Some(self.len())));
195 for element in *self {
196 tri!(seq.serialize_class_element(element));
197 }
198 seq.end()
199 }
200}
201
202impl<T: Serialize + crate::HavokClass> Serialize for &[T] {
203 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
204 use super::SerializeSeq;
205
206 let mut seq = tri!(serializer.serialize_array(Some(self.len())));
207 for element in *self {
208 tri!(seq.serialize_class_element(element));
209 }
210 seq.end()
211 }
212}
213
214#[cfg(feature = "indexmap")]
215const _: () = {
216 use indexmap::IndexMap;
217
218 impl<K, V> Serialize for &IndexMap<K, V>
219 where
220 V: Serialize + crate::HavokClass,
221 {
222 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
223 use super::SerializeSeq;
224
225 let mut seq = tri!(serializer.serialize_array(Some(self.len())));
226 for (_index, element) in self.iter() {
227 tri!(seq.serialize_class_element(element));
228 }
229 seq.end()
230 }
231 }
232
233 impl<K, V> Serialize for IndexMap<K, V>
234 where
235 V: Serialize + crate::HavokClass,
236 {
237 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
238 use super::SerializeSeq;
239
240 let mut seq = tri!(serializer.serialize_array(Some(self.len())));
241 for (_index, element) in self.iter() {
242 tri!(seq.serialize_class_element(element));
243 }
244 seq.end()
245 }
246 }
247};