use crate::error::Error;
use super::super::delta_bitpacked;
#[derive(Debug)]
pub struct Decoder<'a> {
values: &'a [u8],
lengths: delta_bitpacked::Decoder<'a>,
total_length: u32,
}
impl<'a> Decoder<'a> {
pub fn try_new(values: &'a [u8]) -> Result<Self, Error> {
let lengths = delta_bitpacked::Decoder::try_new(values)?;
Ok(Self {
values,
lengths,
total_length: 0,
})
}
pub fn into_values(self) -> &'a [u8] {
assert_eq!(self.lengths.size_hint().0, 0);
let start = self.lengths.consumed_bytes();
&self.values[start..start + self.total_length as usize]
}
pub fn values(&self) -> &'a [u8] {
assert_eq!(self.lengths.size_hint().0, 0);
let start = self.lengths.consumed_bytes();
&self.values[start..start + self.total_length as usize]
}
}
impl<'a> Iterator for Decoder<'a> {
type Item = Result<i32, Error>;
fn next(&mut self) -> Option<Self::Item> {
let result = self.lengths.next();
match result {
Some(Ok(v)) => {
self.total_length += v as u32;
Some(Ok(v as i32))
}
Some(Err(error)) => Some(Err(error)),
None => None,
}
}
}