use std::io::Read;
use crate::error::Result;
use super::{
integer::{read_varint_zigzagged, SignedEncoding},
PrimitiveValueDecoder,
};
pub struct UnboundedVarintStreamDecoder<R: Read> {
reader: R,
}
impl<R: Read> UnboundedVarintStreamDecoder<R> {
pub fn new(reader: R) -> Self {
Self { reader }
}
}
impl<R: Read> PrimitiveValueDecoder<i128> for UnboundedVarintStreamDecoder<R> {
fn skip(&mut self, n: usize) -> Result<()> {
for _ in 0..n {
read_varint_zigzagged::<i128, _, SignedEncoding>(&mut self.reader)?;
}
Ok(())
}
fn decode(&mut self, out: &mut [i128]) -> Result<()> {
for x in out.iter_mut() {
*x = read_varint_zigzagged::<i128, _, SignedEncoding>(&mut self.reader)?;
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::io::Cursor;
#[test]
fn test_unbounded_varint_decoder_skip() -> Result<()> {
let encoded = vec![0x00, 0x02, 0x01, 0xc8, 0x01, 0x90, 0x03];
let mut decoder = UnboundedVarintStreamDecoder::new(Cursor::new(&encoded));
let mut batch = vec![0i128; 2];
decoder.decode(&mut batch)?;
assert_eq!(batch, vec![0, 1]);
decoder.skip(2)?;
let mut batch = vec![0i128; 1];
decoder.decode(&mut batch)?;
assert_eq!(batch, vec![200]);
Ok(())
}
#[test]
fn test_unbounded_varint_skip_all() -> Result<()> {
let encoded = vec![0x00, 0x02, 0x01];
let mut decoder = UnboundedVarintStreamDecoder::new(Cursor::new(&encoded));
decoder.skip(3)?;
let mut batch = vec![0i128; 1];
let result = decoder.decode(&mut batch);
assert!(result.is_err());
Ok(())
}
#[test]
fn test_unbounded_varint_skip_then_decode() -> Result<()> {
let encoded = vec![0x14, 0x28, 0x3c, 0x50, 0x64];
let mut decoder = UnboundedVarintStreamDecoder::new(Cursor::new(&encoded));
decoder.skip(2)?;
let mut batch = vec![0i128; 2];
decoder.decode(&mut batch)?;
assert_eq!(batch, vec![30, 40]);
decoder.skip(1)?;
let mut batch = vec![0i128; 1];
let result = decoder.decode(&mut batch);
assert!(result.is_err());
Ok(())
}
}