diff options
author | Paul Masurel <paul.masurel@gmail.com> | 2017-05-17 10:01:25 +0900 |
---|---|---|
committer | Paul Masurel <paul.masurel@gmail.com> | 2017-05-17 15:50:07 +0900 |
commit | 113917c5217b5e0593bd8c1fc6dab38726bb0849 (patch) | |
tree | e32275b9ed13978023b52d42c57818594ff9b238 /src/common/bitpacker.rs | |
parent | 1352b95b074014a86c9861ea9c9799957c435ccd (diff) |
Making clippy happy.
+ Simplifying bitpacking by adding a 7 byte padding.
+ Bugfix in a unit test.
Diffstat (limited to 'src/common/bitpacker.rs')
-rw-r--r-- | src/common/bitpacker.rs | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/src/common/bitpacker.rs b/src/common/bitpacker.rs index 14a9631..1a8b820 100644 --- a/src/common/bitpacker.rs +++ b/src/common/bitpacker.rs @@ -82,6 +82,9 @@ impl BitPacker { pub fn close<TWrite: Write>(&mut self, output: &mut TWrite) -> io::Result<usize> { self.flush(output)?; + // Padding the write file to simplify reads. + output.write_all(&[0u8; 7])?; + self.written_size += 7; Ok(self.written_size) } } @@ -117,17 +120,8 @@ impl BitUnpacker { let addr = (idx * self.num_bits) / 8; let bit_shift = idx * self.num_bits - addr * 8; let val_unshifted_unmasked: u64; - val_unshifted_unmasked = if addr + 8 <= self.data_len { - unsafe { *(self.data_ptr.offset(addr as isize) as *const u64) } - } else { - let mut arr = [0u8; 8]; - if addr < self.data_len { - for i in 0..self.data_len - addr { - arr[i] = unsafe { *self.data_ptr.offset((addr + i) as isize) }; - } - } - unsafe { mem::transmute::<[u8; 8], u64>(arr) } - }; + debug_assert!(addr + 8 <= self.data_len, "The fast field field should have been padded with 7 bytes."); + val_unshifted_unmasked = unsafe { *(self.data_ptr.offset(addr as isize) as *const u64) }; let val_shifted = (val_unshifted_unmasked >> bit_shift) as u64; (val_shifted & self.mask) } @@ -135,7 +129,7 @@ impl BitUnpacker { - + #[cfg(test)] mod test { use super::{BitPacker, BitUnpacker, compute_num_bits}; @@ -163,7 +157,7 @@ mod test { bitpacker.write(val, &mut data).unwrap(); } let num_bytes = bitpacker.close(&mut data).unwrap(); - assert_eq!(num_bytes, (num_bits * len + 7) / 8); + assert_eq!(num_bytes, (num_bits * len + 7) / 8 + 7); assert_eq!(data.len(), num_bytes); let bitunpacker = BitUnpacker::new(&data, num_bits); for (i, val) in vals.iter().enumerate() { |