19 auto *
vec =
static_cast<std::vector<char> *
>(
valuePtr.get());
24 std::vector<ROOT::RFieldBase::RValue>
result;
26 for (
unsigned i = 0; i <
nItems; ++i) {
37 "std::array<" +
itemField->GetTypeName() +
"," +
53 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
60 if (fSubfields[0]->IsSimple()) {
61 GetPrincipalColumnOf(*fSubfields[0])->AppendV(from, fArrayLength);
62 nbytes += fArrayLength * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
64 auto arrayPtr =
static_cast<const unsigned char *
>(from);
65 for (
unsigned i = 0; i < fArrayLength; ++i) {
66 nbytes += CallAppendOn(*fSubfields[0],
arrayPtr + (i * fItemSize));
74 if (fSubfields[0]->IsSimple()) {
75 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
globalIndex * fArrayLength, fArrayLength, to);
77 auto arrayPtr =
static_cast<unsigned char *
>(to);
78 for (
unsigned i = 0; i < fArrayLength; ++i) {
86 if (fSubfields[0]->IsSimple()) {
87 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
localIndex * fArrayLength, fArrayLength, to);
89 auto arrayPtr =
static_cast<unsigned char *
>(to);
90 for (
unsigned i = 0; i < fArrayLength; ++i) {
98 if (!fSubfields[0]->IsSimple())
101 GetPrincipalColumnOf(*fSubfields[0])
103 return RBulkSpec::kAllSet;
108 static const std::vector<std::string>
prefixes = {
"std::array<"};
110 EnsureMatchingOnDiskField(desc, kDiffTypeName).ThrowOnError();
111 EnsureMatchingTypePrefix(desc,
prefixes).ThrowOnError();
116 if (fSubfields[0]->GetTraits() & kTraitTriviallyConstructible)
120 for (
unsigned i = 0; i < fArrayLength; ++i) {
121 CallConstructValueOn(*fSubfields[0],
arrayPtr + (i * fItemSize));
128 for (
unsigned i = 0; i < fArrayLength; ++i) {
129 fItemDeleter->operator()(
reinterpret_cast<unsigned char *
>(
objPtr) + i * fItemSize,
true );
137 if (!(fSubfields[0]->GetTraits() & kTraitTriviallyDestructible))
138 return std::make_unique<RArrayDeleter>(fItemSize, fArrayLength, GetDeleterOf(*fSubfields[0]));
139 return std::make_unique<RDeleter>();
146 std::vector<RValue>
result;
147 result.reserve(fArrayLength);
148 for (
unsigned i = 0; i < fArrayLength; ++i) {
149 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<void>(
valuePtr,
arrayPtr + (i * fItemSize))));
156 visitor.VisitArrayField(*
this);
191 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
200 if (fSubfields[0]->IsSimple() && *
sizePtr) {
202 nbytes += *
sizePtr * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
204 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
205 nbytes += CallAppendOn(*fSubfields[0], *
beginPtr + i * fItemSize);
210 fPrincipalColumn->Append(&fNWritten);
211 return nbytes + fPrincipalColumn->GetElement()->GetPackedSize();
218 if (
nItems >
static_cast<std::size_t
>(std::numeric_limits<std::int32_t>::max())) {
250 for (std::size_t i = 0
u; i <
oldSize; ++i) {
268 for (std::size_t i = 0
u; i <
oldSize; ++i)
293 auto begin = ResizeRVec(to,
nItems, fItemSize, fSubfields[0].get(), fItemDeleter.get());
295 if (fSubfields[0]->IsSimple() &&
nItems) {
301 for (std::size_t i = 0; i <
nItems; ++i) {
302 CallReadOn(*fSubfields[0],
collectionStart + i, begin + (i * fItemSize));
314 bulkSpec.fAuxData->resize(
sizeof(std::size_t));
315 *
reinterpret_cast<std::size_t *
>(
bulkSpec.fAuxData->data()) = fBulkNRepetition * fBulkSubfield->GetValueSize();
341 for (std::size_t i = 0; i <
nBatch; ++i) {
361 for (std::size_t i = 0; i <
bulkSpec.fCount; ++i) {
367 GetPrincipalColumnOf(*fBulkSubfield)
369 return RBulkSpec::kAllSet;
399 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) == 0) {
400 auto substitute = std::make_unique<RArrayAsRVecField>(
401 GetFieldName(), fSubfields[0]->Clone(fSubfields[0]->GetFieldName()),
fieldDesc.GetNRepetitions());
410 EnsureMatchingOnDiskCollection(desc).ThrowOnError();
418 std::int32_t *
sizePtr =
new (
reinterpret_cast<void *
>(
beginPtr + 1)) std::int32_t(0);
419 new (
sizePtr + 1) std::int32_t(-1);
427 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
428 fItemDeleter->operator()(*
beginPtr + i * fItemSize,
true );
439 return std::make_unique<RRVecDeleter>(fSubfields[0]->GetAlignment(), fItemSize, GetDeleterOf(*fSubfields[0]));
440 return std::make_unique<RRVecDeleter>(fSubfields[0]->GetAlignment());
447 std::vector<RValue>
result;
449 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
451 fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(), *
beginPtr + i * fItemSize)));
496std::unique_ptr<ROOT::RVectorField>
504 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
505 auto isUntyped = GetTypeName().empty() || ((fTraits & kTraitEmulatedField) != 0);
512 auto typedValue =
static_cast<const std::vector<char> *
>(from);
521 if (fSubfields[0]->IsSimple() && count) {
522 GetPrincipalColumnOf(*fSubfields[0])->AppendV(
typedValue->data(), count);
523 nbytes += count * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
525 for (
unsigned i = 0; i < count; ++i) {
526 nbytes += CallAppendOn(*fSubfields[0],
typedValue->data() + (i * fItemSize));
531 fPrincipalColumn->Append(&fNWritten);
532 return nbytes + fPrincipalColumn->GetElement()->GetPackedSize();
553 if (!(
itemField.GetTraits() & kTraitTriviallyConstructible)) {
562 auto typedValue =
static_cast<std::vector<char> *
>(to);
568 if (fSubfields[0]->IsSimple()) {
575 ResizeVector(to,
nItems, fItemSize, *fSubfields[0], fItemDeleter.get());
577 for (std::size_t i = 0; i <
nItems; ++i) {
609 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) == 0) {
610 auto substitute = std::make_unique<RArrayAsVectorField>(
611 GetFieldName(), fSubfields[0]->Clone(fSubfields[0]->GetFieldName()),
fieldDesc.GetNRepetitions());
620 EnsureMatchingOnDiskCollection(desc).ThrowOnError();
630 for (std::size_t i = 0; i <
nItems; ++i) {
631 fItemDeleter->operator()(
vecPtr->data() + (i * fItemSize),
true );
641 return std::make_unique<RVectorDeleter>(fItemSize, GetDeleterOf(*fSubfields[0]));
642 return std::make_unique<RVectorDeleter>();
652 visitor.VisitVectorField(*
this);
665 auto typedValue =
static_cast<const std::vector<bool> *
>(from);
667 for (
unsigned i = 0; i < count; ++i) {
668 bool bval = (*typedValue)[i];
669 CallAppendOn(*fSubfields[0], &
bval);
672 fPrincipalColumn->Append(&fNWritten);
673 return count + fPrincipalColumn->GetElement()->GetPackedSize();
678 auto typedValue =
static_cast<std::vector<bool> *
>(to);
680 if (fOnDiskNRepetitions == 0) {
685 for (std::size_t i = 0; i <
nItems; ++i) {
688 (*typedValue)[i] =
bval;
692 for (std::size_t i = 0; i < fOnDiskNRepetitions; ++i) {
694 CallReadOn(*fSubfields[0],
globalIndex * fOnDiskNRepetitions + i, &
bval);
695 (*typedValue)[i] =
bval;
702 auto typedValue =
static_cast<std::vector<bool> *
>(to);
704 if (fOnDiskNRepetitions == 0) {
709 for (std::size_t i = 0; i <
nItems; ++i) {
712 (*typedValue)[i] =
bval;
716 for (std::size_t i = 0; i < fOnDiskNRepetitions; ++i) {
718 CallReadOn(*fSubfields[0],
localIndex * fOnDiskNRepetitions + i, &
bval);
719 (*typedValue)[i] =
bval;
742 if (fOnDiskNRepetitions == 0)
748 const auto &
fieldDesc = desc.GetFieldDescriptor(GetOnDiskId());
750 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) == 0) {
751 EnsureMatchingOnDiskField(desc, kDiffTypeName | kDiffStructure | kDiffNRepetitions).ThrowOnError();
754 throw RException(
R__FAIL(
"fixed-size array --> std::vector<bool>: expected repetition count > 0\n" +
758 throw RException(
R__FAIL(
"fixed-size array --> std::vector<bool>: expected plain on-disk field\n" +
761 fOnDiskNRepetitions =
fieldDesc.GetNRepetitions();
763 EnsureMatchingOnDiskCollection(desc).ThrowOnError();
771 std::vector<RValue>
result;
773 for (
unsigned i = 0; i < count; ++i) {
775 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<bool>(
new bool(
true))));
777 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<bool>(
new bool(
false))));
785 visitor.VisitVectorBoolField(*
this);
808 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
809 return std::make_unique<RArrayAsRVecField>(
newName, std::move(
newItemField), fArrayLength);
817 std::int32_t *
sizePtr =
new (
static_cast<void *
>(
beginPtr + 1)) std::int32_t(0);
818 new (
sizePtr + 1) std::int32_t(-1);
824 return std::make_unique<RRVecField::RRVecDeleter>(fSubfields[0]->GetAlignment(), fItemSize,
825 GetDeleterOf(*fSubfields[0]));
827 return std::make_unique<RRVecField::RRVecDeleter>(fSubfields[0]->GetAlignment());
832 auto begin =
RRVecField::ResizeRVec(to, fArrayLength, fItemSize, fSubfields[0].get(), fItemDeleter.get());
834 if (fSubfields[0]->IsSimple()) {
835 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
globalIndex * fArrayLength, fArrayLength, begin);
840 for (std::size_t i = 0; i < fArrayLength; ++i) {
841 CallReadOn(*fSubfields[0],
globalIndex * fArrayLength + i, begin + (i * fItemSize));
847 auto begin =
RRVecField::ResizeRVec(to, fArrayLength, fItemSize, fSubfields[0].get(), fItemDeleter.get());
849 if (fSubfields[0]->IsSimple()) {
850 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
localIndex * fArrayLength, fArrayLength, begin);
855 for (std::size_t i = 0; i < fArrayLength; ++i) {
856 CallReadOn(*fSubfields[0],
localIndex * fArrayLength + i, begin + (i * fItemSize));
862 EnsureMatchingOnDiskField(desc, kDiffTypeName | kDiffStructure | kDiffNRepetitions).ThrowOnError();
864 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) != 0) {
865 throw RException(
R__FAIL(
"RArrayAsRVecField " + GetQualifiedFieldName() +
" expects an on-disk array field\n" +
878 std::vector<ROOT::RFieldBase::RValue>
result;
879 result.reserve(fArrayLength);
880 for (
unsigned i = 0; i < fArrayLength; ++i) {
882 fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(),
arrayPtr + (i * fItemSize))));
889 visitor.VisitArrayAsRVecField(*
this);
910 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
911 return std::make_unique<RArrayAsVectorField>(
newName, std::move(
newItemField), fArrayLength);
916 throw RException(
R__FAIL(
"RArrayAsVectorField fields must only be used for reading"));
922 return std::make_unique<RVectorField::RVectorDeleter>(fItemSize, GetDeleterOf(*fSubfields[0]));
923 return std::make_unique<RVectorField::RVectorDeleter>();
928 auto typedValue =
static_cast<std::vector<char> *
>(to);
930 if (fSubfields[0]->IsSimple()) {
932 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
globalIndex * fArrayLength, fArrayLength,
typedValue->data());
938 for (std::size_t i = 0; i < fArrayLength; ++i) {
945 auto typedValue =
static_cast<std::vector<char> *
>(to);
947 if (fSubfields[0]->IsSimple()) {
949 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
localIndex * fArrayLength, fArrayLength,
typedValue->data());
955 for (std::size_t i = 0; i < fArrayLength; ++i) {
956 CallReadOn(*fSubfields[0],
localIndex * fArrayLength + i,
typedValue->data() + (i * fItemSize));
962 EnsureMatchingOnDiskField(desc, kDiffTypeName | kDiffStructure | kDiffNRepetitions);
965 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) != 0) {
966 throw RException(
R__FAIL(
"RArrayAsVectorField " + GetQualifiedFieldName() +
" expects an on-disk array field\n" +
978 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, 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.
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.
@ 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.
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
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::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().