use super::{ChunkIter, Hff, TableIter};
use crate::{ContentInfo, Ecc};
use std::fmt::Debug;
#[derive(Copy, Clone)]
pub struct TableView<'a, T: Debug> {
hff: &'a Hff<T>,
index: usize,
}
impl<'a, T: Debug> Debug for TableView<'a, T> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}", self.hff.tables_array()[self.index])
}
}
impl<'a, T: Debug> ContentInfo for TableView<'a, T> {
fn len(&self) -> u64 {
self.hff.tables_array()[self.index].metadata_length()
}
fn offset(&self) -> u64 {
self.hff.tables_array()[self.index].metadata_offset()
}
}
impl<'a, T: Debug> TableView<'a, T> {
pub(super) fn new(hff: &'a Hff<T>, index: usize) -> Self {
Self { hff, index }
}
pub fn hff(&self) -> &Hff<T> {
self.hff
}
pub fn has_metadata(&self) -> bool {
self.hff.tables_array()[self.index].metadata_length() > 0
}
pub fn index(&self) -> usize {
self.index
}
pub fn primary(&self) -> Ecc {
self.hff.tables_array()[self.index].primary()
}
pub fn secondary(&self) -> Ecc {
self.hff.tables_array()[self.index].secondary()
}
pub fn child_count(&self) -> usize {
self.hff.tables_array()[self.index].child_count() as usize
}
pub fn iter(&self) -> TableIter<'a, T> {
if self.child_count() > 0 {
TableIter::new(self.hff, self.index + 1)
} else {
TableIter::empty(self.hff)
}
}
pub fn chunks(&self) -> ChunkIter<'a, T> {
let table = &self.hff.tables_array()[self.index];
ChunkIter::new(
self.hff,
table.chunk_index() as usize,
table.chunk_count() as usize,
)
}
pub fn chunk_count(&self) -> usize {
self.hff.tables_array()[self.index].chunk_count() as usize
}
}