@@ -71,6 +71,27 @@ TEnum *EnsureValidEnum(std::string_view enumName)
7171 return e;
7272}
7373
74+ // / Create a comma-separated list of type names from the given fields. Uses either the real type names or the
75+ // / type aliases (if there are any, otherwise the actual type name). Used to construct template argument lists
76+ // / for templated types such as std::pair<...>, std::tuple<...>, std::variant<...>.
77+ std::string GetTypeList (std::span<std::unique_ptr<ROOT::RFieldBase>> itemFields, bool useTypeAliases)
78+ {
79+ std::string result;
80+ for (size_t i = 0 ; i < itemFields.size (); ++i) {
81+ if (useTypeAliases && !itemFields[i]->GetTypeAlias ().empty ()) {
82+ result += itemFields[i]->GetTypeAlias ();
83+ } else {
84+ result += itemFields[i]->GetTypeName ();
85+ }
86+ result.push_back (' ,' );
87+ }
88+ if (result.empty ()) {
89+ throw ROOT::RException (R__FAIL (" invalid empty type list provided as template argument" ));
90+ }
91+ result.pop_back (); // remove trailing comma
92+ return result;
93+ }
94+
7495std::string BuildSetTypeName (ROOT::RSetField::ESetType setType, const ROOT::RFieldBase &innerField)
7596{
7697 std::string typePrefix;
@@ -667,22 +688,17 @@ void ROOT::REnumField::AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const
667688
668689// ------------------------------------------------------------------------------
669690
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-
675691ROOT::RPairField::RPairField (std::string_view fieldName, std::array<std::unique_ptr<RFieldBase>, 2 > itemFields,
676692 const std::array<std::size_t , 2 > &offsets)
677- : ROOT::RRecordField(fieldName, " std::pair<" + GetTypeList(itemFields) + ">")
693+ : ROOT::RRecordField(fieldName, " std::pair<" + GetTypeList(itemFields, false /* useTypeAliases */ ) + ">")
678694{
679695 AttachItemFields (std::move (itemFields));
680696 fOffsets .push_back (offsets[0 ]);
681697 fOffsets .push_back (offsets[1 ]);
682698}
683699
684700ROOT::RPairField::RPairField (std::string_view fieldName, std::array<std::unique_ptr<RFieldBase>, 2 > itemFields)
685- : ROOT::RRecordField(fieldName, " std::pair<" + GetTypeList(itemFields) + ">")
701+ : ROOT::RRecordField(fieldName, " std::pair<" + GetTypeList(itemFields, false /* useTypeAliases */ ) + ">")
686702{
687703 AttachItemFields (std::move (itemFields));
688704
@@ -1268,28 +1284,16 @@ void ROOT::RField<TObject>::AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor)
12681284
12691285// ------------------------------------------------------------------------------
12701286
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-
12831287ROOT::RTupleField::RTupleField (std::string_view fieldName, std::vector<std::unique_ptr<RFieldBase>> itemFields,
12841288 const std::vector<std::size_t > &offsets)
1285- : ROOT::RRecordField(fieldName, " std::tuple<" + GetTypeList(itemFields) + ">")
1289+ : ROOT::RRecordField(fieldName, " std::tuple<" + GetTypeList(itemFields, false /* useTypeAliases */ ) + ">")
12861290{
12871291 AttachItemFields (std::move (itemFields));
12881292 fOffsets = offsets;
12891293}
12901294
12911295ROOT::RTupleField::RTupleField (std::string_view fieldName, std::vector<std::unique_ptr<RFieldBase>> itemFields)
1292- : ROOT::RRecordField(fieldName, " std::tuple<" + GetTypeList(itemFields) + ">")
1296+ : ROOT::RRecordField(fieldName, " std::tuple<" + GetTypeList(itemFields, false /* useTypeAliases */ ) + ">")
12931297{
12941298 AttachItemFields (std::move (itemFields));
12951299
@@ -1362,17 +1366,6 @@ struct RVariantTag {
13621366
13631367} // anonymous namespace
13641368
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-
13761369ROOT::RVariantField::RVariantField (std::string_view name, const RVariantField &source)
13771370 : ROOT::RFieldBase(name, source.GetTypeName(), ROOT::ENTupleStructure::kVariant, false /* isSimple */ ),
13781371 fMaxItemSize(source.fMaxItemSize ),
@@ -1387,8 +1380,8 @@ ROOT::RVariantField::RVariantField(std::string_view name, const RVariantField &s
13871380}
13881381
13891382ROOT::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 */ )
1383+ : ROOT::RFieldBase(fieldName, " std::variant<" + GetTypeList(itemFields, false /* useTypeAliases */ ) + ">",
1384+ ROOT::ENTupleStructure::kVariant, false /* isSimple */ )
13921385{
13931386 // The variant needs to initialize its own tag member
13941387 fTraits |= kTraitTriviallyDestructible & ~kTraitTriviallyConstructible ;
0 commit comments