diff --git a/src/bitmap/immutable.rs b/src/bitmap/immutable.rs index 5630e8b4bd8..0b1ab34ea42 100644 --- a/src/bitmap/immutable.rs +++ b/src/bitmap/immutable.rs @@ -216,7 +216,7 @@ impl Bitmap { #[inline] pub(crate) fn as_slice(&self) -> &[u8] { let start = self.offset / 8; - let len = self.length.saturating_add(7) / 8; + let len = (self.offset() + self.length).saturating_add(7) / 8; &self.bytes[start..start + len] } } @@ -261,4 +261,15 @@ mod tests { assert_eq!(0, b.offset()); } + + #[test] + fn as_slice_offset_middle() { + let b = Bitmap::from_u8_slice(&[0, 0, 0, 0b00010101], 27); + let b = b.slice(22, 5); + + let slice = b.as_slice(); + assert_eq!(slice, &[0, 0b00010101]); + + assert_eq!(6, b.offset()); + } } diff --git a/src/bitmap/utils/slice_iterator.rs b/src/bitmap/utils/slice_iterator.rs index 2dfbe111eef..f2633a16159 100644 --- a/src/bitmap/utils/slice_iterator.rs +++ b/src/bitmap/utils/slice_iterator.rs @@ -284,4 +284,13 @@ mod tests { // the first "11" in the second byte assert_eq!(chunks, vec![(0, 2)]); } + + #[test] + fn remainder_1() { + let values = Bitmap::from_u8_slice(&[0, 0, 0b00000000, 0b00010101], 27); + let values = values.slice(22, 5); + let iter = SlicesIterator::new(&values); + let chunks = iter.collect::>(); + assert_eq!(chunks, vec![(2, 1), (4, 1)]); + } }