use std::marker::PhantomData;
use crate::level_indices;
use crate::data_block::DataBlock;
use crate::bit_block::BitBlock;
use crate::config::Config;
mod caching;
pub use caching::{BlockIter, IndexIter};
pub struct BlockCursor<Conf: Config> {
pub(crate) level0_index: u16,
pub(crate) level1_next_index: u16,
pub(crate) phantom: PhantomData<Conf>
}
impl<Conf: Config> Default for BlockCursor<Conf>{
#[inline]
fn default() -> Self {
Self::start()
}
}
impl<Conf: Config> BlockCursor<Conf>{
#[inline]
pub fn start() -> Self{
unsafe{ std::mem::zeroed() }
}
#[inline]
pub fn end() -> Self{
Self{
level0_index: Conf::Level0BitBlock::size() as u16,
level1_next_index: Conf::Level1BitBlock::size() as u16,
phantom: Default::default(),
}
}
}
impl<Conf: Config> Clone for BlockCursor<Conf>{
#[inline]
fn clone(&self) -> Self {
unsafe{ std::ptr::read(self) }
}
}
impl<Conf: Config> Copy for BlockCursor<Conf>{}
impl<Conf: Config> From<usize> for BlockCursor<Conf>{
#[inline]
fn from(mut index: usize) -> Self {
index = std::cmp::min(index, Conf::MAX_CAPACITY);
let (level0, level1, _) = level_indices::<Conf>(index);
Self{
level0_index: level0 as u16,
level1_next_index: level1 as u16,
phantom: PhantomData,
}
}
}
impl<Conf: Config> From<&DataBlock<Conf::DataBitBlock>> for BlockCursor<Conf>{
#[inline]
fn from(block: &DataBlock<Conf::DataBitBlock>) -> Self {
Self::from(block.start_index)
}
}
pub struct IndexCursor<Conf: Config> {
pub(crate) block_cursor: BlockCursor<Conf>,
pub(crate) data_next_index: u32
}
impl<Conf: Config> Default for IndexCursor<Conf>{
#[inline]
fn default() -> Self {
Self::start()
}
}
impl<Conf: Config> IndexCursor<Conf>{
#[inline]
pub fn start() -> Self{
unsafe{ std::mem::zeroed() }
}
#[inline]
pub fn end() -> Self{
Self{
block_cursor: BlockCursor::end(),
data_next_index: Conf::DataBitBlock::size() as u32
}
}
}
impl<Conf: Config> Clone for IndexCursor<Conf>{
#[inline]
fn clone(&self) -> Self {
unsafe{ std::ptr::read(self) }
}
}
impl<Conf: Config> Copy for IndexCursor<Conf>{}
impl<Conf: Config> From<usize> for IndexCursor<Conf>{
#[inline]
fn from(mut index: usize) -> Self {
index = std::cmp::min(index, Conf::MAX_CAPACITY);
let (level0, level1, data) = level_indices::<Conf>(index);
Self{
block_cursor: BlockCursor {
level0_index: level0 as u16,
level1_next_index: level1 as u16,
phantom: PhantomData
},
data_next_index: data as u32,
}
}
}
impl<Conf: Config> From<&DataBlock<Conf::DataBitBlock>> for IndexCursor<Conf>{
#[inline]
fn from(block: &DataBlock<Conf::DataBitBlock>) -> Self {
Self::from(block.start_index)
}
}