From e9cdfa036464ced7ae0ee633a0726b8459c4914e Mon Sep 17 00:00:00 2001
From: silverweed <silverweed14@proton.me>
Date: Wed, 16 Oct 2024 10:00:38 +0200
Subject: [PATCH] fix wrong type name for pages

---
 src/hover.cpp   | 44 ++++++++++++++++++++------------------------
 src/rntuple.cpp |  9 +++++----
 2 files changed, 25 insertions(+), 28 deletions(-)

diff --git a/src/hover.cpp b/src/hover.cpp
index 9b34752..6103b6a 100644
--- a/src/hover.cpp
+++ b/src/hover.cpp
@@ -1,19 +1,12 @@
-// C++ fuckery to get the number of lambda arguments
+// C++ fuckery to get the number of lambda arguments ----
 template <typename F>
 struct Signature;
 
-template <typename... Args>
-struct Tuple {
-  static constexpr u32 N_Elems = sizeof...(Args);
-};
-
-// Oh god, oh fuck
 template <typename Obj, typename... Args>
 struct Signature<void(Obj::*)(Args...) const> {
-  static constexpr u32 N_Args = Tuple<Args...>::N_Elems;
+  static constexpr u32 N_Args = sizeof...(Args);
 };
 
-// Bruh
 template <typename F>
 constexpr u32 n_functor_args = Signature<decltype(&std::decay_t<F>::operator())>::N_Args;
 // -------- end C++ fuckery
@@ -39,6 +32,7 @@ template <typename T> T bswap_if_needed(T x) {
     return x;
 }
 
+// Default display functions, used by the majority of fields
 template <typename T> 
 String8_Node *hover_display_val_be(Arena *arena, String8_Node *prev, const char *fmt, T val)
 {
@@ -118,9 +112,8 @@ String8_Node *display_val_rootzip(Arena *arena, String8_Node *prev, const char *
 }
 
 template <typename T>
-using Display_Fn = String8_Node *(*)(Arena *, String8_Node *, const char *, T);
-
-using Display_Range_Fn = String8_Node *(*)(Arena *, String8_Node *, const char *, const u8 *, u64);
+using Display_Fn = String8_Node *(*)(Arena *arena, String8_Node *prev, const char *fmt, T data);
+using Display_Range_Fn = String8_Node *(*)(Arena *arena, String8_Node *prev, const char *fmt, const u8 *data, u64 len);
 
 enum Hover_Section_Flags {
   HoverSec_None = 0,
@@ -134,11 +127,13 @@ enum Hover_Section_Flags {
 struct Sec_Hover_Fn {
   u64 off; // the hovered offset relative to the start of `data`
   const u8 *data; // the entire file data
-  const Section &section;
+  const Section &section; // the section we're hovering
   Arena *arena;
-  Sec_Hover_Info &info;
+  Sec_Hover_Info &info; // our main output
   u64 &cur_field_off; // current field offset relative to the start of `data`
+  // settings
   b8 display_grouped;
+  // internals
   u8 cur_section_nesting = 0;
   u8 innermost_section_highlighted = 0;
 
@@ -457,7 +452,7 @@ struct Sec_Hover_Fn {
   {
     frame<Frame_Record>(title, [this] {    
       field<u16>("Column type: %s", [](Arena *arena, String8_Node *prev, const char *fmt, u16 val) {
-        const char *readable_col_type = get_column_type_name(val);
+        const char *readable_col_type = get_column_type_name_from_ondisk_type(val);
         return push_str8_node_child(arena, prev, fmt, readable_col_type);
       });
       field_le<u16>("Bits on storage: %u");
@@ -903,14 +898,16 @@ struct Sec_Hover_Fn {
 
   void page()
   {
-    // only try hovering a key if this is the first page of the cluster (<=> pre_size != 0)
-    if (section.pre_size)
-      tkey();
-    b8 zipped;
-    if (!maybe_rootzip(&zipped))
-      return;
-    range("Payload", section.range.len - section.post_size); // TODO: improve
-    field_le<u64>("Checksum: 0x%" PRIX64);
+    titled_section("Page", [this] {
+      // only try hovering a key if this is the first page of the cluster (<=> pre_size != 0)
+      if (section.pre_size)
+        tkey();
+      b8 zipped;
+      if (!maybe_rootzip(&zipped))
+        return;
+      range("Payload", section.range.len - section.post_size); // TODO: improve
+      field_le<u64>("Checksum: 0x%" PRIX64);
+    });
   }
 
   void page_list()
@@ -955,7 +952,6 @@ Sec_Hover_Info get_section_hover_info(Arena *arena, Section section, u64 off, co
     push_str8_node_child(arena, info.desc, "N. Elems: %d", abs(pinfo->n_elems));
     push_str8_node_child(arena, info.desc, "Bits per elem: %u", pinfo->bits_per_elem);
     push_str8_node_child(arena, info.desc, "-----------");
-  } else {
   }
 
   u64 cur_field_off = section.range.start - section.pre_size;
diff --git a/src/rntuple.cpp b/src/rntuple.cpp
index 99723e5..5870b76 100644
--- a/src/rntuple.cpp
+++ b/src/rntuple.cpp
@@ -95,7 +95,7 @@ String8 build_fully_qualified_field_name(Arena *arena, const ROOT::Experimental:
 }
 
 internal
-const char *get_column_type_name(u16 type)
+const char *get_column_type_name_from_ondisk_type(u16 type)
 {
   switch (type) {
   case 0x01: return "Index64";
@@ -169,7 +169,8 @@ void gather_ntuple_metadata(Arena *arena, RMicroFileReader &reader, const RNTupl
 
   Cluster_Info *clusters = arena_push_array<Cluster_Info>(arena, descriptor.GetNActiveClusters());
 
-  const char *elem_type_name;
+  // @ForeignAlloc
+  std::string elem_type_name;
   
   // gather clusters and pages metadata
   for (const RClusterDescriptor &cluster_desc : descriptor.GetClusterIterable()) {
@@ -178,7 +179,7 @@ void gather_ntuple_metadata(Arena *arena, RMicroFileReader &reader, const RNTupl
 
     for (const RClusterDescriptor::RColumnRange &col_range : cluster_desc.GetColumnRangeIterable()) {
       const auto &col_descriptor = descriptor.GetColumnDescriptor(col_range.fPhysicalColumnId);
-      elem_type_name = get_column_type_name((u16)col_descriptor.GetType());
+      elem_type_name = RColumnElementBase::GetTypeName(col_descriptor.GetType());
       const auto &field_desc = descriptor.GetFieldDescriptor(col_descriptor.GetFieldId());
       const String8 owner_field_name = build_fully_qualified_field_name(arena, descriptor, &field_desc);
 
@@ -194,7 +195,7 @@ void gather_ntuple_metadata(Arena *arena, RMicroFileReader &reader, const RNTupl
         // If in the future we get RNTuples with more than 4B clusters we can just change the type to u64.
         assert(cluster_desc.GetId() <= UINT_MAX);
         pinfo->cluster_id = cluster_desc.GetId();
-        pinfo->elem_type_name = push_str8f(arena, "%s", elem_type_name);
+        pinfo->elem_type_name = push_str8f(arena, "%s", elem_type_name.c_str());
         pinfo->owner_field_name = owner_field_name;
         pinfo->bits_per_elem = col_descriptor.GetBitsOnStorage();