Skip to main content

naia_serde/impls/
scalars.rs

1use crate::{
2    bit_reader::BitReader,
3    bit_writer::BitWrite,
4    error::SerdeErr,
5    serde::{ConstBitLength, Serde},
6};
7
8// Unit //
9
10impl 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// tests
29
30#[cfg(test)]
31mod unit_tests {
32    use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
33
34    #[test]
35    fn read_write() {
36        // Write
37        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        //Read
46        let mut reader = BitReader::new(&buffer);
47
48        // Type annotation enforces that `Serde::de` returns the unit
49        // type — that's the meaningful assertion. Comparing two `()`
50        // values is trivially true (and clippy used to flag the
51        // assert_eq); cargo clippy --fix removed the comparison.
52        let out_unit: () = Serde::de(&mut reader).unwrap();
53        let _ = (in_unit, out_unit);
54    }
55}
56
57// Boolean //
58
59impl 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// tests
80
81#[cfg(test)]
82mod bool_tests {
83    use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
84
85    #[test]
86    fn read_write() {
87        // Write
88        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        //Read
99        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
109// Characters //
110
111impl 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// tests
153
154#[cfg(test)]
155mod char_tests {
156    use crate::{bit_reader::BitReader, bit_writer::BitWriter, serde::Serde};
157
158    #[test]
159    fn read_write() {
160        // Write
161        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        //Read
172        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
182// Integers & Floating-point Numbers //
183
184macro_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
228// number primitives
229impl_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
238// u8
239impl 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
259// i8
260impl 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
290// usize
291impl 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
327// isize
328impl 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
364// tests
365
366macro_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            // Write
373            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            //Read
382            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}