Skip to content

Commit 6047b7e

Browse files
committed
[ntuple] remove type name from set field constructor
1 parent 76818e9 commit 6047b7e

File tree

3 files changed

+47
-32
lines changed

3 files changed

+47
-32
lines changed

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

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -150,11 +150,9 @@ protected:
150150
ROOT::Internal::RColumnIndex fNWritten;
151151

152152
/// Constructor used when the value type of the collection is not known in advance, i.e. in the case of custom
153-
/// collections.
153+
/// collections. Note that this constructor requires manual initialization of the item field
154+
/// (Attach() and setting fItemSize)
154155
RProxiedCollectionField(std::string_view fieldName, TClass *classp);
155-
/// Constructor used when the value type of the collection is known in advance, e.g. in RSetField.
156-
RProxiedCollectionField(std::string_view fieldName, std::string_view typeName,
157-
std::unique_ptr<RFieldBase> itemField);
158156

159157
std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
160158
const RColumnRepresentations &GetColumnRepresentations() const final;
@@ -364,7 +362,13 @@ public:
364362
/// The generic field for a `std::set<Type>` and `std::unordered_set<Type>`
365363
class RSetField : public RProxiedCollectionField {
366364
public:
367-
RSetField(std::string_view fieldName, std::string_view typeName, std::unique_ptr<RFieldBase> itemField);
365+
enum class ESetType {
366+
kSet,
367+
kUnorderedSet,
368+
kMultiSet,
369+
kUnorderedMultiSet
370+
};
371+
RSetField(std::string_view fieldName, ESetType setType, std::unique_ptr<RFieldBase> itemField);
368372
RSetField(RSetField &&other) = default;
369373
RSetField &operator=(RSetField &&other) = default;
370374
~RSetField() override = default;
@@ -375,7 +379,7 @@ class RField<std::set<ItemT>> final : public RSetField {
375379
public:
376380
static std::string TypeName() { return "std::set<" + RField<ItemT>::TypeName() + ">"; }
377381

378-
explicit RField(std::string_view name) : RSetField(name, TypeName(), std::make_unique<RField<ItemT>>("_0")) {}
382+
explicit RField(std::string_view name) : RSetField(name, ESetType::kSet, std::make_unique<RField<ItemT>>("_0")) {}
379383
RField(RField &&other) = default;
380384
RField &operator=(RField &&other) = default;
381385
~RField() final = default;
@@ -386,7 +390,10 @@ class RField<std::unordered_set<ItemT>> final : public RSetField {
386390
public:
387391
static std::string TypeName() { return "std::unordered_set<" + RField<ItemT>::TypeName() + ">"; }
388392

389-
explicit RField(std::string_view name) : RSetField(name, TypeName(), std::make_unique<RField<ItemT>>("_0")) {}
393+
explicit RField(std::string_view name)
394+
: RSetField(name, ESetType::kUnorderedSet, std::make_unique<RField<ItemT>>("_0"))
395+
{
396+
}
390397
RField(RField &&other) = default;
391398
RField &operator=(RField &&other) = default;
392399
~RField() final = default;
@@ -397,7 +404,9 @@ class RField<std::multiset<ItemT>> final : public RSetField {
397404
public:
398405
static std::string TypeName() { return "std::multiset<" + RField<ItemT>::TypeName() + ">"; }
399406

400-
explicit RField(std::string_view name) : RSetField(name, TypeName(), std::make_unique<RField<ItemT>>("_0")) {}
407+
explicit RField(std::string_view name) : RSetField(name, ESetType::kMultiSet, std::make_unique<RField<ItemT>>("_0"))
408+
{
409+
}
401410
RField(RField &&other) = default;
402411
RField &operator=(RField &&other) = default;
403412
~RField() final = default;
@@ -408,7 +417,10 @@ class RField<std::unordered_multiset<ItemT>> final : public RSetField {
408417
public:
409418
static std::string TypeName() { return "std::unordered_multiset<" + RField<ItemT>::TypeName() + ">"; }
410419

411-
explicit RField(std::string_view name) : RSetField(name, TypeName(), std::make_unique<RField<ItemT>>("_0")) {}
420+
explicit RField(std::string_view name)
421+
: RSetField(name, ESetType::kUnorderedMultiSet, std::make_unique<RField<ItemT>>("_0"))
422+
{
423+
}
412424
RField(RField &&other) = default;
413425
RField &operator=(RField &&other) = default;
414426
~RField() final = default;

tree/ntuple/src/RFieldBase.cxx

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -426,27 +426,20 @@ ROOT::RFieldBase::Create(const std::string &fieldName, const std::string &typeNa
426426
} else if (resolvedType.substr(0, 9) == "std::set<") {
427427
std::string itemTypeName = resolvedType.substr(9, resolvedType.length() - 10);
428428
auto itemField = Create("_0", itemTypeName, options, desc, maybeGetChildId(0)).Unwrap();
429-
auto normalizedInnerTypeName = itemField->GetTypeName();
430-
result =
431-
std::make_unique<RSetField>(fieldName, "std::set<" + normalizedInnerTypeName + ">", std::move(itemField));
429+
result = std::make_unique<RSetField>(fieldName, RSetField::ESetType::kSet, std::move(itemField));
432430
} else if (resolvedType.substr(0, 19) == "std::unordered_set<") {
433431
std::string itemTypeName = resolvedType.substr(19, resolvedType.length() - 20);
434432
auto itemField = Create("_0", itemTypeName, options, desc, maybeGetChildId(0)).Unwrap();
435-
auto normalizedInnerTypeName = itemField->GetTypeName();
436-
result = std::make_unique<RSetField>(fieldName, "std::unordered_set<" + normalizedInnerTypeName + ">",
437-
std::move(itemField));
433+
result = std::make_unique<RSetField>(fieldName, RSetField::ESetType::kUnorderedSet, std::move(itemField));
438434
} else if (resolvedType.substr(0, 14) == "std::multiset<") {
439435
std::string itemTypeName = resolvedType.substr(14, resolvedType.length() - 15);
440436
auto itemField = Create("_0", itemTypeName, options, desc, maybeGetChildId(0)).Unwrap();
441-
auto normalizedInnerTypeName = itemField->GetTypeName();
442-
result = std::make_unique<RSetField>(fieldName, "std::multiset<" + normalizedInnerTypeName + ">",
443-
std::move(itemField));
437+
result = std::make_unique<RSetField>(fieldName, RSetField::ESetType::kMultiSet, std::move(itemField));
444438
} else if (resolvedType.substr(0, 24) == "std::unordered_multiset<") {
445439
std::string itemTypeName = resolvedType.substr(24, resolvedType.length() - 25);
446440
auto itemField = Create("_0", itemTypeName, options, desc, maybeGetChildId(0)).Unwrap();
447441
auto normalizedInnerTypeName = itemField->GetTypeName();
448-
result = std::make_unique<RSetField>(fieldName, "std::unordered_multiset<" + normalizedInnerTypeName + ">",
449-
std::move(itemField));
442+
result = std::make_unique<RSetField>(fieldName, RSetField::ESetType::kUnorderedMultiSet, std::move(itemField));
450443
} else if (resolvedType.substr(0, 9) == "std::map<") {
451444
auto innerTypes = TokenizeTypeList(resolvedType.substr(9, resolvedType.length() - 10));
452445
if (innerTypes.size() != 2) {

tree/ntuple/src/RFieldMeta.cxx

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,19 @@ TEnum *EnsureValidEnum(std::string_view enumName)
7171
return e;
7272
}
7373

74+
std::string BuildSetTypeName(ROOT::RSetField::ESetType setType, const ROOT::RFieldBase &innerField)
75+
{
76+
std::string typePrefix;
77+
switch (setType) {
78+
case ROOT::RSetField::ESetType::kSet: typePrefix = "std::set<"; break;
79+
case ROOT::RSetField::ESetType::kUnorderedSet: typePrefix = "std::unordered_set<"; break;
80+
case ROOT::RSetField::ESetType::kMultiSet: typePrefix = "std::multiset<"; break;
81+
case ROOT::RSetField::ESetType::kUnorderedMultiSet: typePrefix = "std::unordered_multiset<"; break;
82+
default: R__ASSERT(false);
83+
}
84+
return typePrefix + innerField.GetTypeName() + ">";
85+
}
86+
7487
} // anonymous namespace
7588

7689
ROOT::RClassField::RClassField(std::string_view fieldName, const RClassField &source)
@@ -657,14 +670,6 @@ ROOT::RProxiedCollectionField::RProxiedCollectionField(std::string_view fieldNam
657670
fIFuncsWrite = RCollectionIterableOnce::GetIteratorFuncs(fProxy.get(), false /* readFromDisk */);
658671
}
659672

660-
ROOT::RProxiedCollectionField::RProxiedCollectionField(std::string_view fieldName, std::string_view typeName,
661-
std::unique_ptr<RFieldBase> itemField)
662-
: RProxiedCollectionField(fieldName, EnsureValidClass(typeName))
663-
{
664-
fItemSize = itemField->GetValueSize();
665-
Attach(std::move(itemField));
666-
}
667-
668673
ROOT::RProxiedCollectionField::RProxiedCollectionField(std::string_view fieldName, std::string_view typeName)
669674
: RProxiedCollectionField(fieldName, EnsureValidClass(typeName))
670675
{
@@ -703,8 +708,11 @@ ROOT::RProxiedCollectionField::RProxiedCollectionField(std::string_view fieldNam
703708
std::unique_ptr<ROOT::RFieldBase> ROOT::RProxiedCollectionField::CloneImpl(std::string_view newName) const
704709
{
705710
auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
706-
return std::unique_ptr<RProxiedCollectionField>(
707-
new RProxiedCollectionField(newName, GetTypeName(), std::move(newItemField)));
711+
auto clone =
712+
std::unique_ptr<RProxiedCollectionField>(new RProxiedCollectionField(newName, fProxy->GetCollectionClass()));
713+
clone->fItemSize = fItemSize;
714+
clone->Attach(std::move(newItemField));
715+
return clone;
708716
}
709717

710718
std::size_t ROOT::RProxiedCollectionField::AppendImpl(const void *from)
@@ -826,9 +834,11 @@ ROOT::RMapField::RMapField(std::string_view fieldName, std::string_view typeName
826834

827835
//------------------------------------------------------------------------------
828836

829-
ROOT::RSetField::RSetField(std::string_view fieldName, std::string_view typeName, std::unique_ptr<RFieldBase> itemField)
830-
: ROOT::RProxiedCollectionField(fieldName, typeName, std::move(itemField))
837+
ROOT::RSetField::RSetField(std::string_view fieldName, ESetType setType, std::unique_ptr<RFieldBase> itemField)
838+
: ROOT::RProxiedCollectionField(fieldName, EnsureValidClass(BuildSetTypeName(setType, *itemField)))
831839
{
840+
fItemSize = itemField->GetValueSize();
841+
Attach(std::move(itemField));
832842
}
833843

834844
//------------------------------------------------------------------------------

0 commit comments

Comments
 (0)