1#![allow(clippy::upper_case_acronyms)]
2#[cfg(feature = "bytemuck")]
14use bytemuck_derive::{Pod, Zeroable};
15
16#[derive(Copy, Clone, Debug, PartialEq, Eq)]
17#[cfg_attr(feature = "bytemuck", derive(Pod, Zeroable))]
18#[repr(C)]
19pub struct ArrayHeader {
21 pub count: u32,
23 pub base_offset: u32,
25}
26
27impl From<(u32, u32)> for ArrayHeader {
28 fn from((count, base_offset): (u32, u32)) -> Self {
29 Self { count, base_offset }
30 }
31}
32
33#[derive(Copy, Clone, Debug, PartialEq, Eq)]
37#[cfg_attr(feature = "bytemuck", derive(Pod, Zeroable))]
38#[repr(C)]
39pub struct FDBHeader {
40 pub tables: ArrayHeader,
42}
43
44impl FDBHeader {
45 #[inline]
46 pub const fn table_headers_byte_count(&self) -> usize {
48 self.tables.count as usize * std::mem::size_of::<FDBTableHeader>()
49 }
50}
51
52#[derive(Copy, Clone, Debug, PartialEq, Eq)]
53#[cfg_attr(feature = "bytemuck", derive(Pod, Zeroable))]
54#[repr(C)]
55pub struct FDBTableHeader {
61 pub table_def_header_addr: u32,
63 pub table_data_header_addr: u32,
65}
66
67#[derive(Copy, Clone, Debug, PartialEq, Eq)]
68#[cfg_attr(feature = "bytemuck", derive(Pod, Zeroable))]
69#[repr(C)]
70pub struct FDBTableDefHeader {
75 pub column_count: u32,
77 pub table_name_addr: u32,
79 pub column_header_list_addr: u32,
81}
82
83impl From<(u32, u32, u32)> for FDBTableDefHeader {
84 fn from((column_count, table_name_addr, column_header_list_addr): (u32, u32, u32)) -> Self {
85 Self {
86 column_count,
87 table_name_addr,
88 column_header_list_addr,
89 }
90 }
91}
92
93impl From<[u32; 3]> for FDBTableDefHeader {
94 fn from([column_count, table_name_addr, column_header_list_addr]: [u32; 3]) -> Self {
95 Self {
96 column_count,
97 table_name_addr,
98 column_header_list_addr,
99 }
100 }
101}
102
103impl FDBTableDefHeader {
104 #[inline]
105 pub const fn column_header_list_byte_count(&self) -> usize {
107 self.column_count as usize * std::mem::size_of::<FDBColumnHeader>()
108 }
109}
110
111#[derive(Copy, Clone, Debug, PartialEq, Eq)]
112#[cfg_attr(feature = "bytemuck", derive(Pod, Zeroable))]
113#[repr(C)]
114pub struct FDBColumnHeader {
119 pub column_data_type: u32,
121 pub column_name_addr: u32,
123}
124
125#[derive(Copy, Clone, Debug, PartialEq, Eq)]
126#[cfg_attr(feature = "bytemuck", derive(Pod, Zeroable))]
127#[repr(C)]
128pub struct FDBTableDataHeader {
132 pub buckets: ArrayHeader,
134}
135
136impl FDBTableDataHeader {
137 #[inline]
138 pub const fn bucket_header_list_byte_count(&self) -> usize {
140 self.buckets.count as usize * std::mem::size_of::<FDBBucketHeader>()
141 }
142}
143
144#[derive(Copy, Clone, Debug, PartialEq, Eq)]
145#[cfg_attr(feature = "bytemuck", derive(Pod, Zeroable))]
146#[repr(C)]
147pub struct FDBBucketHeader {
152 pub row_header_list_head_addr: u32,
154}
155
156impl From<u32> for FDBBucketHeader {
157 fn from(row_header_list_head_addr: u32) -> Self {
158 Self {
159 row_header_list_head_addr,
160 }
161 }
162}
163
164#[derive(Copy, Clone, Debug, PartialEq, Eq)]
165#[cfg_attr(feature = "bytemuck", derive(Pod, Zeroable))]
166#[repr(C)]
167pub struct FDBRowHeaderListEntry {
172 pub row_header_addr: u32,
174 pub row_header_list_next_addr: u32,
176}
177
178#[derive(Copy, Clone, Debug, PartialEq, Eq)]
179#[cfg_attr(feature = "bytemuck", derive(Pod, Zeroable))]
180#[repr(C)]
181pub struct FDBRowHeader {
183 pub fields: ArrayHeader,
185}
186
187impl FDBRowHeader {
188 #[inline]
189 pub const fn field_data_list_byte_count(&self) -> usize {
191 self.fields.count as usize * std::mem::size_of::<FDBFieldData>()
192 }
193}
194
195#[derive(Copy, Clone, Debug, PartialEq, Eq)]
196#[cfg_attr(feature = "bytemuck", derive(Pod, Zeroable))]
197#[repr(C)]
198pub struct FDBFieldData {
200 pub data_type: u32,
202 pub value: [u8; 4],
204}
205
206#[cfg(test)]
207mod tests {
208 use super::*;
209 use std::mem;
210
211 #[test]
212 fn test_align() {
213 assert_eq!(mem::align_of::<FDBHeader>(), 4);
214 assert_eq!(mem::align_of::<FDBTableHeader>(), 4);
215 assert_eq!(mem::align_of::<FDBTableDefHeader>(), 4);
216 assert_eq!(mem::align_of::<FDBColumnHeader>(), 4);
217 assert_eq!(mem::align_of::<FDBTableDataHeader>(), 4);
218 assert_eq!(mem::align_of::<FDBBucketHeader>(), 4);
219 assert_eq!(mem::align_of::<FDBRowHeaderListEntry>(), 4);
220 assert_eq!(mem::align_of::<FDBRowHeader>(), 4);
221 assert_eq!(mem::align_of::<FDBFieldData>(), 4);
222 }
223
224 #[test]
225 fn test_size_of() {
226 assert_eq!(mem::size_of::<FDBHeader>(), 8);
227 assert_eq!(mem::size_of::<FDBTableHeader>(), 8);
228 assert_eq!(mem::size_of::<FDBTableDefHeader>(), 12);
229 assert_eq!(mem::size_of::<FDBColumnHeader>(), 8);
230 assert_eq!(mem::size_of::<FDBTableDataHeader>(), 8);
231 assert_eq!(mem::size_of::<FDBBucketHeader>(), 4);
232 assert_eq!(mem::size_of::<FDBRowHeaderListEntry>(), 8);
233 assert_eq!(mem::size_of::<FDBRowHeader>(), 8);
234 assert_eq!(mem::size_of::<FDBFieldData>(), 8);
235 }
236}