Skip to content

Commit

Permalink
[ntuple] reverse hierarchy of RVectorField and RSequenceCollectionField
Browse files Browse the repository at this point in the history
  • Loading branch information
jblomer committed Sep 24, 2024
1 parent 4e64146 commit 2cc15c4
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 41 deletions.
37 changes: 19 additions & 18 deletions tree/ntuple/v7/inc/ROOT/RField/RFieldSequenceContainer.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -231,17 +231,19 @@ public:
/// Template specializations for C++ std::vector
////////////////////////////////////////////////////////////////////////////////

/// The generic field for a (nested) std::vector<Type> except for std::vector<bool>
class RVectorField : public RFieldBase {
/// The RSequenceCollectionField has not type name and, analogous to the RRecordField acting as an untyped class,
/// this field is an untyped sequence collection.
/// It provides the basis for the RVectorField and thus has the same memory and on-disk layout as an std::vector.
class RSequenceCollectionField : public RFieldBase {
private:
class RVectorDeleter : public RDeleter {
class RSequenceCollectionDeleter : public RDeleter {
private:
std::size_t fItemSize = 0;
std::unique_ptr<RDeleter> fItemDeleter;

public:
RVectorDeleter() = default;
RVectorDeleter(std::size_t itemSize, std::unique_ptr<RDeleter> itemDeleter)
RSequenceCollectionDeleter() = default;
RSequenceCollectionDeleter(std::size_t itemSize, std::unique_ptr<RDeleter> itemDeleter)
: fItemSize(itemSize), fItemDeleter(std::move(itemDeleter))
{
}
Expand All @@ -253,7 +255,7 @@ private:
std::unique_ptr<RDeleter> fItemDeleter;

protected:
RVectorField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField, bool isUntyped);
RSequenceCollectionField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField, bool isUntyped);

std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const override;

Expand All @@ -270,10 +272,10 @@ protected:
void CommitClusterImpl() final { fNWritten = 0; }

public:
RVectorField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField);
RVectorField(RVectorField &&other) = default;
RVectorField &operator=(RVectorField &&other) = default;
~RVectorField() override = default;
RSequenceCollectionField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField);
RSequenceCollectionField(RSequenceCollectionField &&other) = default;
RSequenceCollectionField &operator=(RSequenceCollectionField &&other) = default;
~RSequenceCollectionField() override = default;

std::vector<RValue> SplitValue(const RValue &value) const final;
size_t GetValueSize() const override { return sizeof(std::vector<char>); }
Expand All @@ -289,20 +291,19 @@ public:
}
};

/// The same memory and on-disk layout as an std::vector but without an assigned type name.
/// Analogous to the RRecordField acting as an untyped class, this field is an untyped sequence collection.
class RSequenceCollectionField final : public RVectorField {
/// The generic field for a (nested) std::vector<Type> except for std::vector<bool>
class RVectorField : public RSequenceCollectionField {
protected:
std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;

public:
RSequenceCollectionField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField)
: RVectorField(fieldName, std::move(itemField), true)
RVectorField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField)
: RSequenceCollectionField(fieldName, std::move(itemField), false)
{
}
RSequenceCollectionField(RSequenceCollectionField &&other) = default;
RSequenceCollectionField &operator=(RSequenceCollectionField &&other) = default;
~RSequenceCollectionField() override = default;
RVectorField(RVectorField &&other) = default;
RVectorField &operator=(RVectorField &&other) = default;
~RVectorField() override = default;
};

