From 0c21fd35db253983bcfa2aa6c037737a199cd9aa Mon Sep 17 00:00:00 2001 From: silverweed Date: Thu, 8 Aug 2024 16:43:39 +0200 Subject: [PATCH] small refactor --- src/rntuple.cpp | 131 ++++++++++++++++++++++++++---------------------- 1 file changed, 72 insertions(+), 59 deletions(-) diff --git a/src/rntuple.cpp b/src/rntuple.cpp index 5df3546..695d0e9 100644 --- a/src/rntuple.cpp +++ b/src/rntuple.cpp @@ -699,60 +699,50 @@ struct Try_Sec_Hover_Fn { } return false; } -}; -internal -b8 hover_try_key(const Try_Sec_Hover_Fn &try_sec_hover, const u8 *data, u64 start) -{ - u16 version_be; - memcpy(&version_be, data + start + 4, sizeof(u16)); - u32 version = bswap(version_be); - b8 is_big = version > 1000; + b8 tkey() const + { + u16 version_be; + memcpy(&version_be, data + start + 4, sizeof(u16)); + u32 version = bswap(version_be); + b8 is_big = version > 1000; - if (is_big) { - return try_sec_hover.field("NBytes: %u") - || try_sec_hover.field("Version: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u16 x) { - x = bswap(x); - x -= (x > 1000) * 1000; - return push_str8_node_child(arena, prev, fmt, x); - }) - || try_sec_hover.field("Obj Len: %u") - || try_sec_hover.field("Datetime: ", hover_display_datetime_str) - || try_sec_hover.field("Key Len: %u") - || try_sec_hover.field("Cycle: %u") - || try_sec_hover.field("Seek Key: 0x%lX") - || try_sec_hover.field("Seek Pdir: 0x%lX") - || try_sec_hover.field("Class Name: %s") - || try_sec_hover.field("Obj Name: %s") - || try_sec_hover.field("Obj Title: %s") - ; - } else { - return try_sec_hover.field("NBytes: %u") - || try_sec_hover.field("Version: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u16 x) { - x = bswap(x); - x -= (x > 1000) * 1000; - return push_str8_node_child(arena, prev, fmt, x); - }) - || try_sec_hover.field("Obj Len: %u") - || try_sec_hover.field("Datetime: ", hover_display_datetime_str) - || try_sec_hover.field("Key Len: %u") - || try_sec_hover.field("Cycle: %u") - || try_sec_hover.field("Seek Key: 0x%lX") - || try_sec_hover.field("Seek Pdir: 0x%lX") - || try_sec_hover.field("Class Name: %s") - || try_sec_hover.field("Obj Name: %s") - || try_sec_hover.field("Obj Title: %s") - ; + if (is_big) { + return field("NBytes: %u") + || field("Version: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u16 x) { + x = bswap(x); + x -= 1000; + return push_str8_node_child(arena, prev, fmt, x); + }) + || field("Obj Len: %u") + || field("Datetime: ", hover_display_datetime_str) + || field("Key Len: %u") + || field("Cycle: %u") + || field("Seek Key: 0x%lX") + || field("Seek Pdir: 0x%lX") + || field("Class Name: %s") + || field("Obj Name: %s") + || field("Obj Title: %s") + ; + } else { + return field("NBytes: %u") + || field("Version: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u16 x) { + x = bswap(x); + return push_str8_node_child(arena, prev, fmt, x); + }) + || field("Obj Len: %u") + || field("Datetime: ", hover_display_datetime_str) + || field("Key Len: %u") + || field("Cycle: %u") + || field("Seek Key: 0x%lX") + || field("Seek Pdir: 0x%lX") + || field("Class Name: %s") + || field("Obj Name: %s") + || field("Obj Title: %s") + ; + } } -} - -internal -b8 hover_try_object(const Try_Sec_Hover_Fn &try_sec_hover) -{ - return try_sec_hover.field("Version: %u") - || try_sec_hover.field("Unique ID: %u") - || try_sec_hover.field("Bits: %u"); -} +}; // `off` is the absolute offset into `data`. internal @@ -772,7 +762,7 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co switch (section.id) { case Sec_RNTuple_Anchor: { - hover_try_key(try_sec_hover, data, start) + try_sec_hover.tkey() || try_sec_hover.field("Object len: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u32 x) { x = bswap(x); x -= 0x4000'0000; @@ -838,7 +828,7 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co } break; case Sec_TFile_Object: { - if (!hover_try_key(try_sec_hover, data, start)) { + if (!try_sec_hover.tkey()) { b8 ok = try_sec_hover.field("File Name: %s") || try_sec_hover.field("File Title: %s") ; @@ -885,7 +875,7 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co case Sec_RNTuple_Header: case Sec_RNTuple_Footer: case Sec_Page_List: { - hover_try_key(try_sec_hover, data, start) + try_sec_hover.tkey() || try_sec_hover.maybe_rootzip(data, start) || try_sec_hover.range("Payload", section.range.len - section.post_size) // TODO: improve || try_sec_hover.field("Checksum: 0x%lX", hover_display_val_le) @@ -893,7 +883,8 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co } break; case Sec_Page: { - b8 ok = section.pre_size && hover_try_key(try_sec_hover, data, start); + // only try hovering a key if this is the first page of the cluster (<=> pre_size != 0) + b8 ok = section.pre_size && try_sec_hover.tkey(); ok = ok || try_sec_hover.maybe_rootzip(data, start) || try_sec_hover.range("Payload", section.range.len - section.post_size) // TODO: improve || try_sec_hover.field("Checksum: 0x%lX", hover_display_val_le) @@ -901,7 +892,7 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co } break; case Sec_TFile_Info: { - hover_try_key(try_sec_hover, data, start) + try_sec_hover.tkey() || try_sec_hover.maybe_rootzip(data, start) // || try_sec_hover.field("Byte Count: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u32 x) { // x = bswap(x); @@ -917,9 +908,31 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co } break; case Sec_TFile_FreeList: { - hover_try_key(try_sec_hover, data, start) - || try_sec_hover.range("Payload", section.range.len) // TODO: improve - ; + if (!try_sec_hover.tkey()) { + u16 version_be; + memcpy(&version_be, data + start + try_sec_hover.cur_field_off, sizeof(u16)); + u32 version = bswap(version_be); + b8 is_big = version > 1000; + + if (is_big) { + try_sec_hover.field("Version: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u16 x) { + x = bswap(x); + x -= 1000; + return push_str8_node_child(arena, prev, fmt, x); + }) + || try_sec_hover.field("First: 0x%lX") + || try_sec_hover.field("Last: 0x%lX") + ; + } else { + try_sec_hover.field("Version: %u", [] (Arena *arena, String8_Node *prev, const char *fmt, u16 x) { + x = bswap(x); + return push_str8_node_child(arena, prev, fmt, x); + }) + || try_sec_hover.field("First: 0x%X") + || try_sec_hover.field("Last: 0x%X") + ; + } + } } break; default:;