20 "std::array<" +
itemField->GetTypeName() +
"," +
32 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
39 if (fSubfields[0]->IsSimple()) {
40 GetPrincipalColumnOf(*fSubfields[0])->AppendV(from, fArrayLength);
41 nbytes += fArrayLength * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
43 auto arrayPtr =
static_cast<const unsigned char *
>(from);
44 for (
unsigned i = 0; i < fArrayLength; ++i) {
45 nbytes += CallAppendOn(*fSubfields[0],
arrayPtr + (i * fItemSize));
53 if (fSubfields[0]->IsSimple()) {
54 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
globalIndex * fArrayLength, fArrayLength, to);
56 auto arrayPtr =
static_cast<unsigned char *
>(to);
57 for (
unsigned i = 0; i < fArrayLength; ++i) {
65 if (fSubfields[0]->IsSimple()) {
66 GetPrincipalColumnOf(*fSubfields[0])
70 auto arrayPtr =
static_cast<unsigned char *
>(to);
71 for (
unsigned i = 0; i < fArrayLength; ++i) {
72 CallReadOn(*fSubfields[0],
81 if (fSubfields[0]->GetTraits() & kTraitTriviallyConstructible)
85 for (
unsigned i = 0; i < fArrayLength; ++i) {
86 CallConstructValueOn(*fSubfields[0],
arrayPtr + (i * fItemSize));
93 for (
unsigned i = 0; i < fArrayLength; ++i) {
94 fItemDeleter->operator()(
reinterpret_cast<unsigned char *
>(
objPtr) + i * fItemSize,
true );
102 if (!(fSubfields[0]->GetTraits() & kTraitTriviallyDestructible))
103 return std::make_unique<RArrayDeleter>(fItemSize, fArrayLength, GetDeleterOf(*fSubfields[0]));
104 return std::make_unique<RDeleter>();
110 std::vector<RValue>
result;
111 result.reserve(fArrayLength);
112 for (
unsigned i = 0; i < fArrayLength; ++i) {
114 fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(),
arrayPtr + (i * fItemSize))));
121 visitor.VisitArrayField(*
this);
132 void **begin =
reinterpret_cast<void **
>(
rvecPtr);
134 std::int32_t *
size =
reinterpret_cast<std::int32_t *
>(begin + 1);
137 std::int32_t *capacity =
size + 1;
139 return {begin,
size, capacity};
161 constexpr auto dataMemberSz =
sizeof(
void *) + 2 *
sizeof(std::int32_t);
165#ifdef R__HAS_HARDWARE_INTERFERENCE_SIZE
167 constexpr unsigned cacheLineSize = std::hardware_destructive_interference_size;
169 constexpr unsigned cacheLineSize = 64u;
172 constexpr unsigned maxInlineByteSize = 1024;
174 elementsPerCacheLine >= 8 ? elementsPerCacheLine : (
sizeOfT * 8 > maxInlineByteSize ? 0 : 8);
196 return std::max({
alignof(
void *),
alignof(std::int32_t),
alignOfSubfield});
203 constexpr auto dataMemberSz =
sizeof(
void *) + 2 *
sizeof(std::int32_t);
210 if (!isSmall &&
owns)
230 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
239 if (fSubfields[0]->IsSimple() && *
sizePtr) {
241 nbytes += *
sizePtr * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
243 auto begin =
reinterpret_cast<const char *
>(*beginPtr);
244 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
245 nbytes += CallAppendOn(*fSubfields[0], begin + i * fItemSize);
250 fPrincipalColumn->Append(&fNWritten);
251 return nbytes + fPrincipalColumn->GetElement()->GetPackedSize();
265 char *begin =
reinterpret_cast<char *
>(*beginPtr);
271 const bool needsConstruct = !(fSubfields[0]->GetTraits() & kTraitTriviallyConstructible);
277 fItemDeleter->operator()(begin + (i * fItemSize),
true );
286 for (std::size_t i = 0
u; i <
oldSize; ++i) {
287 fItemDeleter->operator()(begin + (i * fItemSize),
true );
300 begin =
reinterpret_cast<char *
>(*beginPtr);
305 for (std::size_t i = 0
u; i <
oldSize; ++i)
306 CallConstructValueOn(*fSubfields[0], begin + (i * fItemSize));
314 CallConstructValueOn(*fSubfields[0], begin + (i * fItemSize));
317 if (fSubfields[0]->IsSimple() &&
nItems) {
323 for (std::size_t i = 0; i <
nItems; ++i) {
324 CallReadOn(*fSubfields[0],
collectionStart + i, begin + (i * fItemSize));
330 if (!fSubfields[0]->IsSimple())
336 bulkSpec.fAuxData->resize(
sizeof(std::size_t));
337 *
reinterpret_cast<std::size_t *
>(
bulkSpec.fAuxData->data()) = fSubfields[0]->GetValueSize();
363 for (std::size_t i = 0; i <
nBatch; ++i) {
383 for (std::size_t i = 0; i <
bulkSpec.fCount; ++i) {
390 return RBulkSpec::kAllSet;
418 std::int32_t *
sizePtr =
new (
reinterpret_cast<void *
>(
beginPtr + 1)) std::int32_t(0);
419 new (
sizePtr + 1) std::int32_t(-1);
426 char *begin =
reinterpret_cast<char *
>(*beginPtr);
428 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
429 fItemDeleter->operator()(begin + i * fItemSize,
true );
440 return std::make_unique<RRVecDeleter>(fSubfields[0]->GetAlignment(), fItemSize, GetDeleterOf(*fSubfields[0]));
441 return std::make_unique<RRVecDeleter>(fSubfields[0]->GetAlignment());
448 std::vector<RValue>
result;
449 char *begin =
reinterpret_cast<char *
>(*beginPtr);
451 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
452 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(), begin + i * fItemSize)));
490std::unique_ptr<ROOT::RVectorField>
498 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
499 return std::unique_ptr<ROOT::RVectorField>(
505 auto typedValue =
static_cast<const std::vector<char> *
>(from);
514 if (fSubfields[0]->IsSimple() && count) {
515 GetPrincipalColumnOf(*fSubfields[0])->AppendV(
typedValue->data(), count);
516 nbytes += count * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
518 for (
unsigned i = 0; i < count; ++i) {
519 nbytes += CallAppendOn(*fSubfields[0],
typedValue->data() + (i * fItemSize));
524 fPrincipalColumn->Append(&fNWritten);
525 return nbytes + fPrincipalColumn->GetElement()->GetPackedSize();
530 auto typedValue =
static_cast<std::vector<char> *
>(to);
536 if (fSubfields[0]->IsSimple()) {
551 fItemDeleter->operator()(
typedValue->data() + (i * fItemSize),
true );
555 if (!(fSubfields[0]->GetTraits() & kTraitTriviallyConstructible)) {
557 CallConstructValueOn(*fSubfields[0],
typedValue->data() + (i * fItemSize));
561 for (std::size_t i = 0; i <
nItems; ++i) {
593 for (std::size_t i = 0; i <
nItems; ++i) {
594 fItemDeleter->operator()(
vecPtr->data() + (i * fItemSize),
true );
604 return std::make_unique<RVectorDeleter>(fItemSize, GetDeleterOf(*fSubfields[0]));
605 return std::make_unique<RVectorDeleter>();
610 auto vec =
value.GetPtr<std::vector<char>>();
614 std::vector<RValue>
result;
616 for (
unsigned i = 0; i <
nItems; ++i) {
618 fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(),
vec->data() + (i * fItemSize))));
625 visitor.VisitVectorField(*
this);
638 auto typedValue =
static_cast<const std::vector<bool> *
>(from);
640 for (
unsigned i = 0; i < count; ++i) {
641 bool bval = (*typedValue)[i];
642 CallAppendOn(*fSubfields[0], &
bval);
645 fPrincipalColumn->Append(&fNWritten);
646 return count + fPrincipalColumn->GetElement()->GetPackedSize();
651 auto typedValue =
static_cast<std::vector<bool> *
>(to);
658 for (
unsigned i = 0; i <
nItems; ++i) {
661 (*typedValue)[i] =
bval;
689 std::vector<RValue>
result;
691 for (
unsigned i = 0; i < count; ++i) {
693 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<bool>(
new bool(
true))));
695 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<bool>(
new bool(
false))));
702 visitor.VisitVectorBoolField(*
this);
722 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
723 return std::make_unique<RArrayAsRVecField>(
newName, std::move(
newItemField), fArrayLength);
730 std::int32_t *
sizePtr =
new (
reinterpret_cast<void *
>(
beginPtr + 1)) std::int32_t(0);
735 char *begin =
reinterpret_cast<char *
>(*beginPtr);
738 if (*
sizePtr == std::int32_t(fArrayLength))
745 const bool needsConstruct = !(fSubfields[0]->GetTraits() & kTraitTriviallyConstructible);
751 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
752 fItemDeleter->operator()(begin + (i * fItemSize),
true );
765 begin =
reinterpret_cast<char *
>(*beginPtr);
772 for (std::size_t i = 0; i < fArrayLength; ++i)
773 CallConstructValueOn(*fSubfields[0], begin + (i * fItemSize));
780 return std::make_unique<RRVecField::RRVecDeleter>(fSubfields[0]->GetAlignment(), fItemSize,
781 GetDeleterOf(*fSubfields[0]));
783 return std::make_unique<RRVecField::RRVecDeleter>(fSubfields[0]->GetAlignment());
790 auto rvecBeginPtr =
reinterpret_cast<char *
>(*beginPtr);
792 if (fSubfields[0]->IsSimple()) {
798 for (std::size_t i = 0; i < fArrayLength; ++i) {
806 auto rvecBeginPtr =
reinterpret_cast<char *
>(*beginPtr);
811 if (fSubfields[0]->IsSimple()) {
812 GetPrincipalColumnOf(*fSubfields[0])
818 for (std::size_t i = 0; i < fArrayLength; ++i) {
832 std::vector<ROOT::RFieldBase::RValue>
result;
833 result.reserve(fArrayLength);
834 for (
unsigned i = 0; i < fArrayLength; ++i) {
836 fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(),
arrayPtr + (i * fItemSize))));
843 visitor.VisitArrayAsRVecField(*
this);
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.
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.
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...
void operator()(void *objPtr, bool dtorOnly) final
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.
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...
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
The list of column representations a field can have.
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.
@ kTraitTriviallyDestructible
The type is cleaned up just by freeing its memory. I.e. the destructor performs a no-op.
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.
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 ReadBulkImpl(const RBulkSpec &bulkSpec) final
General implementation of bulk read.
RRVecField(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField)
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.
std::unique_ptr< RDeleter > fItemDeleter
const RColumnRepresentations & GetColumnRepresentations() const final
Implementations in derived classes should return a static RColumnRepresentations object.
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 ...
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
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
RVectorField(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField, bool isUntyped)
std::string GetNormalizedInteger(const std::string &intTemplateArg)
Appends 'll' or 'ull' to the where necessary and strips the suffix if not needed.
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
std::uint64_t NTupleSize_t
Integer type long enough to hold the maximum number of entries in a column.
ENTupleStructure
The fields in the ntuple model tree can carry different structural information about the type system.
Input parameter to RFieldBase::ReadBulk() and RFieldBase::ReadBulkImpl().