om_file_format_sys/
lib.rs

1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
5
6#[cfg(test)]
7mod tests {
8    #[test]
9    fn test_round_trip_p4n() {
10        const n: usize = 3;
11        let mut nums = vec![33_u16, 44, 77];
12        let mut compressed = vec![0_u8; 1000];
13        // TODO: p4bound buffer sizes!
14        let mut recovered = vec![0_u16; n + 200];
15        unsafe {
16            crate::p4nzenc128v16(nums.as_mut_ptr(), 3, compressed.as_mut_ptr());
17            crate::p4nzdec128v16(compressed.as_mut_ptr(), n, recovered.as_mut_ptr());
18        }
19        assert_eq!(recovered[..n], nums[..n]);
20    }
21
22    #[test]
23    fn test_round_trip_fp32() {
24        const n: usize = 3;
25        let mut nums = vec![33_u32, 44, 77];
26        let mut compressed = vec![0_u8; 1000];
27        let mut recovered = vec![0_u32; n];
28        unsafe {
29            let compressed_size = crate::fpxenc32(nums.as_mut_ptr(), 3, compressed.as_mut_ptr(), 0);
30            let decompressed_size =
31                crate::fpxdec32(compressed.as_mut_ptr(), n, recovered.as_mut_ptr(), 0);
32            assert_eq!(compressed_size, decompressed_size);
33        }
34        assert_eq!(recovered, nums);
35    }
36
37    #[test]
38    fn test_round_trip_fp32_with_very_short_length() {
39        let data: Vec<f32> = vec![10.0, 22.0, 23.0, 24.0];
40        let length = 1; //data.len();
41
42        // create buffers for compression and decompression!
43        let mut compressed = vec![0; 1000];
44        let mut decompressed = vec![0.0; length];
45
46        // compress data
47        let compressed_size = unsafe {
48            crate::fpxenc32(
49                data.as_ptr() as *mut u32,
50                length,
51                compressed.as_mut_ptr(),
52                0,
53            )
54        };
55        if compressed_size >= compressed.len() {
56            panic!("Compress Buffer too small");
57        }
58
59        // decompress data
60        let decompressed_size = unsafe {
61            crate::fpxdec32(
62                compressed.as_mut_ptr(),
63                length,
64                decompressed.as_mut_ptr() as *mut u32,
65                0,
66            )
67        };
68
69        // this should be equal (we check it in the reader)
70        // here we have a problem if length is only 1 and the exponent of the
71        // float is greater than 0 (e.g. the value is greater than 10)
72        // NOTE: This fails with 4 != 5 in the original turbo-pfor library
73        assert_eq!(decompressed_size, compressed_size);
74        assert_eq!(data[..length], decompressed[..length]);
75    }
76
77    #[test]
78    fn test_delta2d_decode() {
79        let mut buffer: Vec<i16> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
80        unsafe { crate::delta2d_decode16(2, 5, buffer.as_mut_ptr()) };
81        assert_eq!(buffer, vec![1, 2, 3, 4, 5, 7, 9, 11, 13, 15]);
82    }
83
84    #[test]
85    fn test_delta2d_encode() {
86        let mut buffer: Vec<i16> = vec![1, 2, 3, 4, 5, 7, 9, 11, 13, 15];
87        unsafe { crate::delta2d_encode16(2, 5, buffer.as_mut_ptr()) };
88        assert_eq!(buffer, vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
89
90        let mut buffer: Vec<u8> = vec![2, 0, 3, 0, 7, 0, 8, 0];
91        unsafe { crate::delta2d_encode16(4, 2, buffer.as_mut_ptr() as *mut i16) }
92        assert_eq!(&buffer, &[2, 0, 3, 0, 5, 0, 5, 0])
93    }
94
95    #[test]
96    fn test_delta2d_decode_xor() {
97        let mut buffer: Vec<f32> = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0];
98        unsafe { crate::delta2d_decode_xor(2, 5, buffer.as_mut_ptr()) };
99        let expected: Vec<f32> = vec![
100            1.0,
101            2.0,
102            3.0,
103            4.0,
104            5.0,
105            2.5521178e38,
106            2.0571151e-38,
107            3.526483e-38,
108            5.2897246e-38,
109            4.7019774e-38,
110        ];
111        assert_eq!(buffer, expected);
112    }
113
114    #[test]
115    fn test_delta2d_encode_xor() {
116        let mut buffer: Vec<f32> = vec![1.0, 2.0, 3.0, 4.0, 5.0, 7.0, 5.0, 11.0, 12.0, 15.0];
117        unsafe { crate::delta2d_encode_xor(2, 5, buffer.as_mut_ptr()) };
118        let expected: Vec<f32> = vec![
119            1.0,
120            2.0,
121            3.0,
122            4.0,
123            5.0,
124            2.9774707e38,
125            1.469368e-38,
126            4.4081038e-38,
127            7.052966e-38,
128            7.6407133e-38,
129        ];
130        assert_eq!(buffer, expected);
131    }
132
133    #[test]
134    fn test_delta2d_xor_roundtrip() {
135        let mut buffer: Vec<f32> = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0];
136        unsafe {
137            crate::delta2d_encode_xor(2, 5, buffer.as_mut_ptr());
138            crate::delta2d_decode_xor(2, 5, buffer.as_mut_ptr());
139        }
140        let expected: Vec<f32> = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0];
141        assert_eq!(buffer, expected);
142    }
143
144    #[test]
145    fn test_delta2d_roundtrip() {
146        let mut buffer: Vec<i16> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
147        unsafe {
148            crate::delta2d_encode16(2, 5, buffer.as_mut_ptr());
149            crate::delta2d_decode16(2, 5, buffer.as_mut_ptr());
150        }
151        let expected: Vec<i16> = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
152        assert_eq!(buffer, expected);
153    }
154}