@@ -71,6 +71,24 @@ TEnum *EnsureValidEnum(std::string_view enumName)
7171 return e;
7272}
7373
74+ std::string GetTypeList (std::span<std::unique_ptr<ROOT::RFieldBase>> itemFields, bool useTypeAliases)
75+ {
76+ std::string result;
77+ for (size_t i = 0 ; i < itemFields.size (); ++i) {
78+ if (useTypeAliases && !itemFields[i]->GetTypeAlias ().empty ()) {
79+ result += itemFields[i]->GetTypeAlias ();
80+ } else {
81+ result += itemFields[i]->GetTypeName ();
82+ }
83+ result.push_back (' ,' );
84+ }
85+ if (result.empty ()) {
86+ throw ROOT::RException (R__FAIL (" invalid empty type list provided as template argument" ));
87+ }
88+ result.pop_back (); // remove trailing comma
89+ return result;
90+ }
91+
7492std::string BuildSetTypeName (ROOT::RSetField::ESetType setType, const ROOT::RFieldBase &innerField)
7593{
7694 std::string typePrefix;
@@ -667,22 +685,17 @@ void ROOT::REnumField::AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const
667685
668686// ------------------------------------------------------------------------------
669687
670- std::string ROOT::RPairField::RPairField::GetTypeList (const std::array<std::unique_ptr<RFieldBase>, 2 > &itemFields)
671- {
672- return itemFields[0 ]->GetTypeName () + " ," + itemFields[1 ]->GetTypeName ();
673- }
674-
675688ROOT::RPairField::RPairField (std::string_view fieldName, std::array<std::unique_ptr<RFieldBase>, 2 > itemFields,
676689 const std::array<std::size_t , 2 > &offsets)
677- : ROOT::RRecordField(fieldName, " std::pair<" + GetTypeList(itemFields) + ">")
690+ : ROOT::RRecordField(fieldName, " std::pair<" + GetTypeList(itemFields, false /* useTypeAliases */ ) + ">")
678691{
679692 AttachItemFields (std::move (itemFields));
680693 fOffsets .push_back (offsets[0 ]);
681694 fOffsets .push_back (offsets[1 ]);
682695}
683696
684697ROOT::RPairField::RPairField (std::string_view fieldName, std::array<std::unique_ptr<RFieldBase>, 2 > itemFields)
685- : ROOT::RRecordField(fieldName, " std::pair<" + GetTypeList(itemFields) + ">")
698+ : ROOT::RRecordField(fieldName, " std::pair<" + GetTypeList(itemFields, false /* useTypeAliases */ ) + ">")
686699{
687700 AttachItemFields (std::move (itemFields));
688701
@@ -1268,28 +1281,16 @@ void ROOT::RField<TObject>::AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor)
12681281
12691282// ------------------------------------------------------------------------------
12701283
1271- std::string ROOT::RTupleField::RTupleField::GetTypeList (const std::vector<std::unique_ptr<RFieldBase>> &itemFields)
1272- {
1273- std::string result;
1274- if (itemFields.empty ())
1275- throw RException (R__FAIL (" the type list for std::tuple must have at least one element" ));
1276- for (size_t i = 0 ; i < itemFields.size (); ++i) {
1277- result += itemFields[i]->GetTypeName () + " ," ;
1278- }
1279- result.pop_back (); // remove trailing comma
1280- return result;
1281- }
1282-
12831284ROOT::RTupleField::RTupleField (std::string_view fieldName, std::vector<std::unique_ptr<RFieldBase>> itemFields,
12841285 const std::vector<std::size_t > &offsets)
1285- : ROOT::RRecordField(fieldName, " std::tuple<" + GetTypeList(itemFields) + ">")
1286+ : ROOT::RRecordField(fieldName, " std::tuple<" + GetTypeList(itemFields, false /* useTypeAliases */ ) + ">")
12861287{
12871288 AttachItemFields (std::move (itemFields));
12881289 fOffsets = offsets;
12891290}
12901291
12911292ROOT::RTupleField::RTupleField (std::string_view fieldName, std::vector<std::unique_ptr<RFieldBase>> itemFields)
1292- : ROOT::RRecordField(fieldName, " std::tuple<" + GetTypeList(itemFields) + ">")
1293+ : ROOT::RRecordField(fieldName, " std::tuple<" + GetTypeList(itemFields, false /* useTypeAliases */ ) + ">")
12931294{
12941295 AttachItemFields (std::move (itemFields));
12951296
@@ -1362,17 +1363,6 @@ struct RVariantTag {
13621363
13631364} // anonymous namespace
13641365
1365- std::string ROOT::RVariantField::GetTypeList (const std::vector<std::unique_ptr<RFieldBase>> &itemFields)
1366- {
1367- std::string result;
1368- for (size_t i = 0 ; i < itemFields.size (); ++i) {
1369- result += itemFields[i]->GetTypeName () + " ," ;
1370- }
1371- R__ASSERT (!result.empty ()); // there is always at least one variant
1372- result.pop_back (); // remove trailing comma
1373- return result;
1374- }
1375-
13761366ROOT::RVariantField::RVariantField (std::string_view name, const RVariantField &source)
13771367 : ROOT::RFieldBase(name, source.GetTypeName(), ROOT::ENTupleStructure::kVariant, false /* isSimple */ ),
13781368 fMaxItemSize(source.fMaxItemSize ),
@@ -1387,8 +1377,8 @@ ROOT::RVariantField::RVariantField(std::string_view name, const RVariantField &s
13871377}
13881378
13891379ROOT::RVariantField::RVariantField (std::string_view fieldName, std::vector<std::unique_ptr<RFieldBase>> itemFields)
1390- : ROOT::RFieldBase(fieldName, " std::variant<" + GetTypeList(itemFields) + ">", ROOT::ENTupleStructure::kVariant ,
1391- false /* isSimple */ )
1380+ : ROOT::RFieldBase(fieldName, " std::variant<" + GetTypeList(itemFields, false /* useTypeAliases */ ) + ">",
1381+ ROOT::ENTupleStructure::kVariant, false /* isSimple */ )
13921382{
13931383 // The variant needs to initialize its own tag member
13941384 fTraits |= kTraitTriviallyDestructible & ~kTraitTriviallyConstructible ;
0 commit comments