From 599e2b75c319c0a69c74fc5a46fbc27113b6743f Mon Sep 17 00:00:00 2001 From: silverweed Date: Thu, 12 Sep 2024 13:18:26 +0200 Subject: [PATCH] readable column types --- src/hover.cpp | 90 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 66 insertions(+), 24 deletions(-) diff --git a/src/hover.cpp b/src/hover.cpp index 3cb85ab..32ec571 100644 --- a/src/hover.cpp +++ b/src/hover.cpp @@ -96,6 +96,42 @@ T read_buf(const void *buf, u64 &off) return val; } +internal +const char *get_column_type_name(u16 type) +{ + switch (type) { + case 0x01: return "Index64"; + case 0x02: return "Index32"; + case 0x03: return "Switch"; + case 0x04: return "Byte"; + case 0x05: return "Char"; + case 0x06: return "Bit"; + case 0x07: return "Real64"; + case 0x08: return "Real32"; + case 0x09: return "Real16"; + case 0x16: return "Int64"; + case 0x0A: return "UInt64"; + case 0x17: return "Int32"; + case 0x0B: return "UInt32"; + case 0x18: return "Int16"; + case 0x0C: return "UInt16"; + case 0x19: return "Int8"; + case 0x0D: return "UInt8"; + case 0x0E: return "SplitIndex64"; + case 0x0F: return "SplitIndex32"; + case 0x10: return "SplitReal64"; + case 0x11: return "SplitReal32"; + case 0x1A: return "SplitInt64"; + case 0x13: return "SplitUInt64"; + case 0x1B: return "SplitInt32"; + case 0x14: return "SplitUInt32"; + case 0x1C: return "SplitInt16"; + case 0x15: return "SplitUInt16"; + case 0x1D: return "Real32Trunc"; + default: return "Unknown"; + } +} + // Functor used by get_section_hover_info to describe the structure of a section and print data about it. struct Sec_Hover_Fn { u64 start; @@ -316,8 +352,8 @@ struct Sec_Hover_Fn { memcpy(&size, data + start + cur_field_off, sizeof(size)); u64 field_desc_len = (u64)std::abs(size); if (roff < cur_field_off + field_desc_len) { - return titled_section("Field", [this, field_desc_len] { - info.rng = { start + cur_field_off, (u64)field_desc_len }; + info.rng = { start + cur_field_off, (u64)field_desc_len }; + return titled_section("Field", [this] { add_to_desc("Size: %" PRIi64); add_to_desc("Field version: %u"); add_to_desc("Type version: %u"); @@ -386,10 +422,13 @@ struct Sec_Hover_Fn { memcpy(&size, data + start + cur_field_off, sizeof(size)); u64 col_desc_len = (u64)std::abs(size); if (roff < cur_field_off + col_desc_len) { - return titled_section("Column", [this, col_desc_len] { - info.rng = { start + cur_field_off, col_desc_len }; + info.rng = { start + cur_field_off, col_desc_len }; + return titled_section("Column", [this] { add_to_desc("Size: %" PRIi64 " B"); - add_to_desc("Column type: %u"); // TODO: human-readable type + add_to_desc("Column type: %s", [](Arena *arena, String8_Node *prev, const char *fmt, u16 val) { + const char *readable_col_type = get_column_type_name(val); + return push_str8_node_child(arena, prev, fmt, readable_col_type); + }); add_to_desc("Bits on storage: %u"); add_to_desc("Field ID: %u"); u16 flags = add_to_desc("Flags: 0b%b"); @@ -406,27 +445,30 @@ struct Sec_Hover_Fn { cur_field_off += col_desc_len; return false; } else { - return titled_section("Column", [this] { - u64 flags_off = start + cur_field_off + 16; - u16 flags; - memcpy(&flags, data + flags_off, sizeof(flags)); - b8 ok = field_le("Size: %" PRIi64) - || field_le("Column Type: 0x%X") // TODO: prettify name - || field_le("Bits on storage: %u") - || field_le("Field ID: %u") - || field_le("Flags: 0b%b") - || field_le("Representation idx: %u") - ; - if (ok) - return ok; + return titled_section("Column", [this] { + u64 flags_off = start + cur_field_off + 16; + u16 flags; + memcpy(&flags, data + flags_off, sizeof(flags)); + b8 ok = field_le("Size: %" PRIi64) + || field("Column Type: %s", [](Arena *arena, String8_Node *prev, const char *fmt, u16 val) { + const char *readable_col_type = get_column_type_name(val); + return push_str8_node_child(arena, prev, fmt, readable_col_type); + }) + || field_le("Bits on storage: %u") + || field_le("Field ID: %u") + || field_le("Flags: 0b%b") + || field_le("Representation idx: %u") + ; + if (ok) + return ok; - if ((flags & RNTupleSerializer::kFlagDeferredColumn) && field_le("First element: %" PRIu64)) - return true; - // if ((flags & RNTupleSerializer::kFlagHasValueRange) && (field_le("Value Min: %f") || field_le("Value Max: %f"))) - // return true; + if ((flags & RNTupleSerializer::kFlagDeferredColumn) && field_le("First element: %" PRIu64)) + return true; + // if ((flags & RNTupleSerializer::kFlagHasValueRange) && (field_le("Value Min: %f") || field_le("Value Max: %f"))) + // return true; - return false; - }); + return false; + }); } }