20 auto *
vec =
static_cast<std::vector<char> *
>(
valuePtr.get());
25 std::vector<ROOT::RFieldBase::RValue>
result;
27 for (
unsigned i = 0; i <
nItems; ++i) {
35 return sizeof(std::vector<char>);
40 return alignof(std::vector<char>);
48 "std::array<" +
itemField->GetTypeName() +
"," +
64 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
71 if (fSubfields[0]->IsSimple()) {
72 GetPrincipalColumnOf(*fSubfields[0])->AppendV(from, fArrayLength);
73 nbytes += fArrayLength * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
75 auto arrayPtr =
static_cast<const unsigned char *
>(from);
76 for (
unsigned i = 0; i < fArrayLength; ++i) {
77 nbytes += CallAppendOn(*fSubfields[0],
arrayPtr + (i * fItemSize));
85 if (fSubfields[0]->IsSimple()) {
86 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
globalIndex * fArrayLength, fArrayLength, to);
88 auto arrayPtr =
static_cast<unsigned char *
>(to);
89 for (
unsigned i = 0; i < fArrayLength; ++i) {
97 if (fSubfields[0]->IsSimple()) {
98 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
localIndex * fArrayLength, fArrayLength, to);
100 auto arrayPtr =
static_cast<unsigned char *
>(to);
101 for (
unsigned i = 0; i < fArrayLength; ++i) {
102 CallReadOn(*fSubfields[0],
localIndex * fArrayLength + i,
arrayPtr + (i * fItemSize));
109 if (!fSubfields[0]->IsSimple())
112 GetPrincipalColumnOf(*fSubfields[0])
114 return RBulkSpec::kAllSet;
119 static const std::vector<std::string>
prefixes = {
"std::array<"};
121 EnsureMatchingOnDiskField(desc, kDiffTypeName).ThrowOnError();
122 EnsureMatchingTypePrefix(desc,
prefixes).ThrowOnError();
127 if (fSubfields[0]->GetTraits() & kTraitTriviallyConstructible)
131 for (
unsigned i = 0; i < fArrayLength; ++i) {
132 CallConstructValueOn(*fSubfields[0],
arrayPtr + (i * fItemSize));
139 for (
unsigned i = 0; i < fArrayLength; ++i) {
140 fItemDeleter->operator()(
reinterpret_cast<unsigned char *
>(
objPtr) + i * fItemSize,
true );
148 if (!(fSubfields[0]->GetTraits() & kTraitTriviallyDestructible))
149 return std::make_unique<RArrayDeleter>(fItemSize, fArrayLength, GetDeleterOf(*fSubfields[0]));
150 return std::make_unique<RDeleter>();
157 std::vector<RValue>
result;
158 result.reserve(fArrayLength);
159 for (
unsigned i = 0; i < fArrayLength; ++i) {
160 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<void>(
valuePtr,
arrayPtr + (i * fItemSize))));
167 visitor.VisitArrayField(*
this);
202 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
211 if (fSubfields[0]->IsSimple() && *
sizePtr) {
213 nbytes += *
sizePtr * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
215 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
216 nbytes += CallAppendOn(*fSubfields[0], *
beginPtr + i * fItemSize);
221 fPrincipalColumn->Append(&fNWritten);
222 return nbytes + fPrincipalColumn->GetElement()->GetPackedSize();
229 if (
nItems >
static_cast<std::size_t
>(std::numeric_limits<std::int32_t>::max())) {
261 for (std::size_t i = 0
u; i <
oldSize; ++i) {
279 for (std::size_t i = 0
u; i <
oldSize; ++i)
304 auto begin = ResizeRVec(to,
nItems, fItemSize, fSubfields[0].get(), fItemDeleter.get());
306 if (fSubfields[0]->IsSimple() &&
nItems) {
312 for (std::size_t i = 0; i <
nItems; ++i) {
313 CallReadOn(*fSubfields[0],
collectionStart + i, begin + (i * fItemSize));
325 bulkSpec.fAuxData->resize(
sizeof(std::size_t));
326 *
reinterpret_cast<std::size_t *
>(
bulkSpec.fAuxData->data()) = fBulkNRepetition * fBulkSubfield->GetValueSize();
352 for (std::size_t i = 0; i <
nBatch; ++i) {
372 for (std::size_t i = 0; i <
bulkSpec.fCount; ++i) {
378 GetPrincipalColumnOf(*fBulkSubfield)
380 return RBulkSpec::kAllSet;
410 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) == 0) {
411 auto substitute = std::make_unique<RArrayAsRVecField>(
412 GetFieldName(), fSubfields[0]->Clone(fSubfields[0]->GetFieldName()),
fieldDesc.GetNRepetitions());
421 EnsureMatchingOnDiskCollection(desc).ThrowOnError();
429 std::int32_t *
sizePtr =
new (
reinterpret_cast<void *
>(
beginPtr + 1)) std::int32_t(0);
430 new (
sizePtr + 1) std::int32_t(-1);
438 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
439 fItemDeleter->operator()(*
beginPtr + i * fItemSize,
true );
450 return std::make_unique<RRVecDeleter>(fSubfields[0]->GetAlignment(), fItemSize, GetDeleterOf(*fSubfields[0]));
451 return std::make_unique<RRVecDeleter>(fSubfields[0]->GetAlignment());
458 std::vector<RValue>
result;
460 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
462 fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(), *
beginPtr + i * fItemSize)));
507std::unique_ptr<ROOT::RVectorField>
515 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
516 auto isUntyped = GetTypeName().empty() || ((fTraits & kTraitEmulatedField) != 0);
523 auto typedValue =
static_cast<const std::vector<char> *
>(from);
532 if (fSubfields[0]->IsSimple() && count) {
533 GetPrincipalColumnOf(*fSubfields[0])->AppendV(
typedValue->data(), count);
534 nbytes += count * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
536 for (
unsigned i = 0; i < count; ++i) {
537 nbytes += CallAppendOn(*fSubfields[0],
typedValue->data() + (i * fItemSize));
542 fPrincipalColumn->Append(&fNWritten);
543 return nbytes + fPrincipalColumn->GetElement()->GetPackedSize();
564 if (!(
itemField.GetTraits() & kTraitTriviallyConstructible)) {
573 auto typedValue =
static_cast<std::vector<char> *
>(to);
579 if (fSubfields[0]->IsSimple()) {
586 ResizeVector(to,
nItems, fItemSize, *fSubfields[0], fItemDeleter.get());
588 for (std::size_t i = 0; i <
nItems; ++i) {
620 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) == 0) {
621 auto substitute = std::make_unique<RArrayAsVectorField>(
622 GetFieldName(), fSubfields[0]->Clone(fSubfields[0]->GetFieldName()),
fieldDesc.GetNRepetitions());
631 EnsureMatchingOnDiskCollection(desc).ThrowOnError();
641 for (std::size_t i = 0; i <
nItems; ++i) {
642 fItemDeleter->operator()(
vecPtr->data() + (i * fItemSize),
true );
652 return std::make_unique<RVectorDeleter>(fItemSize, GetDeleterOf(*fSubfields[0]));
653 return std::make_unique<RVectorDeleter>();
673 visitor.VisitVectorField(*
this);
686 auto typedValue =
static_cast<const std::vector<bool> *
>(from);
688 for (
unsigned i = 0; i < count; ++i) {
689 bool bval = (*typedValue)[i];
690 CallAppendOn(*fSubfields[0], &
bval);
693 fPrincipalColumn->Append(&fNWritten);
694 return count + fPrincipalColumn->GetElement()->GetPackedSize();
699 auto typedValue =
static_cast<std::vector<bool> *
>(to);
701 if (fOnDiskNRepetitions == 0) {
706 for (std::size_t i = 0; i <
nItems; ++i) {
709 (*typedValue)[i] =
bval;
713 for (std::size_t i = 0; i < fOnDiskNRepetitions; ++i) {
715 CallReadOn(*fSubfields[0],
globalIndex * fOnDiskNRepetitions + i, &
bval);
716 (*typedValue)[i] =
bval;
723 auto typedValue =
static_cast<std::vector<bool> *
>(to);
725 if (fOnDiskNRepetitions == 0) {
730 for (std::size_t i = 0; i <
nItems; ++i) {
733 (*typedValue)[i] =
bval;
737 for (std::size_t i = 0; i < fOnDiskNRepetitions; ++i) {
739 CallReadOn(*fSubfields[0],
localIndex * fOnDiskNRepetitions + i, &
bval);
740 (*typedValue)[i] =
bval;
763 if (fOnDiskNRepetitions == 0)
769 const auto &
fieldDesc = desc.GetFieldDescriptor(GetOnDiskId());
771 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) == 0) {
772 EnsureMatchingOnDiskField(desc, kDiffTypeName | kDiffStructure | kDiffNRepetitions).ThrowOnError();
775 throw RException(
R__FAIL(
"fixed-size array --> std::vector<bool>: expected repetition count > 0\n" +
779 throw RException(
R__FAIL(
"fixed-size array --> std::vector<bool>: expected plain on-disk field\n" +
782 fOnDiskNRepetitions =
fieldDesc.GetNRepetitions();
784 EnsureMatchingOnDiskCollection(desc).ThrowOnError();
792 std::vector<RValue>
result;
794 for (
unsigned i = 0; i < count; ++i) {
796 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<bool>(
new bool(
true))));
798 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<bool>(
new bool(
false))));
806 visitor.VisitVectorBoolField(*
this);
829 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
830 return std::make_unique<RArrayAsRVecField>(
newName, std::move(
newItemField), fArrayLength);
838 std::int32_t *
sizePtr =
new (
static_cast<void *
>(
beginPtr + 1)) std::int32_t(0);
839 new (
sizePtr + 1) std::int32_t(-1);
845 return std::make_unique<RRVecField::RRVecDeleter>(fSubfields[0]->GetAlignment(), fItemSize,
846 GetDeleterOf(*fSubfields[0]));
848 return std::make_unique<RRVecField::RRVecDeleter>(fSubfields[0]->GetAlignment());
853 auto begin =
RRVecField::ResizeRVec(to, fArrayLength, fItemSize, fSubfields[0].get(), fItemDeleter.get());
855 if (fSubfields[0]->IsSimple()) {
856 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
globalIndex * fArrayLength, fArrayLength, begin);
861 for (std::size_t i = 0; i < fArrayLength; ++i) {
862 CallReadOn(*fSubfields[0],
globalIndex * fArrayLength + i, begin + (i * fItemSize));
868 auto begin =
RRVecField::ResizeRVec(to, fArrayLength, fItemSize, fSubfields[0].get(), fItemDeleter.get());
870 if (fSubfields[0]->IsSimple()) {
871 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
localIndex * fArrayLength, fArrayLength, begin);
876 for (std::size_t i = 0; i < fArrayLength; ++i) {
877 CallReadOn(*fSubfields[0],
localIndex * fArrayLength + i, begin + (i * fItemSize));
883 EnsureMatchingOnDiskField(desc, kDiffTypeName | kDiffStructure | kDiffNRepetitions).ThrowOnError();
885 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) != 0) {
886 throw RException(
R__FAIL(
"RArrayAsRVecField " + GetQualifiedFieldName() +
" expects an on-disk array field\n" +
899 std::vector<ROOT::RFieldBase::RValue>
result;
900 result.reserve(fArrayLength);
901 for (
unsigned i = 0; i < fArrayLength; ++i) {
903 fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(),
arrayPtr + (i * fItemSize))));
910 visitor.VisitArrayAsRVecField(*
this);
931 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
932 return std::make_unique<RArrayAsVectorField>(
newName, std::move(
newItemField), fArrayLength);
937 throw RException(
R__FAIL(
"RArrayAsVectorField fields must only be used for reading"));
943 return std::make_unique<RVectorField::RVectorDeleter>(fItemSize, GetDeleterOf(*fSubfields[0]));
944 return std::make_unique<RVectorField::RVectorDeleter>();
949 auto typedValue =
static_cast<std::vector<char> *
>(to);
951 if (fSubfields[0]->IsSimple()) {
953 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
globalIndex * fArrayLength, fArrayLength,
typedValue->data());
959 for (std::size_t i = 0; i < fArrayLength; ++i) {
966 auto typedValue =
static_cast<std::vector<char> *
>(to);
968 if (fSubfields[0]->IsSimple()) {
970 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
localIndex * fArrayLength, fArrayLength,
typedValue->data());
976 for (std::size_t i = 0; i < fArrayLength; ++i) {
977 CallReadOn(*fSubfields[0],
localIndex * fArrayLength + i,
typedValue->data() + (i * fItemSize));
983 EnsureMatchingOnDiskField(desc, kDiffTypeName | kDiffStructure | kDiffNRepetitions);
986 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) != 0) {
987 throw RException(
R__FAIL(
"RArrayAsVectorField " + GetQualifiedFieldName() +
" expects an on-disk array field\n" +
1009 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
What alignof(T) for this type returns.
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
What sizeof(T) for this type returns.
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.
std::size_t GetAlignment() const final
What alignof(T) for this type returns.
std::size_t GetValueSize() const final
What sizeof(T) for this type returns.
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, std::string_view expectedChildName="")
Add a new subfield to the list of nested fields.
std::vector< std::unique_ptr< RFieldBase > > fSubfields
Collections and classes own subfields.
@ 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.
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::string fTypeAlias
A typedef or using name that was used when creating the field.
std::uint32_t GetTraits() const
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
What alignof(T) for this type returns.
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
What sizeof(T) for this type returns.
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::size_t GetValueSize() const final
What sizeof(T) for this type returns.
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::size_t GetAlignment() const final
What alignof(T) for this type returns.
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::tuple< unsigned char **, std::int32_t *, std::int32_t * > GetRVecDataMembers(void *rvecPtr)
Retrieve the addresses of the data members of a generic RVec from a pointer to the beginning of the R...
void DestroyRVecWithChecks(std::size_t alignOfT, unsigned char **beginPtr, std::int32_t *capacityPtr)
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::size_t EvalRVecAlignment(std::size_t alignOfSubfield)
std::size_t EvalRVecValueSize(std::size_t alignOfT, std::size_t sizeOfT, std::size_t alignOfRVecT)
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().