template <typename ItemT>
Expand Down
4 changes: 2 additions & 2 deletions tree/ntuple/v7/inc/ROOT/RFieldVisitor.hxx
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public:
virtual void VisitUInt16Field(const RIntegralField<std::uint16_t> &field) { VisitField(field); }
virtual void VisitUInt32Field(const RIntegralField<std::uint32_t> &field) { VisitField(field); }
virtual void VisitUInt64Field(const RIntegralField<std::uint64_t> &field) { VisitField(field); }
virtual void VisitVectorField(const RVectorField &field) { VisitField(field); }
virtual void VisitSequenceCollectionField(const RSequenceCollectionField &field) { VisitField(field); }
virtual void VisitVectorBoolField(const RField<std::vector<bool>> &field) { VisitField(field); }
virtual void VisitRVecField(const RRVecField &field) { VisitField(field); }
}; // class RFieldVisitor
Expand Down Expand Up @@ -227,7 +227,7 @@ public:
void VisitUnsplitField(const RUnsplitField &field) final;
void VisitRecordField(const RRecordField &field) final;
void VisitProxiedCollectionField(const RProxiedCollectionField &field) final;
void VisitVectorField(const RVectorField &field) final;
void VisitSequenceCollectionField(const RSequenceCollectionField &field) final;
void VisitVectorBoolField(const RField<std::vector<bool>> &field) final;
void VisitRVecField(const RRVecField &field) final;
void VisitBitsetField(const RBitsetField &field) final;
Expand Down
43 changes: 23 additions & 20 deletions tree/ntuple/v7/src/RField.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -2484,8 +2484,9 @@ void ROOT::Experimental::RRecordField::AcceptVisitor(Detail::RFieldVisitor &visi

//------------------------------------------------------------------------------

ROOT::Experimental::RVectorField::RVectorField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField,
bool isUntyped)
ROOT::Experimental::RSequenceCollectionField::RSequenceCollectionField(std::string_view fieldName,
std::unique_ptr<RFieldBase> itemField,
bool isUntyped)
: ROOT::Experimental::RFieldBase(fieldName, isUntyped ? "" : "std::vector<" + itemField->GetTypeName() + ">",
ENTupleStructure::kCollection, false /* isSimple */),
fItemSize(itemField->GetValueSize()),
Expand All @@ -2496,19 +2497,20 @@ ROOT::Experimental::RVectorField::RVectorField(std::string_view fieldName, std::
Attach(std::move(itemField));
}

ROOT::Experimental::RVectorField::RVectorField(std::string_view fieldName, std::unique_ptr<RFieldBase> itemField)
: RVectorField(fieldName, std::move(itemField), false)
ROOT::Experimental::RSequenceCollectionField::RSequenceCollectionField(std::string_view fieldName,
std::unique_ptr<RFieldBase> itemField)
: RSequenceCollectionField(fieldName, std::move(itemField), true)
{
}

std::unique_ptr<ROOT::Experimental::RFieldBase>
ROOT::Experimental::RVectorField::CloneImpl(std::string_view newName) const
ROOT::Experimental::RSequenceCollectionField::CloneImpl(std::string_view newName) const
{
auto newItemField = fSubFields[0]->Clone(fSubFields[0]->GetFieldName());
return std::make_unique<RVectorField>(newName, std::move(newItemField));
return std::make_unique<RSequenceCollectionField>(newName, std::move(newItemField));
}

std::size_t ROOT::Experimental::RVectorField::AppendImpl(const void *from)
std::size_t ROOT::Experimental::RSequenceCollectionField::AppendImpl(const void *from)
{
auto typedValue = static_cast<const std::vector<char> *>(from);
R__ASSERT((typedValue->size() % fItemSize) == 0);
Expand All @@ -2529,7 +2531,7 @@ std::size_t ROOT::Experimental::RVectorField::AppendImpl(const void *from)
return nbytes + fPrincipalColumn->GetElement()->GetPackedSize();
}

