use std::{borrow::Cow, ops::Range}; use crate::columnar::encoding::{BooleanDecoder, BooleanEncoder}; #[derive(Clone, Debug, PartialEq)] pub(crate) struct BooleanRange(Range); impl BooleanRange { pub(crate) fn decoder<'a>(&self, data: &'a [u8]) -> BooleanDecoder<'a> { BooleanDecoder::from(Cow::Borrowed(&data[self.0.clone()])) } pub(crate) fn encode>(items: I, out: &mut Vec) -> Self { let start = out.len(); let mut encoder = BooleanEncoder::from(out); for i in items { encoder.append(i); } let (_, len) = encoder.finish(); (start..(start + len)).into() } } impl AsRef> for BooleanRange { fn as_ref(&self) -> &Range { &self.0 } } impl From> for BooleanRange { fn from(r: Range) -> BooleanRange { BooleanRange(r) } } impl From for Range { fn from(r: BooleanRange) -> Range { r.0 } }