18 "std::array<" +
itemField->GetTypeName() +
"," +
30 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
37 if (fSubfields[0]->IsSimple()) {
38 GetPrincipalColumnOf(*fSubfields[0])->AppendV(from, fArrayLength);
39 nbytes += fArrayLength * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
41 auto arrayPtr =
static_cast<const unsigned char *
>(from);
42 for (
unsigned i = 0; i < fArrayLength; ++i) {
43 nbytes += CallAppendOn(*fSubfields[0],
arrayPtr + (i * fItemSize));
51 if (fSubfields[0]->IsSimple()) {
52 GetPrincipalColumnOf(*fSubfields[0])->ReadV(
globalIndex * fArrayLength, fArrayLength, to);
54 auto arrayPtr =
static_cast<unsigned char *
>(to);
55 for (
unsigned i = 0; i < fArrayLength; ++i) {
63 if (fSubfields[0]->IsSimple()) {
64 GetPrincipalColumnOf(*fSubfields[0])
68 auto arrayPtr =
static_cast<unsigned char *
>(to);
69 for (
unsigned i = 0; i < fArrayLength; ++i) {
70 CallReadOn(*fSubfields[0],
79 if (fSubfields[0]->GetTraits() & kTraitTriviallyConstructible)
83 for (
unsigned i = 0; i < fArrayLength; ++i) {
84 CallConstructValueOn(*fSubfields[0],
arrayPtr + (i * fItemSize));
91 for (
unsigned i = 0; i < fArrayLength; ++i) {
92 fItemDeleter->operator()(
reinterpret_cast<unsigned char *
>(
objPtr) + i * fItemSize,
true );
100 if (!(fSubfields[0]->GetTraits() & kTraitTriviallyDestructible))
101 return std::make_unique<RArrayDeleter>(fItemSize, fArrayLength, GetDeleterOf(*fSubfields[0]));
102 return std::make_unique<RDeleter>();
108 std::vector<RValue>
result;
109 result.reserve(fArrayLength);
110 for (
unsigned i = 0; i < fArrayLength; ++i) {
112 fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(),
arrayPtr + (i * fItemSize))));
119 visitor.VisitArrayField(*
this);
130 void **begin =
reinterpret_cast<void **
>(
rvecPtr);
132 std::int32_t *
size =
reinterpret_cast<std::int32_t *
>(begin + 1);
135 std::int32_t *capacity =
size + 1;
137 return {begin,
size, capacity};
159 constexpr auto dataMemberSz =
sizeof(
void *) + 2 *
sizeof(std::int32_t);
163#ifdef R__HAS_HARDWARE_INTERFERENCE_SIZE
165 constexpr unsigned cacheLineSize = std::hardware_destructive_interference_size;
167 constexpr unsigned cacheLineSize = 64u;
170 constexpr unsigned maxInlineByteSize = 1024;
172 elementsPerCacheLine >= 8 ? elementsPerCacheLine : (
sizeOfT * 8 > maxInlineByteSize ? 0 : 8);
194 return std::max({
alignof(
void *),
alignof(std::int32_t),
alignOfSubfield});
201 constexpr auto dataMemberSz =
sizeof(
void *) + 2 *
sizeof(std::int32_t);
208 if (!isSmall &&
owns)
228 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
237 if (fSubfields[0]->IsSimple() && *
sizePtr) {
239 nbytes += *
sizePtr * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
241 auto begin =
reinterpret_cast<const char *
>(*beginPtr);
242 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
243 nbytes += CallAppendOn(*fSubfields[0], begin + i * fItemSize);
248 fPrincipalColumn->Append(&fNWritten);
249 return nbytes + fPrincipalColumn->GetElement()->GetPackedSize();
263 char *begin =
reinterpret_cast<char *
>(*beginPtr);
269 const bool needsConstruct = !(fSubfields[0]->GetTraits() & kTraitTriviallyConstructible);
275 fItemDeleter->operator()(begin + (i * fItemSize),
true );
284 for (std::size_t i = 0
u; i <
oldSize; ++i) {
285 fItemDeleter->operator()(begin + (i * fItemSize),
true );
295 begin =
reinterpret_cast<char *
>(*beginPtr);
300 for (std::size_t i = 0
u; i <
oldSize; ++i)
301 CallConstructValueOn(*fSubfields[0], begin + (i * fItemSize));
309 CallConstructValueOn(*fSubfields[0], begin + (i * fItemSize));
312 if (fSubfields[0]->IsSimple() &&
nItems) {
318 for (std::size_t i = 0; i <
nItems; ++i) {
319 CallReadOn(*fSubfields[0],
collectionStart + i, begin + (i * fItemSize));
325 if (!fSubfields[0]->IsSimple())
331 bulkSpec.fAuxData->resize(
sizeof(std::size_t));
332 *
reinterpret_cast<std::size_t *
>(
bulkSpec.fAuxData->data()) = fSubfields[0]->GetValueSize();
358 for (std::size_t i = 0; i <
nBatch; ++i) {
378 for (std::size_t i = 0; i <
bulkSpec.fCount; ++i) {
385 return RBulkSpec::kAllSet;
413 std::int32_t *
sizePtr =
new (
reinterpret_cast<void *
>(
beginPtr + 1)) std::int32_t(0);
414 new (
sizePtr + 1) std::int32_t(-1);
421 char *begin =
reinterpret_cast<char *
>(*beginPtr);
423 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
424 fItemDeleter->operator()(begin + i * fItemSize,
true );
435 return std::make_unique<RRVecDeleter>(fSubfields[0]->GetAlignment(), fItemSize, GetDeleterOf(*fSubfields[0]));
436 return std::make_unique<RRVecDeleter>(fSubfields[0]->GetAlignment());
443 std::vector<RValue>
result;
444 char *begin =
reinterpret_cast<char *
>(*beginPtr);
446 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
447 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(), begin + i * fItemSize)));
485std::unique_ptr<ROOT::RVectorField>
493 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
494 return std::unique_ptr<ROOT::RVectorField>(
500 auto typedValue =
static_cast<const std::vector<char> *
>(from);
509 if (fSubfields[0]->IsSimple() && count) {
510 GetPrincipalColumnOf(*fSubfields[0])->AppendV(
typedValue->data(), count);
511 nbytes += count * GetPrincipalColumnOf(*fSubfields[0])->GetElement()->GetPackedSize();
513 for (
unsigned i = 0; i < count; ++i) {
514 nbytes += CallAppendOn(*fSubfields[0],
typedValue->data() + (i * fItemSize));
519 fPrincipalColumn->Append(&fNWritten);
520 return nbytes + fPrincipalColumn->GetElement()->GetPackedSize();
525 auto typedValue =
static_cast<std::vector<char> *
>(to);
531 if (fSubfields[0]->IsSimple()) {
546 fItemDeleter->operator()(
typedValue->data() + (i * fItemSize),
true );
550 if (!(fSubfields[0]->GetTraits() & kTraitTriviallyConstructible)) {
552 CallConstructValueOn(*fSubfields[0],
typedValue->data() + (i * fItemSize));
556 for (std::size_t i = 0; i <
nItems; ++i) {
588 for (std::size_t i = 0; i <
nItems; ++i) {
589 fItemDeleter->operator()(
vecPtr->data() + (i * fItemSize),
true );
599 return std::make_unique<RVectorDeleter>(fItemSize, GetDeleterOf(*fSubfields[0]));
600 return std::make_unique<RVectorDeleter>();
605 auto vec =
value.GetPtr<std::vector<char>>();
609 std::vector<RValue>
result;
611 for (
unsigned i = 0; i <
nItems; ++i) {
613 fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(),
vec->data() + (i * fItemSize))));
620 visitor.VisitVectorField(*
this);
633 auto typedValue =
static_cast<const std::vector<bool> *
>(from);
635 for (
unsigned i = 0; i < count; ++i) {
636 bool bval = (*typedValue)[i];
637 CallAppendOn(*fSubfields[0], &
bval);
640 fPrincipalColumn->Append(&fNWritten);
641 return count + fPrincipalColumn->GetElement()->GetPackedSize();
646 auto typedValue =
static_cast<std::vector<bool> *
>(to);
653 for (
unsigned i = 0; i <
nItems; ++i) {
656 (*typedValue)[i] =
bval;
684 std::vector<RValue>
result;
686 for (
unsigned i = 0; i < count; ++i) {
688 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<bool>(
new bool(
true))));
690 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<bool>(
new bool(
false))));
697 visitor.VisitVectorBoolField(*
this);
717 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
718 return std::make_unique<RArrayAsRVecField>(
newName, std::move(
newItemField), fArrayLength);
725 std::int32_t *
sizePtr =
new (
reinterpret_cast<void *
>(
beginPtr + 1)) std::int32_t(0);
730 char *begin =
reinterpret_cast<char *
>(*beginPtr);
733 if (*
sizePtr == std::int32_t(fArrayLength))
740 const bool needsConstruct = !(fSubfields[0]->GetTraits() & kTraitTriviallyConstructible);
746 for (std::int32_t i = 0; i < *
sizePtr; ++i) {
747 fItemDeleter->operator()(begin + (i * fItemSize),
true );
760 begin =
reinterpret_cast<char *
>(*beginPtr);
767 for (std::size_t i = 0; i < fArrayLength; ++i)
768 CallConstructValueOn(*fSubfields[0], begin + (i * fItemSize));
775 return std::make_unique<RRVecField::RRVecDeleter>(fSubfields[0]->GetAlignment(), fItemSize,
776 GetDeleterOf(*fSubfields[0]));
778 return std::make_unique<RRVecField::RRVecDeleter>(fSubfields[0]->GetAlignment());
785 auto rvecBeginPtr =
reinterpret_cast<char *
>(*beginPtr);
787 if (fSubfields[0]->IsSimple()) {
793 for (std::size_t i = 0; i < fArrayLength; ++i) {
801 auto rvecBeginPtr =
reinterpret_cast<char *
>(*beginPtr);
806 if (fSubfields[0]->IsSimple()) {
807 GetPrincipalColumnOf(*fSubfields[0])
813 for (std::size_t i = 0; i < fArrayLength; ++i) {
827 std::vector<ROOT::RFieldBase::RValue>
result;
828 result.reserve(fArrayLength);
829 for (
unsigned i = 0; i < fArrayLength; ++i) {
831 fSubfields[0]->BindValue(std::shared_ptr<void>(
value.GetPtr<
void>(),
arrayPtr + (i * fItemSize))));
838 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().