use super::{DepthFirstIter, TableIter};
use crate::{Chunk, Ecc, Header, IdType, Table, Version};
use std::{
fmt::Debug,
mem::size_of,
ops::{Deref, DerefMut},
};
#[derive(Debug)]
pub struct Hff<T: Debug> {
native: bool,
version: Version,
id_type: IdType,
content_type: Ecc,
tables: Vec<Table>,
chunks: Vec<Chunk>,
accessor: T,
}
impl<T: Debug> Hff<T> {
pub fn new(
accessor: T,
header: Header,
tables: impl Into<Vec<Table>>,
chunks: impl Into<Vec<Chunk>>,
) -> Self {
Self {
native: header.is_native_endian(),
version: header.version(),
id_type: header.id_type(),
content_type: header.content_type(),
tables: tables.into(),
chunks: chunks.into(),
accessor,
}
}
pub fn is_native_endian(&self) -> bool {
self.native
}
pub fn version(&self) -> Version {
self.version
}
pub fn id_type(&self) -> IdType {
self.id_type
}
pub fn content_type(&self) -> Ecc {
self.content_type
}
pub fn offset_to_data(&self) -> usize {
size_of::<Header>()
+ (size_of::<Table>() * self.tables.len())
+ (size_of::<Chunk>() * self.chunks.len())
}
pub fn depth_first(&self) -> DepthFirstIter<'_, T> {
DepthFirstIter::new(self)
}
pub fn tables(&self) -> TableIter<'_, T> {
TableIter::new(self, 0)
}
pub fn tables_array(&self) -> &[Table] {
&self.tables
}
pub fn chunks_array(&self) -> &[Chunk] {
&self.chunks
}
}
impl<T: Debug> Deref for Hff<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
&self.accessor
}
}
impl<T: Debug> DerefMut for Hff<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.accessor
}
}