rntviewer/src/rntuple.h
2024-11-04 11:30:08 +01:00

153 lines
3.1 KiB
C

struct Byte_Range {
u64 start, len;
inline u64 end() const { return start + len; }
};
// Used to store location information about stuff like checksums, page lists, etc
struct Range_Seq {
Range_Seq *next;
Byte_Range range;
};
struct Page_Info_Node {
Page_Info_Node *next;
Page_Info_Node *prev;
Byte_Range range; // len includes checksum
i32 n_elems; // negative = page has checksum
u32 cluster_id;
b8 is_first_in_cluster;
u64 page_id;
u8 bits_per_elem;
String8 elem_type_name;
String8 owner_field_name;
inline u64 checksum_size() const {
return (n_elems < 0) * 8;
}
};
static const Page_Info_Node invalid_pinfo {};
struct Page_Info_Group {
Byte_Range range;
Page_Info_Node *first;
};
struct Page_Info_Chunk {
Page_Info_Chunk *next;
Byte_Range range;
u32 first_group;
};
struct Cluster_Info {
Page_Info_Node *first_page;
u64 first_page_idx; // index in the pages linked list
};
struct Cluster_Group_Info {
Byte_Range rng_page_list;
};
// A Section represents an interesting sequence of bytes in the file.
// It is associated to stuff such as a color, some metadata, etc.
enum Section_Id {
Sec_None,
Sec_TFile_Header,
Sec_TFile_Object,
Sec_TFile_Info,
Sec_TFile_FreeList,
Sec_TKey_List,
Sec_RNTuple_Anchor,
Sec_RNTuple_Header,
Sec_RNTuple_Footer,
Sec_Page_List,
Sec_Page, // keep last, or change logic in find_section()
Sec_COUNT
};
struct Section {
Section_Id id;
Byte_Range range;
u64 pre_size; // usually the TKey header, excluded from `range`
u64 post_size; // usually the checksum, included in `range`
b8 highlighted;
// Optional pointer to the specific information for the section.
// e.g. if the section is a Page this points to the relative Page_Info_Node
const void *info;
};
internal const String8 section_names[Sec_COUNT] = {
str8("None"),
str8("TFile Header"),
str8("TFile Object"),
str8("TFile Streamer Info"),
str8("TFile FreeList"),
str8("TKey List"),
str8("RNTuple Anchor"),
str8("RNTuple Header"),
str8("RNTuple Footer"),
str8("Page List"),
str8("Page"),
};
struct Byte_Range_Node {
Byte_Range_Node *next;
Byte_Range rng;
};
struct RNTuple_Anchor_Info {
RNTuple_Anchor_Info *next;
String8 name;
u64 offset_in_file;
};
struct TKeys_Data {
Section sections[Sec_COUNT];
RNTuple_Anchor_Info *rntuples;
Byte_Range_Node *rblob_keys;
};
struct TFile_Data {
u16 root_version_major;
u16 root_version_minor;
u16 root_version_patch;
u32 compression;
TKeys_Data tkeys_data;
ROOT::Experimental::RNTuple rntuple_anchor;
};
struct RNTuple_Data {
Page_Info_Node *pages;
u64 n_pages;
// total number of elements of all pages
u64 n_elems;
u64 tot_page_comp_size;
u64 tot_page_uncomp_size;
// TODO
Range_Seq *checksums;
u64 n_checksums;
Cluster_Group_Info *cluster_groups;
u64 n_cluster_groups;
u64 tot_page_list_size;
Cluster_Info *clusters;
u64 n_clusters;
// total number of entries of all clusters
u64 n_entries;
Page_Info_Group *page_groups;
u64 n_page_groups;
// grouping of consecutive pages
Page_Info_Chunk *page_chunks;
u64 n_page_chunks;
};