use super::{ChunkArray, DataArray, TableArray};
use crate::{Chunk, Header, Table};
#[derive(Debug)]
pub struct HffDesc<'a> {
tables: TableArray,
chunks: ChunkArray,
data: Option<DataArray<'a>>,
}
impl<'a> HffDesc<'a> {
pub fn new(tables: TableArray, chunks: ChunkArray, data: DataArray<'a>) -> Self {
Self {
tables,
chunks,
data: Some(data),
}
}
pub fn finish(self) -> (TableArray, ChunkArray, DataArray<'a>) {
(self.tables, self.chunks, self.data.unwrap())
}
pub fn update_data(
tables: &mut TableArray,
chunks: &mut ChunkArray,
offset: u64,
offset_len: &[(u64, u64)],
) {
let mut table_index = 0;
let mut chunk_index = 0;
let mut chunk_count = 0;
let mut entry = 0;
loop {
if chunk_count > 0 {
*chunks[chunk_index].offset_mut() = offset_len[entry].0 + offset;
*chunks[chunk_index].length_mut() = offset_len[entry].1;
chunk_count -= 1;
entry += 1;
chunk_index += 1;
continue;
}
if table_index == tables.len() {
break;
}
if tables[table_index].0 {
*tables[table_index].1.metadata_offset_mut() = offset_len[entry].0 + offset;
*tables[table_index].1.metadata_length_mut() = offset_len[entry].1;
entry += 1;
}
chunk_count = tables[table_index].1.chunk_count();
table_index += 1;
}
}
pub fn arrays_size(&self) -> usize {
self.tables.len() * Table::SIZE + self.chunks.len() * Chunk::SIZE
}
pub fn offset_to_blob(&self) -> usize {
Header::SIZE + self.arrays_size()
}
}