Skip to content

Commit 4a16b19

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 ad22457 commit 4a16b19

File tree

3 files changed

+24
-41
lines changed

3 files changed

+24
-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: 24 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
7492
std::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-
675688
ROOT::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

684697
ROOT::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-
12831284
ROOT::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

12911292
ROOT::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-
13761366
ROOT::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

13891379
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 */)
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

Comments
 (0)