24 std::int32_t *
size =
reinterpret_cast<std::int32_t *
>(
beginPtr + 1);
27 std::int32_t *capacity =
size + 1;
32std::tuple<const unsigned char *const *, const std::int32_t *, const std::int32_t *>
52 constexpr auto dataMemberSz =
sizeof(
void *) + 2 *
sizeof(std::int32_t);
58 constexpr unsigned maxInlineByteSize = 1024;
60 elementsPerCacheLine >= 8 ? elementsPerCacheLine : (
sizeOfT * 8 > maxInlineByteSize ? 0 : 8);
82 return std::max({
alignof(
void *),
alignof(std::int32_t),
alignOfSubfield});
89 constexpr auto dataMemberSz =
sizeof(
void *) + 2 *
sizeof(std::int32_t);
102 auto *
vec =
static_cast<std::vector<char> *
>(
valuePtr.get());
107 std::vector<ROOT::RFieldBase::RValue>
result;
109 for (
unsigned i = 0; i <
nItems; ++i) {
120 "std::array<" +
itemField->GetTypeName() +
"," +
132 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
139 if (fSubfields[0]->IsSimple()) {
140 GetPrincipalColumnOf(*fSubfields[0])->AppendV(from, fArrayLength);
141 nbytes += fArrayLength * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
143 auto arrayPtr =
static_cast<const unsigned char *
>(from);
144 for (
unsigned i = 0; i < fArrayLength; ++i) {
145 nbytes += CallAppendOn(*fSubfields[0],
arrayPtr + (i * fItemSize));
153 if (fSubfields[0]->IsSimple()) {
154 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
globalIndex * fArrayLength, fArrayLength, to);
156 auto arrayPtr =
static_cast<unsigned char *
>(to);
157 for (
unsigned i = 0; i < fArrayLength; ++i) {
165 if (fSubfields[0]->IsSimple()) {
166 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
localIndex * fArrayLength, fArrayLength, to);
168 auto arrayPtr =
static_cast<unsigned char *
>(to);
169 for (
unsigned i = 0; i < fArrayLength; ++i) {
170 CallReadOn(*fSubfields[0],
localIndex * fArrayLength + i,
arrayPtr + (i * fItemSize));
177 if (!fSubfields[0]->IsSimple())
180 GetPrincipalColumnOf(*fSubfields[0])
182 return RBulkSpec::kAllSet;
187 static const std::vector<std::string>
prefixes = {
"std::array<"};
189 EnsureMatchingOnDiskField(desc, kDiffTypeName).ThrowOnError();
190 EnsureMatchingTypePrefix(desc,
prefixes).ThrowOnError();
195 if (fSubfields[0]->GetTraits() & kTraitTriviallyConstructible)
199 for (
unsigned i = 0; i < fArrayLength; ++i) {
200 CallConstructValueOn(*fSubfields[0],
arrayPtr + (i * fItemSize));
207 for (
unsigned i = 0; i < fArrayLength; ++i) {
208 fItemDeleter->operator()(
reinterpret_cast<unsigned char *
>(
objPtr) + i * fItemSize,
true );
216 if (!(fSubfields[0]->GetTraits() & kTraitTriviallyDestructible))
217 return std::make_unique<RArrayDeleter>(fItemSize, fArrayLength, GetDeleterOf(*fSubfields[0]));
218 return std::make_unique<RDeleter>();
225 std::vector<RValue>
result;
226 result.reserve(fArrayLength);
227 for (
unsigned i = 0; i < fArrayLength; ++i) {
228 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<void>(
valuePtr,
arrayPtr + (i * fItemSize))));
235 visitor.VisitArrayField(*
this);
267 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
276 if (fSubfields[0]->IsSimple() && *
sizePtr) {
278 nbytes += *
sizePtr * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
280 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
281 nbytes += CallAppendOn(*fSubfields[0], *
beginPtr + i * fItemSize);
286 fPrincipalColumn->Append(&fNWritten);
287 return nbytes + fPrincipalColumn->GetElement()->GetPackedSize();
294 if (
nItems >
static_cast<std::size_t
>(std::numeric_limits<std::int32_t>::max())) {
319 for (std::size_t i = 0
u; i <
oldSize; ++i) {
337 for (std::size_t i = 0
u; i <
oldSize; ++i)
362 auto begin = ResizeRVec(to,
nItems, fItemSize, fSubfields[0].get(), fItemDeleter.get());
364 if (fSubfields[0]->IsSimple() &&
nItems) {
370 for (std::size_t i = 0; i <
nItems; ++i) {
371 CallReadOn(*fSubfields[0],
collectionStart + i, begin + (i * fItemSize));
383 bulkSpec.fAuxData->resize(
sizeof(std::size_t));
384 *
reinterpret_cast<std::size_t *
>(
bulkSpec.fAuxData->data()) = fBulkNRepetition * fBulkSubfield->GetValueSize();
410 for (std::size_t i = 0; i <
nBatch; ++i) {
430 for (std::size_t i = 0; i <
bulkSpec.fCount; ++i) {
436 GetPrincipalColumnOf(*fBulkSubfield)
438 return RBulkSpec::kAllSet;
468 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) == 0) {
469 auto substitute = std::make_unique<RArrayAsRVecField>(
470 GetFieldName(), fSubfields[0]->Clone(fSubfields[0]->GetFieldName()),
fieldDesc.GetNRepetitions());
479 EnsureMatchingOnDiskField(desc, kDiffTypeName).ThrowOnError();
487 std::int32_t *
sizePtr =
new (
reinterpret_cast<void *
>(
beginPtr + 1)) std::int32_t(0);
488 new (
sizePtr + 1) std::int32_t(-1);
496 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
497 fItemDeleter->operator()(*
beginPtr + i * fItemSize,
true );
508 return std::make_unique<RRVecDeleter>(fSubfields[0]->GetAlignment(), fItemSize, GetDeleterOf(*fSubfields[0]));
509 return std::make_unique<RRVecDeleter>(fSubfields[0]->GetAlignment());
516 std::vector<RValue>
result;
518 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
520 fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(), *
beginPtr + i * fItemSize)));
562std::unique_ptr<ROOT::RVectorField>
570 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
571 auto isUntyped = GetTypeName().empty() || ((fTraits & kTraitEmulatedField) != 0);
578 auto typedValue =
static_cast<const std::vector<char> *
>(from);
587 if (fSubfields[0]->IsSimple() && count) {
588 GetPrincipalColumnOf(*fSubfields[0])->AppendV(
typedValue->data(), count);
589 nbytes += count * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
591 for (
unsigned i = 0; i < count; ++i) {
592 nbytes += CallAppendOn(*fSubfields[0],
typedValue->data() + (i * fItemSize));
597 fPrincipalColumn->Append(&fNWritten);
598 return nbytes + fPrincipalColumn->GetElement()->GetPackedSize();
618 if (!(
itemField.GetTraits() & kTraitTriviallyConstructible)) {
627 auto typedValue =
static_cast<std::vector<char> *
>(to);
633 if (fSubfields[0]->IsSimple()) {
640 ResizeVector(to,
nItems, fItemSize, *fSubfields[0], fItemDeleter.get());
642 for (std::size_t i = 0; i <
nItems; ++i) {
674 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) == 0) {
675 auto substitute = std::make_unique<RArrayAsVectorField>(
676 GetFieldName(), fSubfields[0]->Clone(fSubfields[0]->GetFieldName()),
fieldDesc.GetNRepetitions());
685 EnsureMatchingOnDiskField(desc, kDiffTypeName).ThrowOnError();
695 for (std::size_t i = 0; i <
nItems; ++i) {
696 fItemDeleter->operator()(
vecPtr->data() + (i * fItemSize),
true );
706 return std::make_unique<RVectorDeleter>(fItemSize, GetDeleterOf(*fSubfields[0]));
707 return std::make_unique<RVectorDeleter>();
717 visitor.VisitVectorField(*
this);
730 auto typedValue =
static_cast<const std::vector<bool> *
>(from);
732 for (
unsigned i = 0; i < count; ++i) {
733 bool bval = (*typedValue)[i];
734 CallAppendOn(*fSubfields[0], &
bval);
737 fPrincipalColumn->Append(&fNWritten);
738 return count + fPrincipalColumn->GetElement()->GetPackedSize();
743 auto typedValue =
static_cast<std::vector<bool> *
>(to);
745 if (fOnDiskNRepetitions == 0) {
750 for (std::size_t i = 0; i <
nItems; ++i) {
753 (*typedValue)[i] =
bval;
757 for (std::size_t i = 0; i < fOnDiskNRepetitions; ++i) {
759 CallReadOn(*fSubfields[0],
globalIndex * fOnDiskNRepetitions + i, &
bval);
760 (*typedValue)[i] =
bval;
767 auto typedValue =
static_cast<std::vector<bool> *
>(to);
769 if (fOnDiskNRepetitions == 0) {
774 for (std::size_t i = 0; i <
nItems; ++i) {
777 (*typedValue)[i] =
bval;
781 for (std::size_t i = 0; i < fOnDiskNRepetitions; ++i) {
783 CallReadOn(*fSubfields[0],
localIndex * fOnDiskNRepetitions + i, &
bval);
784 (*typedValue)[i] =
bval;
807 if (fOnDiskNRepetitions == 0)
813 const auto &
fieldDesc = desc.GetFieldDescriptor(GetOnDiskId());
815 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) == 0) {
816 EnsureMatchingOnDiskField(desc, kDiffTypeName | kDiffStructure | kDiffNRepetitions).ThrowOnError();
819 throw RException(
R__FAIL(
"fixed-size array --> std::vector<bool>: expected repetition count > 0\n" +
823 throw RException(
R__FAIL(
"fixed-size array --> std::vector<bool>: expected plain on-disk field\n" +
826 fOnDiskNRepetitions =
fieldDesc.GetNRepetitions();
828 EnsureMatchingOnDiskField(desc, kDiffTypeName).ThrowOnError();
836 std::vector<RValue>
result;
838 for (
unsigned i = 0; i < count; ++i) {
840 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<bool>(
new bool(
true))));
842 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<bool>(
new bool(
false))));
850 visitor.VisitVectorBoolField(*
this);
870 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
871 return std::make_unique<RArrayAsRVecField>(
newName, std::move(
newItemField), fArrayLength);
879 std::int32_t *
sizePtr =
new (
static_cast<void *
>(
beginPtr + 1)) std::int32_t(0);
880 new (
sizePtr + 1) std::int32_t(-1);
886 return std::make_unique<RRVecField::RRVecDeleter>(fSubfields[0]->GetAlignment(), fItemSize,
887 GetDeleterOf(*fSubfields[0]));
889 return std::make_unique<RRVecField::RRVecDeleter>(fSubfields[0]->GetAlignment());
894 auto begin =
RRVecField::ResizeRVec(to, fArrayLength, fItemSize, fSubfields[0].get(), fItemDeleter.get());
896 if (fSubfields[0]->IsSimple()) {
897 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
globalIndex * fArrayLength, fArrayLength, begin);
902 for (std::size_t i = 0; i < fArrayLength; ++i) {
903 CallReadOn(*fSubfields[0],
globalIndex * fArrayLength + i, begin + (i * fItemSize));
909 auto begin =
RRVecField::ResizeRVec(to, fArrayLength, fItemSize, fSubfields[0].get(), fItemDeleter.get());
911 if (fSubfields[0]->IsSimple()) {
912 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
localIndex * fArrayLength, fArrayLength, begin);
917 for (std::size_t i = 0; i < fArrayLength; ++i) {
918 CallReadOn(*fSubfields[0],
localIndex * fArrayLength + i, begin + (i * fItemSize));
924 EnsureMatchingOnDiskField(desc, kDiffTypeName | kDiffTypeVersion | kDiffStructure | kDiffNRepetitions)
927 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) != 0) {
928 throw RException(
R__FAIL(
"RArrayAsRVecField " + GetQualifiedFieldName() +
" expects an on-disk array field\n" +
941 std::vector<ROOT::RFieldBase::RValue>
result;
942 result.reserve(fArrayLength);
943 for (
unsigned i = 0; i < fArrayLength; ++i) {
945 fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(),
arrayPtr + (i * fItemSize))));
952 visitor.VisitArrayAsRVecField(*
this);
971 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
972 return std::make_unique<RArrayAsVectorField>(
newName, std::move(
newItemField), fArrayLength);
977 throw RException(
R__FAIL(
"RArrayAsVectorField fields must only be used for reading"));
983 return std::make_unique<RVectorField::RVectorDeleter>(fItemSize, GetDeleterOf(*fSubfields[0]));
984 return std::make_unique<RVectorField::RVectorDeleter>();
989 auto typedValue =
static_cast<std::vector<char> *
>(to);
991 if (fSubfields[0]->IsSimple()) {
993 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
globalIndex * fArrayLength, fArrayLength,
typedValue->data());
999 for (std::size_t i = 0; i < fArrayLength; ++i) {
1006 auto typedValue =
static_cast<std::vector<char> *
>(to);
1008 if (fSubfields[0]->IsSimple()) {
1009 typedValue->resize(fArrayLength * fItemSize);
1010 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
localIndex * fArrayLength, fArrayLength,
typedValue->data());
1016 for (std::size_t i = 0; i < fArrayLength; ++i) {
1017 CallReadOn(*fSubfields[0],
localIndex * fArrayLength + i,
typedValue->data() + (i * fItemSize));
1023 EnsureMatchingOnDiskField(desc, kDiffTypeName | kDiffTypeVersion | kDiffStructure | kDiffNRepetitions);
1026 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) != 0) {
1027 throw RException(
R__FAIL(
"RArrayAsVectorField " + GetQualifiedFieldName() +
" expects an on-disk array field\n" +
1039 visitor.VisitArrayAsVectorField(*
this);
#define R__FAIL(msg)
Short-hand to return an RResult<T> in an error state; the RError is implicitly converted into RResult...
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t result
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Abstract base class for classes implementing the visitor design pattern.
The in-memory representation of a 32bit or 64bit on-disk index column.
Abstract interface to read data from an ntuple.
std::unique_ptr< RDeleter > fItemDeleter
void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final
RArrayAsRVecField(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField, std::size_t arrayLength)
Constructor of the field.
std::size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
std::unique_ptr< RDeleter > GetDeleter() const final
Returns an RRVecField::RRVecDeleter.
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
The size of a value of this field, i.e. an RVec.
std::vector< RFieldBase::RValue > SplitValue(const RFieldBase::RValue &value) const final
Creates the list of direct child values given an existing value for this field.
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
std::size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
std::size_t fValueSize
The length of the arrays in this field.
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
std::unique_ptr< RDeleter > GetDeleter() const final
Returns an RVectorField::RVectorDeleter.
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
std::unique_ptr< RDeleter > fItemDeleter
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
RArrayAsVectorField(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField, std::size_t arrayLength)
The itemField argument represents the inner item of the on-disk array, i.e.
void GenerateColumns() final
Implementations in derived classes should create the backing columns corresponding to the field type ...
void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final
std::vector< RFieldBase::RValue > SplitValue(const RFieldBase::RValue &value) const final
Creates the list of direct child values given an existing value for this field.
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
The length of the arrays in this field.
void operator()(void *objPtr, bool dtorOnly) final
Template specializations for C++ std::array and C-style arrays.
std::unique_ptr< RDeleter > GetDeleter() const final
RArrayField(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField, std::size_t arrayLength)
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
std::size_t ReadBulkImpl(const RBulkSpec &bulkSpec) final
General implementation of bulk read.
void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
Base class for all ROOT issued exceptions.
The list of column representations a field can have.
A functor to release the memory acquired by CreateValue() (memory and constructor).
Points to an object with RNTuple I/O support and keeps a pointer to the corresponding field.
A field translates read and write calls from/to underlying columns to/from tree values.
void Attach(std::unique_ptr< RFieldBase > child)
Add a new subfield to the list of nested fields.
std::vector< std::unique_ptr< RFieldBase > > fSubfields
Collections and classes own subfields.
static std::unique_ptr< RDeleter > GetDeleterOf(const RFieldBase &other)
std::uint32_t fTraits
Properties of the type that allow for optimizations of collections of that type.
std::uint32_t GetTraits() const
@ kTraitEmulatedField
This field is a user defined type that was missing dictionaries and was reconstructed from the on-dis...
@ kTraitTriviallyDestructible
The type is cleaned up just by freeing its memory. I.e. the destructor performs a no-op.
virtual std::size_t ReadBulkImpl(const RBulkSpec &bulkSpec)
General implementation of bulk read.
Classes with dictionaries that can be inspected by TClass.
The on-storage metadata of an RNTuple.
const RFieldDescriptor & GetFieldDescriptor(ROOT::DescriptorId_t fieldId) const
Addresses a column element or field item relative to a particular cluster, instead of a global NTuple...
void operator()(void *objPtr, bool dtorOnly) final
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
void GenerateColumns() final
Implementations in derived classes should create the backing columns corresponding to the field type ...
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
std::size_t fBulkNRepetition
std::size_t ReadBulkImpl(const RBulkSpec &bulkSpec) final
General implementation of bulk read.
RRVecField(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField)
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
std::unique_ptr< RFieldBase > BeforeConnectPageSource(ROOT::Internal::RPageSource &pageSource) final
Called by ConnectPageSource() before connecting; derived classes may override this as appropriate,...
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
static unsigned char * ResizeRVec(void *rvec, std::size_t nItems, std::size_t itemSize, const RFieldBase *itemField, RDeleter *itemDeleter)
std::unique_ptr< RDeleter > fItemDeleter
const RColumnRepresentations & GetColumnRepresentations() const final
Implementations in derived classes should return a static RColumnRepresentations object.
RFieldBase * fBulkSubfield
May be a direct PoD subfield or a sub-subfield of a fixed-size array of PoD.
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
std::unique_ptr< RDeleter > GetDeleter() const final
void operator()(void *objPtr, bool dtorOnly) final
Template specializations for C++ std::vector.
static std::unique_ptr< RVectorField > CreateUntyped(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField)
void GenerateColumns() final
Implementations in derived classes should create the backing columns corresponding to the field type ...
std::unique_ptr< RFieldBase > BeforeConnectPageSource(ROOT::Internal::RPageSource &pageSource) final
Called by ConnectPageSource() before connecting; derived classes may override this as appropriate,...
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
static void ResizeVector(void *vec, std::size_t nItems, std::size_t itemSize, const RFieldBase &itemField, RDeleter *itemDeleter)
RVectorField(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField, std::optional< std::string_view > emulatedFromType)
Creates a possibly-untyped VectorField.
const RColumnRepresentations & GetColumnRepresentations() const final
Implementations in derived classes should return a static RColumnRepresentations object.
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
std::unique_ptr< RDeleter > fItemDeleter
std::unique_ptr< RDeleter > GetDeleter() const final
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
std::string GetNormalizedInteger(const std::string &intTemplateArg)
Appends 'll' or 'ull' to the where necessary and strips the suffix if not needed.
std::string GetTypeTraceReport(const RFieldBase &field, const RNTupleDescriptor &desc)
Prints the hierarchy of types with their field names and field IDs for the given in-memory field and ...
std::uint64_t NTupleSize_t
Integer type long enough to hold the maximum number of entries in a column.
constexpr DescriptorId_t kInvalidDescriptorId
ENTupleStructure
The fields in the RNTuple data model tree can carry different structural information about the type s...
Input parameter to RFieldBase::ReadBulk() and RFieldBase::ReadBulkImpl().