diff --git a/milli/src/heed_codec/roaring_bitmap/bo_roaring_bitmap_codec.rs b/milli/src/heed_codec/roaring_bitmap/bo_roaring_bitmap_codec.rs index 7ceb69f9a..8d1eb79dd 100644 --- a/milli/src/heed_codec/roaring_bitmap/bo_roaring_bitmap_codec.rs +++ b/milli/src/heed_codec/roaring_bitmap/bo_roaring_bitmap_codec.rs @@ -1,5 +1,7 @@ use std::borrow::Cow; -use byteorder::{NativeEndian, ReadBytesExt, WriteBytesExt}; +use std::convert::TryInto; +use std::mem::size_of; + use roaring::RoaringBitmap; pub struct BoRoaringBitmapCodec; @@ -7,11 +9,14 @@ pub struct BoRoaringBitmapCodec; impl heed::BytesDecode<'_> for BoRoaringBitmapCodec { type DItem = RoaringBitmap; - fn bytes_decode(mut bytes: &[u8]) -> Option { + fn bytes_decode(bytes: &[u8]) -> Option { let mut bitmap = RoaringBitmap::new(); - while let Ok(integer) = bytes.read_u32::() { - bitmap.insert(integer); + + for chunk in bytes.chunks(size_of::()) { + let bytes = chunk.try_into().ok()?; + bitmap.push(u32::from_ne_bytes(bytes)); } + Some(bitmap) } } @@ -20,10 +25,12 @@ impl heed::BytesEncode<'_> for BoRoaringBitmapCodec { type EItem = RoaringBitmap; fn bytes_encode(item: &Self::EItem) -> Option> { - let mut bytes = Vec::with_capacity(item.len() as usize * 4); - for integer in item.iter() { - bytes.write_u32::(integer).ok()?; - } - Some(Cow::Owned(bytes)) + let mut out = Vec::with_capacity(item.len() as usize * size_of::()); + + item.iter() + .map(|i| i.to_ne_bytes()) + .for_each(|bytes| out.extend_from_slice(&bytes)); + + Some(Cow::Owned(out)) } }