jppe/encode/
impls_float.rs

1use crate::std::*;
2use crate::{ByteEncode, BorrowByteEncode, ByteOrder, ContainerAttrModifiers, FieldAttrModifiers};
3
4
5macro_rules! encode_float {
6    ($t:ident, $as_t:ident) => {
7        impl ByteEncode for $t {
8            fn encode(&self, input: &mut Vec<u8>, cattr: Option<&ContainerAttrModifiers>, fattr: Option<&FieldAttrModifiers>)
9            where 
10                Self: Sized
11            {
12                match crate::get_byteorder(cattr, fattr) {
13                    ByteOrder::Be => input.extend(self.to_be_bytes()),
14                    ByteOrder::Le => input.extend(self.to_le_bytes()),
15                }
16            }
17        }        
18
19
20        impl BorrowByteEncode for $t {
21            fn encode(&self, input: &mut Vec<u8>, cattr: Option<&ContainerAttrModifiers>, fattr: Option<&FieldAttrModifiers>)
22            where 
23                Self: Sized
24            {
25                match crate::get_byteorder(cattr, fattr) {
26                    ByteOrder::Be => input.extend(self.to_be_bytes()),
27                    ByteOrder::Le => input.extend(self.to_le_bytes()),
28                }
29            }
30        }
31    };
32
33    () => {
34        encode_float!(f32, u32);
35        encode_float!(f64, u64);
36    }
37}
38
39
40encode_float!();
41
42
43#[cfg(test)]
44mod tests {
45    use crate::BorrowByteEncode;
46
47    #[test]
48    fn test_encode_f32() {
49        let mut buf = vec![];
50        let value = 0.1_f32;
51        value.encode(&mut buf, None, None);
52        assert_eq!(buf, [61, 204, 204, 205]);
53
54        let mut buf = vec![];
55        let value = 0.1_f32;
56        let cattr = crate::ContainerAttrModifiers {
57            byteorder: Some(crate::ByteOrder::Le),
58            ..Default::default()
59        };
60        value.encode(&mut buf, Some(&cattr), None);
61        assert_eq!(buf, [205, 204, 204, 61]);
62
63        let mut buf = vec![];
64        let value = 0.1_f32;
65        let cattr = crate::ContainerAttrModifiers {
66            byteorder: Some(crate::ByteOrder::Le),
67            ..Default::default()
68        };
69        let fattr = crate::FieldAttrModifiers {
70            byteorder: Some(crate::ByteOrder::Be),
71            ..Default::default()
72        };
73        value.encode(&mut buf, Some(&cattr), Some(&fattr));
74        assert_eq!(buf, [61, 204, 204, 205]);
75    }
76
77    #[test]
78    fn test_encode_f64() {
79        let mut buf = vec![];
80        let value = 0.1_f64;
81        value.encode(&mut buf, None, None);
82        assert_eq!(buf, [63, 185, 153, 153, 153, 153, 153, 154]);
83
84        let mut buf = vec![];
85        let value = 0.1_f64;
86        let cattr = crate::ContainerAttrModifiers {
87            byteorder: Some(crate::ByteOrder::Le),
88            ..Default::default()
89        };
90        value.encode(&mut buf, Some(&cattr), None);
91        assert_eq!(buf, [154, 153, 153, 153, 153, 153, 185, 63]);
92
93        let mut buf = vec![];
94        let value = 0.1_f64;
95        let cattr = crate::ContainerAttrModifiers {
96            byteorder: Some(crate::ByteOrder::Le),
97            ..Default::default()
98        };
99        let fattr = crate::FieldAttrModifiers {
100            byteorder: Some(crate::ByteOrder::Be),
101            ..Default::default()
102        };
103        value.encode(&mut buf, Some(&cattr), Some(&fattr));
104        assert_eq!(buf, [63, 185, 153, 153, 153, 153, 153, 154]);
105    }
106}