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() +
"," +
127 if (!
itemField->GetTypeAlias().empty()) {
136 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
143 if (fSubfields[0]->IsSimple()) {
144 GetPrincipalColumnOf(*fSubfields[0])->AppendV(from, fArrayLength);
145 nbytes += fArrayLength * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
147 auto arrayPtr =
static_cast<const unsigned char *
>(from);
148 for (
unsigned i = 0; i < fArrayLength; ++i) {
149 nbytes += CallAppendOn(*fSubfields[0],
arrayPtr + (i * fItemSize));
157 if (fSubfields[0]->IsSimple()) {
158 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
globalIndex * fArrayLength, fArrayLength, to);
160 auto arrayPtr =
static_cast<unsigned char *
>(to);
161 for (
unsigned i = 0; i < fArrayLength; ++i) {
169 if (fSubfields[0]->IsSimple()) {
170 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
localIndex * fArrayLength, fArrayLength, to);
172 auto arrayPtr =
static_cast<unsigned char *
>(to);
173 for (
unsigned i = 0; i < fArrayLength; ++i) {
174 CallReadOn(*fSubfields[0],
localIndex * fArrayLength + i,
arrayPtr + (i * fItemSize));
181 if (!fSubfields[0]->IsSimple())
184 GetPrincipalColumnOf(*fSubfields[0])
186 return RBulkSpec::kAllSet;
191 static const std::vector<std::string>
prefixes = {
"std::array<"};
193 EnsureMatchingOnDiskField(desc, kDiffTypeName).ThrowOnError();
194 EnsureMatchingTypePrefix(desc,
prefixes).ThrowOnError();
199 if (fSubfields[0]->GetTraits() & kTraitTriviallyConstructible)
203 for (
unsigned i = 0; i < fArrayLength; ++i) {
204 CallConstructValueOn(*fSubfields[0],
arrayPtr + (i * fItemSize));
211 for (
unsigned i = 0; i < fArrayLength; ++i) {
212 fItemDeleter->operator()(
reinterpret_cast<unsigned char *
>(
objPtr) + i * fItemSize,
true );
220 if (!(fSubfields[0]->GetTraits() & kTraitTriviallyDestructible))
221 return std::make_unique<RArrayDeleter>(fItemSize, fArrayLength, GetDeleterOf(*fSubfields[0]));
222 return std::make_unique<RDeleter>();
229 std::vector<RValue>
result;
230 result.reserve(fArrayLength);
231 for (
unsigned i = 0; i < fArrayLength; ++i) {
232 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<void>(
valuePtr,
arrayPtr + (i * fItemSize))));
239 visitor.VisitArrayField(*
this);
273 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
282 if (fSubfields[0]->IsSimple() && *
sizePtr) {
284 nbytes += *
sizePtr * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
286 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
287 nbytes += CallAppendOn(*fSubfields[0], *
beginPtr + i * fItemSize);
292 fPrincipalColumn->Append(&fNWritten);
293 return nbytes + fPrincipalColumn->GetElement()->GetPackedSize();
300 if (
nItems >
static_cast<std::size_t
>(std::numeric_limits<std::int32_t>::max())) {
325 for (std::size_t i = 0
u; i <
oldSize; ++i) {
343 for (std::size_t i = 0
u; i <
oldSize; ++i)
368 auto begin = ResizeRVec(to,
nItems, fItemSize, fSubfields[0].get(), fItemDeleter.get());
370 if (fSubfields[0]->IsSimple() &&
nItems) {
376 for (std::size_t i = 0; i <
nItems; ++i) {
377 CallReadOn(*fSubfields[0],
collectionStart + i, begin + (i * fItemSize));
389 bulkSpec.fAuxData->resize(
sizeof(std::size_t));
390 *
reinterpret_cast<std::size_t *
>(
bulkSpec.fAuxData->data()) = fBulkNRepetition * fBulkSubfield->GetValueSize();
416 for (std::size_t i = 0; i <
nBatch; ++i) {
436 for (std::size_t i = 0; i <
bulkSpec.fCount; ++i) {
442 GetPrincipalColumnOf(*fBulkSubfield)
444 return RBulkSpec::kAllSet;
474 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) == 0) {
475 auto substitute = std::make_unique<RArrayAsRVecField>(
476 GetFieldName(), fSubfields[0]->Clone(fSubfields[0]->GetFieldName()),
fieldDesc.GetNRepetitions());
485 EnsureMatchingOnDiskField(desc, kDiffTypeName).ThrowOnError();
493 std::int32_t *
sizePtr =
new (
reinterpret_cast<void *
>(
beginPtr + 1)) std::int32_t(0);
494 new (
sizePtr + 1) std::int32_t(-1);
502 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
503 fItemDeleter->operator()(*
beginPtr + i * fItemSize,
true );
514 return std::make_unique<RRVecDeleter>(fSubfields[0]->GetAlignment(), fItemSize, GetDeleterOf(*fSubfields[0]));
515 return std::make_unique<RRVecDeleter>(fSubfields[0]->GetAlignment());
522 std::vector<RValue>
result;
524 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
526 fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(), *
beginPtr + i * fItemSize)));
571std::unique_ptr<ROOT::RVectorField>
579 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
580 auto isUntyped = GetTypeName().empty() || ((fTraits & kTraitEmulatedField) != 0);
587 auto typedValue =
static_cast<const std::vector<char> *
>(from);
596 if (fSubfields[0]->IsSimple() && count) {
597 GetPrincipalColumnOf(*fSubfields[0])->AppendV(
typedValue->data(), count);
598 nbytes += count * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
600 for (
unsigned i = 0; i < count; ++i) {
601 nbytes += CallAppendOn(*fSubfields[0],
typedValue->data() + (i * fItemSize));
606 fPrincipalColumn->Append(&fNWritten);
607 return nbytes + fPrincipalColumn->GetElement()->GetPackedSize();
627 if (!(
itemField.GetTraits() & kTraitTriviallyConstructible)) {
636 auto typedValue =
static_cast<std::vector<char> *
>(to);
642 if (fSubfields[0]->IsSimple()) {
649 ResizeVector(to,
nItems, fItemSize, *fSubfields[0], fItemDeleter.get());
651 for (std::size_t i = 0; i <
nItems; ++i) {
683 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) == 0) {
684 auto substitute = std::make_unique<RArrayAsVectorField>(
685 GetFieldName(), fSubfields[0]->Clone(fSubfields[0]->GetFieldName()),
fieldDesc.GetNRepetitions());
694 EnsureMatchingOnDiskField(desc, kDiffTypeName).ThrowOnError();
704 for (std::size_t i = 0; i <
nItems; ++i) {
705 fItemDeleter->operator()(
vecPtr->data() + (i * fItemSize),
true );
715 return std::make_unique<RVectorDeleter>(fItemSize, GetDeleterOf(*fSubfields[0]));
716 return std::make_unique<RVectorDeleter>();
726 visitor.VisitVectorField(*
this);
739 auto typedValue =
static_cast<const std::vector<bool> *
>(from);
741 for (
unsigned i = 0; i < count; ++i) {
742 bool bval = (*typedValue)[i];
743 CallAppendOn(*fSubfields[0], &
bval);
746 fPrincipalColumn->Append(&fNWritten);
747 return count + fPrincipalColumn->GetElement()->GetPackedSize();
752 auto typedValue =
static_cast<std::vector<bool> *
>(to);
754 if (fOnDiskNRepetitions == 0) {
759 for (std::size_t i = 0; i <
nItems; ++i) {
762 (*typedValue)[i] =
bval;
766 for (std::size_t i = 0; i < fOnDiskNRepetitions; ++i) {
768 CallReadOn(*fSubfields[0],
globalIndex * fOnDiskNRepetitions + i, &
bval);
769 (*typedValue)[i] =
bval;
776 auto typedValue =
static_cast<std::vector<bool> *
>(to);
778 if (fOnDiskNRepetitions == 0) {
783 for (std::size_t i = 0; i <
nItems; ++i) {
786 (*typedValue)[i] =
bval;
790 for (std::size_t i = 0; i < fOnDiskNRepetitions; ++i) {
792 CallReadOn(*fSubfields[0],
localIndex * fOnDiskNRepetitions + i, &
bval);
793 (*typedValue)[i] =
bval;
816 if (fOnDiskNRepetitions == 0)
822 const auto &
fieldDesc = desc.GetFieldDescriptor(GetOnDiskId());
824 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) == 0) {
825 EnsureMatchingOnDiskField(desc, kDiffTypeName | kDiffStructure | kDiffNRepetitions).ThrowOnError();
828 throw RException(
R__FAIL(
"fixed-size array --> std::vector<bool>: expected repetition count > 0\n" +
832 throw RException(
R__FAIL(
"fixed-size array --> std::vector<bool>: expected plain on-disk field\n" +
835 fOnDiskNRepetitions =
fieldDesc.GetNRepetitions();
837 EnsureMatchingOnDiskField(desc, kDiffTypeName).ThrowOnError();
845 std::vector<RValue>
result;
847 for (
unsigned i = 0; i < count; ++i) {
849 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<bool>(
new bool(
true))));
851 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<bool>(
new bool(
false))));
859 visitor.VisitVectorBoolField(*
this);
881 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
882 return std::make_unique<RArrayAsRVecField>(
newName, std::move(
newItemField), fArrayLength);
890 std::int32_t *
sizePtr =
new (
static_cast<void *
>(
beginPtr + 1)) std::int32_t(0);
891 new (
sizePtr + 1) std::int32_t(-1);
897 return std::make_unique<RRVecField::RRVecDeleter>(fSubfields[0]->GetAlignment(), fItemSize,
898 GetDeleterOf(*fSubfields[0]));
900 return std::make_unique<RRVecField::RRVecDeleter>(fSubfields[0]->GetAlignment());
905 auto begin =
RRVecField::ResizeRVec(to, fArrayLength, fItemSize, fSubfields[0].get(), fItemDeleter.get());
907 if (fSubfields[0]->IsSimple()) {
908 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
globalIndex * fArrayLength, fArrayLength, begin);
913 for (std::size_t i = 0; i < fArrayLength; ++i) {
914 CallReadOn(*fSubfields[0],
globalIndex * fArrayLength + i, begin + (i * fItemSize));
920 auto begin =
RRVecField::ResizeRVec(to, fArrayLength, fItemSize, fSubfields[0].get(), fItemDeleter.get());
922 if (fSubfields[0]->IsSimple()) {
923 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
localIndex * fArrayLength, fArrayLength, begin);
928 for (std::size_t i = 0; i < fArrayLength; ++i) {
929 CallReadOn(*fSubfields[0],
localIndex * fArrayLength + i, begin + (i * fItemSize));
935 EnsureMatchingOnDiskField(desc, kDiffTypeName | kDiffTypeVersion | kDiffStructure | kDiffNRepetitions)
938 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) != 0) {
939 throw RException(
R__FAIL(
"RArrayAsRVecField " + GetQualifiedFieldName() +
" expects an on-disk array field\n" +
952 std::vector<ROOT::RFieldBase::RValue>
result;
953 result.reserve(fArrayLength);
954 for (
unsigned i = 0; i < fArrayLength; ++i) {
956 fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(),
arrayPtr + (i * fItemSize))));
963 visitor.VisitArrayAsRVecField(*
this);
984 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
985 return std::make_unique<RArrayAsVectorField>(
newName, std::move(
newItemField), fArrayLength);
990 throw RException(
R__FAIL(
"RArrayAsVectorField fields must only be used for reading"));
996 return std::make_unique<RVectorField::RVectorDeleter>(fItemSize, GetDeleterOf(*fSubfields[0]));
997 return std::make_unique<RVectorField::RVectorDeleter>();
1002 auto typedValue =
static_cast<std::vector<char> *
>(to);
1004 if (fSubfields[0]->IsSimple()) {
1005 typedValue->resize(fArrayLength * fItemSize);
1006 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
globalIndex * fArrayLength, fArrayLength,
typedValue->data());
1012 for (std::size_t i = 0; i < fArrayLength; ++i) {
1019 auto typedValue =
static_cast<std::vector<char> *
>(to);
1021 if (fSubfields[0]->IsSimple()) {
1022 typedValue->resize(fArrayLength * fItemSize);
1023 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
localIndex * fArrayLength, fArrayLength,
typedValue->data());
1029 for (std::size_t i = 0; i < fArrayLength; ++i) {
1030 CallReadOn(*fSubfields[0],
localIndex * fArrayLength + i,
typedValue->data() + (i * fItemSize));
1036 EnsureMatchingOnDiskField(desc, kDiffTypeName | kDiffTypeVersion | kDiffStructure | kDiffNRepetitions);
1039 if (
fieldDesc.GetTypeName().rfind(
"std::array<", 0) != 0) {
1040 throw RException(
R__FAIL(
"RArrayAsVectorField " + GetQualifiedFieldName() +
" expects an on-disk array field\n" +
1052 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::string fTypeAlias
A typedef or using name that was used when creating the field.
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().