summaryrefslogtreecommitdiffstats
path: root/src/common/bitpacker.rs
diff options
context:
space:
mode:
authorPaul Masurel <paul.masurel@gmail.com>2017-05-17 10:01:25 +0900
committerPaul Masurel <paul.masurel@gmail.com>2017-05-17 15:50:07 +0900
commit113917c5217b5e0593bd8c1fc6dab38726bb0849 (patch)
treee32275b9ed13978023b52d42c57818594ff9b238 /src/common/bitpacker.rs
parent1352b95b074014a86c9861ea9c9799957c435ccd (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.rs20
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() {