From 462ed0ed905cc0e10c8e4b485a7c3302e2369a92 Mon Sep 17 00:00:00 2001 From: ferdymercury Date: Thu, 9 Oct 2025 12:41:51 +0200 Subject: [PATCH] [io] Extend flexibility of array size I/O marker Fixes https://its.cern.ch/jira/browse/ROOT-5144 --- io/io/src/TStreamerInfo.cxx | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/io/io/src/TStreamerInfo.cxx b/io/io/src/TStreamerInfo.cxx index 9cf26bfd20cfb..a8e120f3da6dc 100644 --- a/io/io/src/TStreamerInfo.cxx +++ b/io/io/src/TStreamerInfo.cxx @@ -569,6 +569,7 @@ void TStreamerInfo::Build(Bool_t isTransient) } TDataMember* dmCounter = 0; + int premultiplier = 1; if (dmIsPtr) { // // look for a pointer data member with a counter @@ -576,11 +577,19 @@ void TStreamerInfo::Build(Bool_t isTransient) // // int n; // double* MyArray; //[n] - // + // double* MyMatrix;//[3*n] + const char* lbracket = TVirtualStreamerInfo::GetElementCounterStart(dmTitle); - const char* rbracket = ::strchr(dmTitle, ']'); + const char* rbracket = std::strchr(dmTitle, ']'); if (lbracket && rbracket) { const char* counterName = dm->GetArrayIndex(); + auto multiple = std::strchr(counterName, '*'); + if (multiple) { + std::string s; + s.assign(counterName, multiple - counterName); + premultiplier = std::stoi(s); + counterName = multiple + 1; + } TRealData* rdCounter = (TRealData*) fClass->GetListOfRealData()->FindObject(counterName); if (!rdCounter || rdCounter->TestBit(TRealData::kTransient)) { if (!isTransient) @@ -622,7 +631,12 @@ void TStreamerInfo::Build(Bool_t isTransient) } else if (dmIsPtr && (dtype != kCharStar)) { if (dmCounter) { // data member is pointer to an array of basic types - element = new TStreamerBasicPointer(dmName, dmTitle, offset, dtype, dm->GetArrayIndex(), dmCounter->GetClass()->GetName(), dmCounter->GetClass()->GetClassVersion(), dmFull); + const char* counterName = dm->GetArrayIndex(); + auto multiple = std::strchr(counterName, '*'); + if (multiple) { + counterName = multiple + 1; + } + element = new TStreamerBasicPointer(dmName, dmTitle, offset, dtype, counterName, dmCounter->GetClass()->GetName(), dmCounter->GetClass()->GetClassVersion(), dmFull); } else { if ((fName == "TString") || (fName == "TClass")) { continue; @@ -748,7 +762,7 @@ void TStreamerInfo::Build(Bool_t isTransient) if (!narr) { narr = 1; } - element->SetSize(dsize*narr); + element->SetSize(dsize*narr*premultiplier); element->SetStreamer(streamer); if (!streamer) { Int_t k = element->GetType();