From 272b2004027e50d3d913290ff8d5a3b4a46d574d Mon Sep 17 00:00:00 2001 From: Jorge Leitao Date: Wed, 29 Sep 2021 08:06:53 +0100 Subject: [PATCH] Fixed error in reading zero-width bit from hybrid RLE. (#53) --- src/encoding/hybrid_rle/decoder.rs | 1 + src/encoding/hybrid_rle/mod.rs | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/encoding/hybrid_rle/decoder.rs b/src/encoding/hybrid_rle/decoder.rs index 8b240ff5e..403b1f0bb 100644 --- a/src/encoding/hybrid_rle/decoder.rs +++ b/src/encoding/hybrid_rle/decoder.rs @@ -14,6 +14,7 @@ impl<'a> Decoder<'a> { } /// Returns the number of bits being used by this decoder. + #[inline] pub fn num_bits(&self) -> u32 { self.num_bits } diff --git a/src/encoding/hybrid_rle/mod.rs b/src/encoding/hybrid_rle/mod.rs index 30c72b957..38b1e2a73 100644 --- a/src/encoding/hybrid_rle/mod.rs +++ b/src/encoding/hybrid_rle/mod.rs @@ -18,6 +18,7 @@ pub enum HybridEncoded<'a> { } enum State<'a> { + None, Bitpacked(bitpacking::Decoder<'a>), Rle(std::iter::Take>), } @@ -29,7 +30,12 @@ pub struct HybridRleDecoder<'a> { remaining: usize, } +#[inline] fn read_next<'a, 'b>(decoder: &'b mut Decoder<'a>, remaining: usize) -> State<'a> { + if decoder.num_bits() == 0 { + return State::None; + }; + let state = decoder.next().unwrap(); match state { HybridEncoded::Bitpacked(packed) => { @@ -71,6 +77,7 @@ impl<'a> Iterator for HybridRleDecoder<'a> { let result = match &mut self.state { State::Bitpacked(decoder) => decoder.next(), State::Rle(iter) => iter.next(), + State::None => Some(0), }; if let Some(result) = result { self.remaining -= 1; @@ -203,4 +210,17 @@ mod tests { assert_eq!(result, &[2]); } + + #[test] + fn zero_bit_width() { + let data = vec![3]; + + let num_bits = 0; + + let decoder = HybridRleDecoder::new(&data, num_bits as u32, 2); + + let result = decoder.collect::>(); + + assert_eq!(result, &[0, 0]); + } }