void ROOT::Experimental::RVectorField::ReadGlobalImpl(NTupleSize_t globalIndex, void *to)
void ROOT::Experimental::RSequenceCollectionField::ReadGlobalImpl(NTupleSize_t globalIndex, void *to)
{
auto typedValue = static_cast<std::vector<char> *>(to);

Expand Down Expand Up @@ -2567,25 +2569,25 @@ void ROOT::Experimental::RVectorField::ReadGlobalImpl(NTupleSize_t globalIndex,
}

const ROOT::Experimental::RFieldBase::RColumnRepresentations &
ROOT::Experimental::RVectorField::GetColumnRepresentations() const
ROOT::Experimental::RSequenceCollectionField::GetColumnRepresentations() const
{
static RColumnRepresentations representations(
{{EColumnType::kSplitIndex64}, {EColumnType::kIndex64}, {EColumnType::kSplitIndex32}, {EColumnType::kIndex32}},
{});
return representations;
}

void ROOT::Experimental::RVectorField::GenerateColumns()
void ROOT::Experimental::RSequenceCollectionField::GenerateColumns()
{
GenerateColumnsImpl<ClusterSize_t>();
}

void ROOT::Experimental::RVectorField::GenerateColumns(const RNTupleDescriptor &desc)
void ROOT::Experimental::RSequenceCollectionField::GenerateColumns(const RNTupleDescriptor &desc)
{
GenerateColumnsImpl<ClusterSize_t>(desc);
}

void ROOT::Experimental::RVectorField::RVectorDeleter::operator()(void *objPtr, bool dtorOnly)
void ROOT::Experimental::RSequenceCollectionField::RSequenceCollectionDeleter::operator()(void *objPtr, bool dtorOnly)
{
auto vecPtr = static_cast<std::vector<char> *>(objPtr);
if (fItemDeleter) {
Expand All @@ -2599,15 +2601,16 @@ void ROOT::Experimental::RVectorField::RVectorDeleter::operator()(void *objPtr,
RDeleter::operator()(objPtr, dtorOnly);
}

std::unique_ptr<ROOT::Experimental::RFieldBase::RDeleter> ROOT::Experimental::RVectorField::GetDeleter() const
std::unique_ptr<ROOT::Experimental::RFieldBase::RDeleter>
ROOT::Experimental::RSequenceCollectionField::GetDeleter() const
{
if (fItemDeleter)
return std::make_unique<RVectorDeleter>(fItemSize, GetDeleterOf(*fSubFields[0]));
return std::make_unique<RVectorDeleter>();
return std::make_unique<RSequenceCollectionDeleter>(fItemSize, GetDeleterOf(*fSubFields[0]));
return std::make_unique<RSequenceCollectionDeleter>();
}

std::vector<ROOT::Experimental::RFieldBase::RValue>
ROOT::Experimental::RVectorField::SplitValue(const RValue &value) const
ROOT::Experimental::RSequenceCollectionField::SplitValue(const RValue &value) const
{
auto vec = value.GetPtr<std::vector<char>>();
R__ASSERT((vec->size() % fItemSize) == 0);
Expand All @@ -2621,18 +2624,18 @@ ROOT::Experimental::RVectorField::SplitValue(const RValue &value) const
return result;
}

void ROOT::Experimental::RVectorField::AcceptVisitor(Detail::RFieldVisitor &visitor) const
void ROOT::Experimental::RSequenceCollectionField::AcceptVisitor(Detail::RFieldVisitor &visitor) const
{
visitor.VisitVectorField(*this);
visitor.VisitSequenceCollectionField(*this);
}

//------------------------------------------------------------------------------

std::unique_ptr<ROOT::Experimental::RFieldBase>
ROOT::Experimental::RSequenceCollectionField::CloneImpl(std::string_view newName) const
ROOT::Experimental::RVectorField::CloneImpl(std::string_view newName) const
{
auto newItemField = fSubFields[0]->Clone(fSubFields[0]->GetFieldName());
return std::make_unique<RSequenceCollectionField>(newName, std::move(newItemField));
return std::make_unique<RVectorField>(newName, std::move(newItemField));
}

//------------------------------------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion tree/ntuple/v7/src/RFieldVisitor.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,7 @@ void ROOT::Experimental::RPrintValueVisitor::VisitProxiedCollectionField(const R
PrintCollection(field);
}

void ROOT::Experimental::RPrintValueVisitor::VisitVectorField(const RVectorField &field)
void ROOT::Experimental::RPrintValueVisitor::VisitSequenceCollectionField(const RSequenceCollectionField &field)
{
PrintCollection(field);
}
Expand Down

0 comments on commit 2cc15c4

Please sign in to comment.