naia_serde/impls/
scalars.rs1use crate::{
2 bit_reader::BitReader,
3 bit_writer::BitWrite,
4 error::SerdeErr,
5 serde::{ConstBitLength, Serde},
6};
7
8impl Serde for () {
11 fn ser(&self, _: &mut dyn BitWrite) {}
12
13 fn de(_: &mut BitReader) -> Result<Self, SerdeErr> {
14 Ok(())
15 }
16
17 fn bit_length(&self) -> u32 {
18 <Self as ConstBitLength>::const_bit_length()
19 }
20}
21
22impl ConstBitLength for () {
23 fn const_bit_length() -> u32 {
24 0
25 }
26}
27
28#[cfg(test)]
31mod unit_tests {
32 use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
33
34 #[test]
35 fn read_write() {
36 let mut writer = BitWriter::new();
38
39 let in_unit = ();
40
41 in_unit.ser(&mut writer);
42
43 let buffer = writer.to_bytes();
44
45 let mut reader = BitReader::new(&buffer);
47
48 let out_unit: () = Serde::de(&mut reader).unwrap();
53 let _ = (in_unit, out_unit);
54 }
55}
56
57impl Serde for bool {
60 fn ser(&self, writer: &mut dyn BitWrite) {
61 writer.write_bit(*self);
62 }
63
64 fn de(reader: &mut BitReader) -> Result<Self, SerdeErr> {
65 reader.read_bit()
66 }
67
68 fn bit_length(&self) -> u32 {
69 <Self as ConstBitLength>::const_bit_length()
70 }
71}
72
73impl ConstBitLength for bool {
74 fn const_bit_length() -> u32 {
75 1
76 }
77}
78
79#[cfg(test)]
82mod bool_tests {
83 use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
84
85 #[test]
86 fn read_write() {
87 let mut writer = BitWriter::new();
89
90 let in_1 = true;
91 let in_2 = false;
92
93 in_1.ser(&mut writer);
94 in_2.ser(&mut writer);
95
96 let buffer = writer.to_bytes();
97
98 let mut reader = BitReader::new(&buffer);
100
101 let out_1 = Serde::de(&mut reader).unwrap();
102 let out_2 = Serde::de(&mut reader).unwrap();
103
104 assert_eq!(in_1, out_1);
105 assert_eq!(in_2, out_2);
106 }
107}
108
109impl Serde for char {
112 fn ser(&self, writer: &mut dyn BitWrite) {
113 let u32char = *self as u32;
114 let bytes = unsafe { std::mem::transmute::<&u32, &[u8; 4]>(&u32char) };
115 for byte in bytes {
116 writer.write_byte(*byte);
117 }
118 }
119
120 fn de(reader: &mut BitReader) -> Result<Self, SerdeErr> {
121 let mut bytes = [0_u8; 4];
122 for byte in &mut bytes {
123 *byte = reader.read_byte()?;
124 }
125 let mut container = [0_u32];
126 unsafe {
127 std::ptr::copy_nonoverlapping(
128 bytes.as_ptr().offset(0_isize) as *const u32,
129 container.as_mut_ptr(),
130 1,
131 )
132 }
133
134 if let Some(inner_char) = char::from_u32(container[0]) {
135 Ok(inner_char)
136 } else {
137 Err(SerdeErr {})
138 }
139 }
140
141 fn bit_length(&self) -> u32 {
142 <Self as ConstBitLength>::const_bit_length()
143 }
144}
145
146impl ConstBitLength for char {
147 fn const_bit_length() -> u32 {
148 <[u8; 4] as ConstBitLength>::const_bit_length()
149 }
150}
151
152#[cfg(test)]
155mod char_tests {
156 use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
157
158 #[test]
159 fn read_write() {
160 let mut writer = BitWriter::new();
162
163 let in_1 = 'O';
164 let in_2 = '!';
165
166 in_1.ser(&mut writer);
167 in_2.ser(&mut writer);
168
169 let buffer = writer.to_bytes();
170
171 let mut reader = BitReader::new(&buffer);
173
174 let out_1 = Serde::de(&mut reader).unwrap();
175 let out_2 = Serde::de(&mut reader).unwrap();
176
177 assert_eq!(in_1, out_1);
178 assert_eq!(in_2, out_2);
179 }
180}
181
182macro_rules! impl_serde_for {
185 ($impl_type:ident) => {
186 impl Serde for $impl_type {
187 fn ser(&self, writer: &mut dyn BitWrite) {
188 let du8 = unsafe {
189 std::mem::transmute::<&$impl_type, &[u8; std::mem::size_of::<$impl_type>()]>(
190 &self,
191 )
192 };
193 for byte in du8 {
194 writer.write_byte(*byte);
195 }
196 }
197
198 fn de(reader: &mut BitReader) -> Result<$impl_type, SerdeErr> {
199 const BYTES_LENGTH: usize = std::mem::size_of::<$impl_type>();
200 let mut byte_array = [0_u8; BYTES_LENGTH];
201 for index in 0..BYTES_LENGTH {
202 byte_array[index] = reader.read_byte()?;
203 }
204 let mut container = [0 as $impl_type];
205 unsafe {
206 std::ptr::copy_nonoverlapping(
207 byte_array.as_ptr() as *const $impl_type,
208 container.as_mut_ptr() as *mut $impl_type,
209 1,
210 )
211 }
212 Ok(container[0])
213 }
214
215 fn bit_length(&self) -> u32 {
216 <Self as ConstBitLength>::const_bit_length()
217 }
218 }
219 impl ConstBitLength for $impl_type {
220 fn const_bit_length() -> u32 {
221 const BYTES_LENGTH: u32 = std::mem::size_of::<$impl_type>() as u32;
222 return BYTES_LENGTH * 8;
223 }
224 }
225 };
226}
227
228impl_serde_for!(u16);
230impl_serde_for!(u32);
231impl_serde_for!(u64);
232impl_serde_for!(i16);
233impl_serde_for!(i32);
234impl_serde_for!(i64);
235impl_serde_for!(f32);
236impl_serde_for!(f64);
237
238impl Serde for u8 {
240 fn ser(&self, writer: &mut dyn BitWrite) {
241 writer.write_byte(*self);
242 }
243
244 fn de(reader: &mut BitReader) -> Result<u8, SerdeErr> {
245 reader.read_byte()
246 }
247
248 fn bit_length(&self) -> u32 {
249 <Self as ConstBitLength>::const_bit_length()
250 }
251}
252
253impl ConstBitLength for u8 {
254 fn const_bit_length() -> u32 {
255 8
256 }
257}
258
259impl Serde for i8 {
261 fn ser(&self, writer: &mut dyn BitWrite) {
262 let du8 = unsafe { std::mem::transmute::<&i8, &u8>(self) };
263 writer.write_byte(*du8);
264 }
265
266 fn de(reader: &mut BitReader) -> Result<i8, SerdeErr> {
267 let byte = [reader.read_byte()?];
268 let mut container = [0_i8];
269 unsafe {
270 std::ptr::copy_nonoverlapping(
271 byte.as_ptr() as *const i8,
272 container.as_mut_ptr(),
273 1,
274 )
275 }
276 Ok(container[0])
277 }
278
279 fn bit_length(&self) -> u32 {
280 <Self as ConstBitLength>::const_bit_length()
281 }
282}
283
284impl ConstBitLength for i8 {
285 fn const_bit_length() -> u32 {
286 8
287 }
288}
289
290impl Serde for usize {
292 fn ser(&self, writer: &mut dyn BitWrite) {
293 let u64usize = *self as u64;
294 let du8 = unsafe { std::mem::transmute::<&u64, &[u8; 8]>(&u64usize) };
295 for byte in du8 {
296 writer.write_byte(*byte);
297 }
298 }
299
300 fn de(reader: &mut BitReader) -> Result<usize, SerdeErr> {
301 let mut byte_array = [0_u8; 8];
302 for byte in &mut byte_array {
303 *byte = reader.read_byte()?;
304 }
305 let mut container = [0_u64];
306 unsafe {
307 std::ptr::copy_nonoverlapping(
308 byte_array.as_ptr().offset(0_isize) as *const u64,
309 container.as_mut_ptr(),
310 1,
311 )
312 }
313 Ok(container[0] as usize)
314 }
315
316 fn bit_length(&self) -> u32 {
317 <Self as ConstBitLength>::const_bit_length()
318 }
319}
320
321impl ConstBitLength for usize {
322 fn const_bit_length() -> u32 {
323 <u64 as ConstBitLength>::const_bit_length()
324 }
325}
326
327impl Serde for isize {
329 fn ser(&self, writer: &mut dyn BitWrite) {
330 let u64usize = *self as u64;
331 let du8 = unsafe { std::mem::transmute::<&u64, &[u8; 8]>(&u64usize) };
332 for byte in du8 {
333 writer.write_byte(*byte);
334 }
335 }
336
337 fn de(reader: &mut BitReader) -> Result<isize, SerdeErr> {
338 let mut byte_array = [0_u8; 8];
339 for byte in &mut byte_array {
340 *byte = reader.read_byte()?;
341 }
342 let mut container = [0_u64];
343 unsafe {
344 std::ptr::copy_nonoverlapping(
345 byte_array.as_ptr().offset(0_isize) as *const u64,
346 container.as_mut_ptr(),
347 1,
348 )
349 }
350 Ok(container[0] as isize)
351 }
352
353 fn bit_length(&self) -> u32 {
354 <Self as ConstBitLength>::const_bit_length()
355 }
356}
357
358impl ConstBitLength for isize {
359 fn const_bit_length() -> u32 {
360 <u64 as ConstBitLength>::const_bit_length()
361 }
362}
363
364macro_rules! test_serde_for {
367 ($impl_type:ident, $test_name:ident) => {
368 #[test]
369 fn $test_name() {
370 use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
371
372 let mut writer = BitWriter::new();
374
375 let in_1: $impl_type = 123 as $impl_type;
376
377 in_1.ser(&mut writer);
378
379 let buffer = writer.to_bytes();
380
381 let mut reader = BitReader::new(&buffer);
383
384 let out_1 = Serde::de(&mut reader).unwrap();
385
386 assert_eq!(in_1, out_1);
387 }
388 };
389}
390
391mod number_tests {
392 test_serde_for!(u8, test_u8);
393 test_serde_for!(u16, test_u16);
394 test_serde_for!(u32, test_u32);
395 test_serde_for!(u64, test_u64);
396 test_serde_for!(usize, test_usize);
397 test_serde_for!(i8, test_i8);
398 test_serde_for!(i16, test_i16);
399 test_serde_for!(i32, test_i32);
400 test_serde_for!(i64, test_i64);
401 test_serde_for!(isize, test_isize);
402 test_serde_for!(f32, test_f32);
403 test_serde_for!(f64, test_f64);
404}