|
4 | 4 | pub use cxx::Exception; |
5 | 5 | use cxx::UniquePtr; |
6 | 6 |
|
| 7 | +use crate::CodecToSlice; |
| 8 | + |
7 | 9 | /// FFI bridge to the C++ FastPFOR library. |
8 | 10 | /// |
9 | 11 | /// This module contains the raw FFI declarations for interfacing with the C++ code. |
@@ -142,6 +144,51 @@ pub trait Codec32: CodecWrapper { |
142 | 144 | } |
143 | 145 | } |
144 | 146 |
|
| 147 | +impl<C: Codec32> CodecToSlice<u32> for C { |
| 148 | + type Error = Exception; |
| 149 | + |
| 150 | + fn compress_to_slice<'out>( |
| 151 | + &mut self, |
| 152 | + input: &[u32], |
| 153 | + output: &'out mut [u32], |
| 154 | + ) -> Result<&'out [u32], Self::Error> { |
| 155 | + let result = self.encode32(input, output)?; |
| 156 | + Ok(result) |
| 157 | + } |
| 158 | + |
| 159 | + fn decompress_to_slice<'out>( |
| 160 | + &mut self, |
| 161 | + input: &[u32], |
| 162 | + output: &'out mut [u32], |
| 163 | + ) -> Result<&'out [u32], Self::Error> { |
| 164 | + let result = self.decode32(input, output)?; |
| 165 | + Ok(result) |
| 166 | + } |
| 167 | +} |
| 168 | + |
| 169 | +// Note: 64-bit integers are compressed into 32-bit word arrays. |
| 170 | +impl<C: Codec64> CodecToSlice<u64, u32> for C { |
| 171 | + type Error = Exception; |
| 172 | + |
| 173 | + fn compress_to_slice<'out>( |
| 174 | + &mut self, |
| 175 | + input: &[u64], |
| 176 | + output: &'out mut [u32], |
| 177 | + ) -> Result<&'out [u32], Self::Error> { |
| 178 | + let result = self.encode64(input, output)?; |
| 179 | + Ok(result) |
| 180 | + } |
| 181 | + |
| 182 | + fn decompress_to_slice<'out>( |
| 183 | + &mut self, |
| 184 | + input: &[u32], |
| 185 | + output: &'out mut [u64], |
| 186 | + ) -> Result<&'out [u64], Self::Error> { |
| 187 | + let result = self.decode64(input, output)?; |
| 188 | + Ok(result) |
| 189 | + } |
| 190 | +} |
| 191 | + |
145 | 192 | /// Trait for codecs that support 64-bit integer compression. |
146 | 193 | /// |
147 | 194 | /// Only certain codecs support 64-bit integers. These are marked with the `@ 64` |
@@ -385,38 +432,50 @@ mod tests { |
385 | 432 |
|
386 | 433 | #[test] |
387 | 434 | fn test_32() { |
388 | | - let codec = FastPFor128Codec::new(); |
| 435 | + let mut codec = FastPFor128Codec::new(); |
389 | 436 | let input = vec![1, 2, 3, 4, 5]; |
390 | 437 | let mut output = vec![0; 10]; |
391 | 438 | let mut output2 = vec![0; 10]; |
| 439 | + let mut output3 = vec![0; 10]; |
392 | 440 | let encoded = codec.encode32(&input, &mut output).unwrap(); |
393 | 441 | let encoded2 = codec.encode32(&input, &mut output2).unwrap(); |
| 442 | + let encoded3 = codec.compress_to_slice(&input, &mut output3).unwrap(); |
394 | 443 | assert_eq!(encoded, encoded2); |
| 444 | + assert_eq!(encoded, encoded3); |
395 | 445 |
|
396 | 446 | let mut decoded = vec![0; 10]; |
397 | 447 | let mut decoded2 = vec![0; 10]; |
| 448 | + let mut decoded3 = vec![0; 10]; |
398 | 449 | let decoded = codec.decode32(encoded, &mut decoded).unwrap(); |
399 | 450 | let decoded2 = codec.decode32(encoded, &mut decoded2).unwrap(); |
| 451 | + let decoded3 = codec.decompress_to_slice(encoded, &mut decoded3).unwrap(); |
400 | 452 | assert_eq!(decoded, decoded2); |
| 453 | + assert_eq!(decoded, decoded3); |
401 | 454 |
|
402 | 455 | assert_eq!(decoded, input); |
403 | 456 | } |
404 | 457 |
|
405 | 458 | #[test] |
406 | 459 | fn test_64() { |
407 | | - let codec = FastPFor128Codec::new(); |
| 460 | + let mut codec = FastPFor128Codec::new(); |
408 | 461 | let input = vec![1, 2, 3, 4, 5]; |
409 | 462 | let mut output = vec![0; 10]; |
410 | 463 | let mut output2 = vec![0; 10]; |
| 464 | + let mut output3 = vec![0; 10]; |
411 | 465 | let encoded = codec.encode64(&input, &mut output).unwrap(); |
412 | 466 | let encoded2 = codec.encode64(&input, &mut output2).unwrap(); |
| 467 | + let encoded3 = codec.compress_to_slice(&input, &mut output3).unwrap(); |
413 | 468 | assert_eq!(encoded, encoded2); |
| 469 | + assert_eq!(encoded, encoded3); |
414 | 470 |
|
415 | 471 | let mut decoded = vec![0; 10]; |
416 | 472 | let mut decoded2 = vec![0; 10]; |
| 473 | + let mut decoded3 = vec![0; 10]; |
417 | 474 | let decoded = codec.decode64(encoded, &mut decoded).unwrap(); |
418 | 475 | let decoded2 = codec.decode64(encoded, &mut decoded2).unwrap(); |
| 476 | + let decoded3 = codec.decompress_to_slice(encoded, &mut decoded3).unwrap(); |
419 | 477 | assert_eq!(decoded, decoded2); |
| 478 | + assert_eq!(decoded, decoded3); |
420 | 479 |
|
421 | 480 | assert_eq!(decoded, input); |
422 | 481 | } |
|
0 commit comments