hff_core/write/
table_desc.rs1use super::{ChunkArray, ChunkDesc, DataArray, DataSource, TableArray};
2use crate::{Chunk, Identifier, Table};
3
4#[derive(Debug)]
6pub struct TableDesc<'a> {
7 identifier: Identifier,
9 metadata: Option<DataSource<'a>>,
11 chunks: Vec<ChunkDesc<'a>>,
13 children: Vec<TableDesc<'a>>,
15}
16
17impl<'a> TableDesc<'a> {
18 pub fn new(
20 identifier: Identifier,
21 metadata: Option<DataSource<'a>>,
22 chunks: Vec<ChunkDesc<'a>>,
23 children: Vec<TableDesc<'a>>,
24 ) -> Self {
25 Self {
26 identifier,
27 metadata,
28 chunks,
29 children,
30 }
31 }
32
33 pub fn flatten(
36 self,
37 has_sibling: bool,
38 tables: &mut TableArray,
39 chunks: &mut ChunkArray,
40 data: &mut DataArray<'a>,
41 ) {
42 let had_metadata = if let Some(metadata) = self.metadata {
45 data.push(metadata);
46 true
47 } else {
48 false
49 };
50
51 let chunk_start = chunks.len();
53 let chunk_count = self.chunks.len();
54
55 for chunk in self.chunks {
57 chunks.push(Chunk::new(chunk.identifier(), 0, 0));
59 data.push(chunk.data_source());
60 }
61
62 let table_index = tables.len();
65
66 tables.push(
68 had_metadata,
69 Table::create()
70 .identifier(self.identifier)
71 .chunk_index(if chunk_count > 0 {
72 chunk_start as u32
73 } else {
74 0
75 })
76 .chunk_count(chunk_count as u32)
77 .child_count(self.children.len() as u32)
78 .end(),
79 );
80
81 let child_count = self.children.len();
83 for (index, child) in self.children.into_iter().enumerate() {
84 child.flatten(index < child_count - 1, tables, chunks, data);
85 }
86
87 if has_sibling {
89 let sibling = (tables.len() - table_index) as u32;
91
92 let table = &mut tables[table_index];
94 *table.1.sibling_mut() = sibling;
95 }
96 }
97}