Skip to content

Commit ca5a24e

Browse files
committed
[ntuple] factor out GetTypeList() field methods
The variant field, the tuple field, and the pair field all use approximately the same GetTypeList() private static method. Factor this out in a single method in an anonymous namespace.
1 parent 1561f67 commit ca5a24e

File tree

3 files changed

+27
-41
lines changed

3 files changed

+27
-41
lines changed

tree/ntuple/inc/ROOT/RField/RFieldRecord.hxx

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -134,9 +134,6 @@ public:
134134

135135
/// The generic field for `std::pair<T1, T2>` types
136136
class RPairField : public RRecordField {
137-
private:
138-
static std::string GetTypeList(const std::array<std::unique_ptr<RFieldBase>, 2> &itemFields);
139-
140137
protected:
141138
RPairField(std::string_view fieldName, std::array<std::unique_ptr<RFieldBase>, 2> itemFields,
142139
const std::array<std::size_t, 2> &offsets);
@@ -188,9 +185,6 @@ public:
188185

189186
/// The generic field for `std::tuple<Ts...>` types
190187
class RTupleField : public RRecordField {
191-
private:
192-
static std::string GetTypeList(const std::vector<std::unique_ptr<RFieldBase>> &itemFields);
193-
194188
protected:
195189
RTupleField(std::string_view fieldName, std::vector<std::unique_ptr<RFieldBase>> itemFields,
196190
const std::vector<std::size_t> &offsets);

tree/ntuple/inc/ROOT/RField/RFieldSTLMisc.hxx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,6 @@ private:
404404
size_t fVariantOffset = 0;
405405
std::vector<ROOT::Internal::RColumnIndex::ValueType> fNWritten;
406406

407-
static std::string GetTypeList(const std::vector<std::unique_ptr<RFieldBase>> &itemFields);
408407
/// Extracts the index from an `std::variant` and transforms it into the 1-based index used for the switch column
409408
/// The implementation supports two memory layouts that are in use: a trailing unsigned byte, zero-indexed,
410409
/// having the exception caused empty state encoded by the max tag value,

tree/ntuple/src/RFieldMeta.cxx

Lines changed: 27 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
7495
std::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-
675691
ROOT::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

684700
ROOT::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-
12831287
ROOT::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

12911295
ROOT::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-
13761369
ROOT::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

13891382
ROOT::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

Comments
 (0)