use super::{traits::Storable, VarVec};
use crate::common::codec_reader::{CodecReader, VarVecBitReader};
use dsi_bitstream::{
dispatch::{CodesRead, StaticCodeRead},
prelude::{BitRead, BitSeek, Endianness},
};
use std::fmt;
use std::iter::FusedIterator;
use std::marker::PhantomData;
pub struct VarVecIter<'a, T: Storable, E: Endianness, B: AsRef<[u64]>>
where
for<'b> VarVecBitReader<'b, E>: BitRead<E, Error = core::convert::Infallible>
+ CodesRead<E>
+ BitSeek<Error = core::convert::Infallible>,
{
len: usize,
reader: VarVecBitReader<'a, E>,
code_reader: CodecReader<'a, E>,
current_index: usize,
_markers: PhantomData<(&'a B, T)>,
}
impl<'a, T: Storable, E: Endianness, B: AsRef<[u64]>> VarVecIter<'a, T, E, B>
where
for<'b> VarVecBitReader<'b, E>: BitRead<E, Error = core::convert::Infallible>
+ CodesRead<E>
+ BitSeek<Error = core::convert::Infallible>,
{
pub(super) fn new(intvec: &'a VarVec<T, E, B>) -> Self {
let reader = VarVecBitReader::<E>::new(dsi_bitstream::impls::MemWordReader::new_inf(
intvec.data.as_ref(),
));
let code_reader = CodecReader::new(intvec.encoding);
Self {
len: intvec.len,
reader,
code_reader,
current_index: 0,
_markers: PhantomData,
}
}
}
impl<T: Storable, E: Endianness, B: AsRef<[u64]>> Iterator for VarVecIter<'_, T, E, B>
where
for<'b> VarVecBitReader<'b, E>: BitRead<E, Error = core::convert::Infallible>
+ CodesRead<E>
+ BitSeek<Error = core::convert::Infallible>,
{
type Item = T;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
if self.current_index >= self.len {
return None;
}
let value = self.code_reader.read(&mut self.reader).unwrap();
self.current_index += 1;
Some(Storable::from_word(value))
}
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining = self.len.saturating_sub(self.current_index);
(remaining, Some(remaining))
}
}
impl<T: Storable, E: Endianness, B: AsRef<[u64]>> ExactSizeIterator for VarVecIter<'_, T, E, B>
where
for<'b> VarVecBitReader<'b, E>: BitRead<E, Error = core::convert::Infallible>
+ CodesRead<E>
+ BitSeek<Error = core::convert::Infallible>,
{
fn len(&self) -> usize {
self.len.saturating_sub(self.current_index)
}
}
impl<T: Storable, E: Endianness, B: AsRef<[u64]>> FusedIterator for VarVecIter<'_, T, E, B> where
for<'b> VarVecBitReader<'b, E>: BitRead<E, Error = core::convert::Infallible>
+ CodesRead<E>
+ BitSeek<Error = core::convert::Infallible>
{
}
impl<T: Storable, E: Endianness, B: AsRef<[u64]>> fmt::Debug for VarVecIter<'_, T, E, B>
where
for<'b> VarVecBitReader<'b, E>: BitRead<E, Error = core::convert::Infallible>
+ CodesRead<E>
+ BitSeek<Error = core::convert::Infallible>,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("VarVecIter")
.field("remaining", &self.len.saturating_sub(self.current_index))
.finish()
}
}
pub struct VarVecIntoIter<T, E>
where
T: Storable + 'static,
E: Endianness + 'static,
for<'a> VarVecBitReader<'a, E>: BitRead<E, Error = core::convert::Infallible>
+ CodesRead<E>
+ BitSeek<Error = core::convert::Infallible>,
{
len: usize,
current_index: usize,
reader: VarVecBitReader<'static, E>,
code_reader: CodecReader<'static, E>,
_data_owner: Vec<u64>,
_markers: PhantomData<T>,
}
impl<T, E> VarVecIntoIter<T, E>
where
T: Storable + 'static,
E: Endianness + 'static,
for<'a> VarVecBitReader<'a, E>: BitRead<E, Error = core::convert::Infallible>
+ CodesRead<E>
+ BitSeek<Error = core::convert::Infallible>,
{
pub(super) fn new(vec: VarVec<T, E, Vec<u64>>) -> Self {
let data_ref: &'static [u64] = unsafe { std::mem::transmute(vec.data.as_slice()) };
let reader = VarVecBitReader::<E>::new(dsi_bitstream::impls::MemWordReader::new_inf(data_ref));
let code_reader = CodecReader::new(vec.encoding);
Self {
len: vec.len,
current_index: 0,
reader,
code_reader,
_data_owner: vec.data,
_markers: PhantomData,
}
}
}
impl<T, E> Iterator for VarVecIntoIter<T, E>
where
T: Storable + 'static,
E: Endianness + 'static,
for<'a> VarVecBitReader<'a, E>: BitRead<E, Error = core::convert::Infallible>
+ CodesRead<E>
+ BitSeek<Error = core::convert::Infallible>,
{
type Item = T;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
if self.current_index >= self.len {
return None;
}
let value = self.code_reader.read(&mut self.reader).unwrap();
self.current_index += 1;
Some(Storable::from_word(value))
}
fn size_hint(&self) -> (usize, Option<usize>) {
let remaining = self.len.saturating_sub(self.current_index);
(remaining, Some(remaining))
}
}
impl<T, E> ExactSizeIterator for VarVecIntoIter<T, E>
where
T: Storable + 'static,
E: Endianness + 'static,
for<'a> VarVecBitReader<'a, E>: BitRead<E, Error = core::convert::Infallible>
+ CodesRead<E>
+ BitSeek<Error = core::convert::Infallible>,
{
fn len(&self) -> usize {
self.len.saturating_sub(self.current_index)
}
}
impl<T, E> FusedIterator for VarVecIntoIter<T, E>
where
T: Storable + 'static,
E: Endianness + 'static,
for<'a> VarVecBitReader<'a, E>: BitRead<E, Error = core::convert::Infallible>
+ CodesRead<E>
+ BitSeek<Error = core::convert::Infallible>,
{
}
impl<T, E> fmt::Debug for VarVecIntoIter<T, E>
where
T: Storable + 'static,
E: Endianness + 'static,
for<'a> VarVecBitReader<'a, E>: BitRead<E, Error = core::convert::Infallible>
+ CodesRead<E>
+ BitSeek<Error = core::convert::Infallible>,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("VarVecIntoIter")
.field("remaining", &self.len.saturating_sub(self.current_index))
.finish()
}
}