38 #include <type_traits>
40 #if __cplusplus >= 201703L
49 namespace Experimental {
51 class RCollectionNTuple;
53 class RFieldCollection;
75 friend class ROOT::Experimental::Detail::RFieldFuse;
76 friend class ROOT::Experimental::RFieldCollection;
83 ENTupleStructure fStructure;
85 std::size_t fNRepetitions;
96 int fNumSiblingFields = 1;
98 RLevelInfo() =
default;
99 RLevelInfo(
const RFieldBase *field) : RLevelInfo() {
100 fLevel = GetLevel(field);
101 fOrder = GetOrder(field);
102 fNumSiblingFields = GetNumSiblings(field);
104 int GetNumSiblings(
const RFieldBase *field =
nullptr)
const {
105 if (field && field->GetParent())
106 return static_cast<int>(field->GetParent()->fSubFields.size());
107 return fNumSiblingFields;
109 int GetLevel(
const RFieldBase *field =
nullptr)
const {
113 const RFieldBase *parentPtr{field->GetParent()};
115 parentPtr = parentPtr->GetParent();
120 int GetOrder(
const RFieldBase *field =
nullptr)
const {
122 return field->fOrder;
130 std::vector<std::unique_ptr<RFieldBase>> fSubFields;
136 RColumn* fPrincipalColumn;
138 std::vector<std::unique_ptr<RColumn>> fColumns;
141 virtual void DoGenerateColumns() = 0;
145 virtual void DoAppend(
const RFieldValue &value);
146 virtual void DoReadGlobal(NTupleSize_t globalIndex, RFieldValue *value);
147 virtual void DoReadInCluster(
const RClusterIndex &clusterIndex, RFieldValue *value) {
148 DoReadGlobal(fPrincipalColumn->GetGlobalIndex(clusterIndex), value);
153 class RIterator :
public std::iterator<std::forward_iterator_tag, Detail::RFieldBase> {
155 using iterator = RIterator;
157 Position() : fFieldPtr(nullptr), fIdxInParent(-1) { }
158 Position(pointer fieldPtr,
int idxInParent) : fFieldPtr(fieldPtr), fIdxInParent(idxInParent) { }
163 std::vector<Position> fStack;
165 RIterator() { fStack.emplace_back(Position()); }
166 RIterator(pointer val,
int idxInParent) { fStack.emplace_back(Position(val, idxInParent)); }
172 iterator operator++(
int) {
auto r = *
this; Advance();
return r; }
173 iterator& operator++() { Advance();
return *
this; }
174 reference operator* ()
const {
return *fStack.back().fFieldPtr; }
175 pointer operator->()
const {
return fStack.back().fFieldPtr; }
176 bool operator==(
const iterator& rh)
const {
return fStack.back().fFieldPtr == rh.fStack.back().fFieldPtr; }
177 bool operator!=(
const iterator& rh)
const {
return fStack.back().fFieldPtr != rh.fStack.back().fFieldPtr; }
181 RFieldBase(std::string_view name, std::string_view type, ENTupleStructure structure,
bool isSimple,
182 std::size_t nRepetitions = 0);
183 RFieldBase(
const RFieldBase&) =
delete;
184 RFieldBase(RFieldBase&&) =
default;
185 RFieldBase& operator =(
const RFieldBase&) =
delete;
186 RFieldBase& operator =(RFieldBase&&) =
default;
187 virtual ~RFieldBase();
190 virtual RFieldBase *Clone(std::string_view newName) = 0;
193 static RFieldBase *Create(
const std::string &fieldName,
const std::string &typeName);
196 RFieldValue GenerateValue();
199 virtual RFieldValue GenerateValue(
void *where) = 0;
202 virtual void DestroyValue(
const RFieldValue &value,
bool dtorOnly =
false);
204 virtual RFieldValue CaptureValue(
void *where) = 0;
206 virtual size_t GetValueSize()
const = 0;
208 virtual size_t GetAlignment()
const {
return GetValueSize(); }
211 void Append(
const RFieldValue& value) {
217 fPrincipalColumn->Append(value.fMappedElement);
222 void Read(NTupleSize_t globalIndex, RFieldValue *value) {
224 DoReadGlobal(globalIndex, value);
227 fPrincipalColumn->Read(globalIndex, &value->fMappedElement);
230 void Read(
const RClusterIndex &clusterIndex, RFieldValue *value) {
232 DoReadInCluster(clusterIndex, value);
235 fPrincipalColumn->Read(clusterIndex, &value->fMappedElement);
241 virtual void CommitCluster() {}
243 void Attach(std::unique_ptr<Detail::RFieldBase> child);
245 std::string GetName()
const {
return fName; }
246 std::string GetType()
const {
return fType; }
247 ENTupleStructure GetStructure()
const {
return fStructure; }
248 std::size_t GetNRepetitions()
const {
return fNRepetitions; }
249 const RFieldBase* GetParent()
const {
return fParent; }
250 bool IsSimple()
const {
return fIsSimple; }
253 virtual RNTupleVersion GetFieldVersion()
const {
return RNTupleVersion(); }
255 virtual RNTupleVersion GetTypeVersion()
const {
return RNTupleVersion(); }
261 virtual void TraverseVisitor(RNTupleVisitor &visitor,
int level = 0)
const;
262 virtual void AcceptVisitor(RNTupleVisitor &visitor,
int level)
const;
264 RLevelInfo GetLevelInfo()
const {
265 return RLevelInfo(
this);
267 void SetOrder(
int o) { fOrder = o; }
282 static void Connect(DescriptorId_t fieldId, RPageStorage &pageStorage, RFieldBase &field);
290 class RFieldRoot :
public Detail::RFieldBase {
292 RFieldRoot() : Detail::RFieldBase(
"",
"", ENTupleStructure::kRecord, false ) { SetOrder(-1); }
293 RFieldBase* Clone(std::string_view newName);
295 void DoGenerateColumns() final {}
296 using Detail::RFieldBase::GenerateValue;
297 Detail::RFieldValue GenerateValue(
void*) {
return Detail::RFieldValue(); }
298 Detail::RFieldValue CaptureValue(
void*) final {
return Detail::RFieldValue(); }
299 size_t GetValueSize() const final {
return 0; }
302 REntry* GenerateEntry();
303 void AcceptVisitor(Detail::RNTupleVisitor &visitor,
int level)
const final;
307 class RFieldClass :
public Detail::RFieldBase {
310 std::size_t fMaxAlignment = 1;
313 void DoAppend(
const Detail::RFieldValue& value)
final;
314 void DoReadGlobal(NTupleSize_t globalIndex, Detail::RFieldValue *value)
final;
315 void DoReadInCluster(
const RClusterIndex &clusterIndex, Detail::RFieldValue *value)
final;
317 RFieldClass(std::string_view fieldName, std::string_view className);
318 RFieldClass(RFieldClass&& other) =
default;
319 RFieldClass& operator =(RFieldClass&& other) =
default;
320 ~RFieldClass() =
default;
321 RFieldBase* Clone(std::string_view newName)
final;
323 void DoGenerateColumns() final;
324 using Detail::RFieldBase::GenerateValue;
325 Detail::RFieldValue GenerateValue(
void* where) override;
326 void DestroyValue(const Detail::RFieldValue& value,
bool dtorOnly = false) final;
327 Detail::RFieldValue CaptureValue(
void *where) final;
328 size_t GetValueSize() const override;
329 size_t GetAlignment() const final {
return fMaxAlignment; }
333 class RFieldVector :
public Detail::RFieldBase {
335 std::size_t fItemSize;
336 ClusterSize_t fNWritten;
339 void DoAppend(
const Detail::RFieldValue& value)
final;
340 void DoReadGlobal(NTupleSize_t globalIndex, Detail::RFieldValue *value)
final;
343 RFieldVector(std::string_view fieldName, std::unique_ptr<Detail::RFieldBase> itemField);
344 RFieldVector(RFieldVector&& other) =
default;
345 RFieldVector& operator =(RFieldVector&& other) =
default;
346 ~RFieldVector() =
default;
347 RFieldBase* Clone(std::string_view newName)
final;
349 void DoGenerateColumns() final;
350 using Detail::RFieldBase::GenerateValue;
351 Detail::RFieldValue GenerateValue(
void* where) override;
352 void DestroyValue(const Detail::RFieldValue& value,
bool dtorOnly = false) final;
353 Detail::RFieldValue CaptureValue(
void *where) override;
354 size_t GetValueSize()
const override {
return sizeof(std::vector<char>); }
355 size_t GetAlignment() const final {
return std::alignment_of<std::vector<char>>(); }
356 void CommitCluster() final;
361 class RFieldArray : public Detail::RFieldBase {
363 std::size_t fItemSize;
364 std::size_t fArrayLength;
367 void DoAppend(
const Detail::RFieldValue& value)
final;
368 void DoReadGlobal(NTupleSize_t globalIndex, Detail::RFieldValue *value)
final;
369 void DoReadInCluster(
const RClusterIndex &clusterIndex, Detail::RFieldValue *value)
final;
372 RFieldArray(std::string_view fieldName, std::unique_ptr<Detail::RFieldBase> itemField, std::size_t arrayLength);
373 RFieldArray(RFieldArray &&other) =
default;
374 RFieldArray& operator =(RFieldArray &&other) =
default;
375 ~RFieldArray() =
default;
376 RFieldBase *Clone(std::string_view newName)
final;
378 void DoGenerateColumns() final;
379 using Detail::RFieldBase::GenerateValue;
380 Detail::RFieldValue GenerateValue(
void *where) override;
381 void DestroyValue(const Detail::RFieldValue &value,
bool dtorOnly = false) final;
382 Detail::RFieldValue CaptureValue(
void *where) final;
383 size_t GetValueSize() const final {
return fItemSize * fArrayLength; }
384 size_t GetAlignment() const final {
return fSubFields[0]->GetAlignment(); }
387 #if __cplusplus >= 201703L
389 class RFieldVariant :
public Detail::RFieldBase {
391 size_t fMaxItemSize = 0;
392 size_t fMaxAlignment = 1;
394 size_t fTagOffset = 0;
395 std::vector<ClusterSize_t::ValueType> fNWritten;
397 static std::string GetTypeList(
const std::vector<Detail::RFieldBase *> &itemFields);
399 std::uint32_t GetTag(
void *variantPtr)
const;
400 void SetTag(
void *variantPtr, std::uint32_t tag)
const;
403 void DoAppend(
const Detail::RFieldValue& value)
final;
404 void DoReadGlobal(NTupleSize_t globalIndex, Detail::RFieldValue *value)
final;
408 RFieldVariant(std::string_view fieldName,
const std::vector<Detail::RFieldBase *> &itemFields);
409 RFieldVariant(RFieldVariant &&other) =
default;
410 RFieldVariant& operator =(RFieldVariant &&other) =
default;
411 ~RFieldVariant() =
default;
412 RFieldBase *Clone(std::string_view newName)
final;
414 void DoGenerateColumns() final;
415 using Detail::RFieldBase::GenerateValue;
416 Detail::RFieldValue GenerateValue(
void *where) override;
417 void DestroyValue(const Detail::RFieldValue &value,
bool dtorOnly = false) final;
418 Detail::RFieldValue CaptureValue(
void *where) final;
419 size_t GetValueSize() const final;
420 size_t GetAlignment() const final {
return fMaxAlignment; }
421 void CommitCluster() final;
427 template <
typename T,
typename=
void>
428 class RField :
public RFieldClass {
430 static std::string TypeName() {
return ROOT::Internal::GetDemangledTypeName(
typeid(T)); }
431 RField(std::string_view name) : RFieldClass(name, TypeName()) {
432 static_assert(std::is_class<T>::value,
"no I/O support for this basic C++ type");
434 RField(RField&& other) =
default;
435 RField& operator =(RField&& other) =
default;
438 using Detail::RFieldBase::GenerateValue;
439 template <
typename... ArgsT>
440 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where, ArgsT&&... args)
442 return Detail::RFieldValue(
this, static_cast<T*>(where), std::forward<ArgsT>(args)...);
444 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where)
final {
return GenerateValue(where, T()); }
448 class RFieldCollection :
public ROOT::Experimental::Detail::RFieldBase {
451 std::shared_ptr<RCollectionNTuple> fCollectionNTuple;
453 static std::string TypeName() {
return ":RFieldCollection:"; }
454 RFieldCollection(std::string_view name,
455 std::shared_ptr<RCollectionNTuple> collectionNTuple,
456 std::unique_ptr<RNTupleModel> collectionModel);
457 RFieldCollection(RFieldCollection&& other) =
default;
458 RFieldCollection& operator =(RFieldCollection&& other) =
default;
459 ~RFieldCollection() =
default;
460 RFieldBase* Clone(std::string_view newName)
final;
462 void DoGenerateColumns() final;
464 using Detail::RFieldBase::GenerateValue;
465 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where) final {
466 return Detail::RFieldValue(
467 Detail::RColumnElement<ClusterSize_t, EColumnType::kIndex>(static_cast<ClusterSize_t*>(where)),
468 this, static_cast<ClusterSize_t*>(where));
470 Detail::RFieldValue CaptureValue(
void* where)
final {
471 return Detail::RFieldValue(
true ,
472 Detail::RColumnElement<ClusterSize_t, EColumnType::kIndex>(static_cast<ClusterSize_t*>(where)),
this, where);
474 size_t GetValueSize() const final {
return 0; }
475 void CommitCluster() final;
483 class RField<ClusterSize_t> : public Detail::RFieldBase {
485 static std::string TypeName() {
return "ROOT::Experimental::ClusterSize_t"; }
486 explicit RField(std::string_view name)
487 : Detail::RFieldBase(name, TypeName(), ENTupleStructure::kLeaf, true ) {}
488 RField(RField&& other) =
default;
489 RField& operator =(RField&& other) =
default;
491 RFieldBase* Clone(std::string_view newName)
final {
return new RField(newName); }
493 void DoGenerateColumns() final;
495 ClusterSize_t *Map(NTupleSize_t globalIndex) {
496 return fPrincipalColumn->Map<ClusterSize_t, EColumnType::kIndex>(globalIndex);
498 ClusterSize_t *Map(
const RClusterIndex &clusterIndex) {
499 return fPrincipalColumn->Map<ClusterSize_t, EColumnType::kIndex>(clusterIndex);
502 using Detail::RFieldBase::GenerateValue;
503 template <
typename... ArgsT>
504 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where, ArgsT&&... args)
506 return Detail::RFieldValue(
507 Detail::RColumnElement<ClusterSize_t, EColumnType::kIndex>(static_cast<ClusterSize_t*>(where)),
508 this, static_cast<ClusterSize_t*>(where), std::forward<ArgsT>(args)...);
510 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where)
final {
return GenerateValue(where, 0); }
511 Detail::RFieldValue CaptureValue(
void *where)
final {
512 return Detail::RFieldValue(
true ,
513 Detail::RColumnElement<ClusterSize_t, EColumnType::kIndex>(static_cast<ClusterSize_t*>(where)),
this, where);
515 size_t GetValueSize() const final {
return sizeof(ClusterSize_t); }
518 void GetCollectionInfo(NTupleSize_t globalIndex, RClusterIndex *collectionStart, ClusterSize_t *size) {
519 fPrincipalColumn->GetCollectionInfo(globalIndex, collectionStart, size);
521 void GetCollectionInfo(
const RClusterIndex &clusterIndex, RClusterIndex *collectionStart, ClusterSize_t *size) {
522 fPrincipalColumn->GetCollectionInfo(clusterIndex, collectionStart, size);
528 class RField<bool> :
public Detail::RFieldBase {
530 static std::string TypeName() {
return "bool"; }
531 explicit RField(std::string_view name)
532 : Detail::RFieldBase(name, TypeName(), ENTupleStructure::kLeaf, true ) {}
533 RField(RField&& other) =
default;
534 RField& operator =(RField&& other) =
default;
536 RFieldBase *Clone(std::string_view newName)
final {
return new RField(newName); }
538 void DoGenerateColumns() final;
540 bool *Map(NTupleSize_t globalIndex) {
541 return fPrincipalColumn->Map<bool, EColumnType::kBit>(globalIndex);
543 bool *Map(
const RClusterIndex &clusterIndex) {
544 return fPrincipalColumn->Map<bool, EColumnType::kBit>(clusterIndex);
547 using Detail::RFieldBase::GenerateValue;
548 template <
typename... ArgsT>
549 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where, ArgsT&&... args)
551 return Detail::RFieldValue(
552 Detail::RColumnElement<bool, EColumnType::kBit>(static_cast<bool*>(where)),
553 this, static_cast<bool*>(where), std::forward<ArgsT>(args)...);
555 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where)
final {
return GenerateValue(where,
false); }
556 Detail::RFieldValue CaptureValue(
void *where)
final {
557 return Detail::RFieldValue(
true ,
558 Detail::RColumnElement<bool, EColumnType::kBit>(static_cast<bool*>(where)),
this, where);
560 size_t GetValueSize() const final {
return sizeof(bool); }
564 class RField<float> :
public Detail::RFieldBase {
566 static std::string TypeName() {
return "float"; }
567 explicit RField(std::string_view name)
568 : Detail::RFieldBase(name, TypeName(), ENTupleStructure::kLeaf, true ) {}
569 RField(RField&& other) =
default;
570 RField& operator =(RField&& other) =
default;
572 RFieldBase* Clone(std::string_view newName)
final {
return new RField(newName); }
574 void DoGenerateColumns() final;
576 float *Map(NTupleSize_t globalIndex) {
577 return fPrincipalColumn->Map<float, EColumnType::kReal32>(globalIndex);
579 float *Map(
const RClusterIndex &clusterIndex) {
580 return fPrincipalColumn->Map<float, EColumnType::kReal32>(clusterIndex);
583 using Detail::RFieldBase::GenerateValue;
584 template <
typename... ArgsT>
585 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where, ArgsT&&... args)
587 return Detail::RFieldValue(
588 Detail::RColumnElement<float, EColumnType::kReal32>(static_cast<float*>(where)),
589 this, static_cast<float*>(where), std::forward<ArgsT>(args)...);
591 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where)
final {
return GenerateValue(where, 0.0); }
592 Detail::RFieldValue CaptureValue(
void *where)
final {
593 return Detail::RFieldValue(
true ,
594 Detail::RColumnElement<float, EColumnType::kReal32>(static_cast<float*>(where)),
this, where);
596 size_t GetValueSize() const final {
return sizeof(float); }
601 class RField<double> :
public Detail::RFieldBase {
603 static std::string TypeName() {
return "double"; }
604 explicit RField(std::string_view name)
605 : Detail::RFieldBase(name, TypeName(), ENTupleStructure::kLeaf, true ) {}
606 RField(RField&& other) =
default;
607 RField& operator =(RField&& other) =
default;
609 RFieldBase* Clone(std::string_view newName)
final {
return new RField(newName); }
611 void DoGenerateColumns() final;
613 double *Map(NTupleSize_t globalIndex) {
614 return fPrincipalColumn->Map<double, EColumnType::kReal64>(globalIndex);
616 double *Map(
const RClusterIndex &clusterIndex) {
617 return fPrincipalColumn->Map<double, EColumnType::kReal64>(clusterIndex);
620 using Detail::RFieldBase::GenerateValue;
621 template <
typename... ArgsT>
622 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where, ArgsT&&... args)
624 return Detail::RFieldValue(
625 Detail::RColumnElement<double, EColumnType::kReal64>(static_cast<double*>(where)),
626 this, static_cast<double*>(where), std::forward<ArgsT>(args)...);
628 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where)
final {
return GenerateValue(where, 0.0); }
629 Detail::RFieldValue CaptureValue(
void *where)
final {
630 return Detail::RFieldValue(
true ,
631 Detail::RColumnElement<double, EColumnType::kReal64>(static_cast<double*>(where)),
this, where);
633 size_t GetValueSize() const final {
return sizeof(double); }
637 class RField<std::uint8_t> :
public Detail::RFieldBase {
639 static std::string TypeName() {
return "std::uint8_t"; }
640 explicit RField(std::string_view name)
641 : Detail::RFieldBase(name, TypeName(), ENTupleStructure::kLeaf, true ) {}
642 RField(RField&& other) =
default;
643 RField& operator =(RField&& other) =
default;
645 RFieldBase* Clone(std::string_view newName)
final {
return new RField(newName); }
647 void DoGenerateColumns() final;
649 std::uint8_t *Map(NTupleSize_t globalIndex) {
650 return fPrincipalColumn->Map<std::uint8_t, EColumnType::kByte>(globalIndex);
652 std::uint8_t *Map(
const RClusterIndex &clusterIndex) {
653 return fPrincipalColumn->Map<std::uint8_t, EColumnType::kByte>(clusterIndex);
656 using Detail::RFieldBase::GenerateValue;
657 template <
typename... ArgsT>
658 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void *where, ArgsT&&... args)
660 return Detail::RFieldValue(
661 Detail::RColumnElement<std::uint8_t, EColumnType::kByte>(static_cast<std::uint8_t*>(where)),
662 this, static_cast<std::uint8_t*>(where), std::forward<ArgsT>(args)...);
664 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void *where)
final {
return GenerateValue(where, 0); }
665 Detail::RFieldValue CaptureValue(
void *where)
final {
666 return Detail::RFieldValue(
true ,
667 Detail::RColumnElement<std::uint8_t, EColumnType::kByte>(static_cast<std::uint8_t*>(where)),
this, where);
669 size_t GetValueSize() const final {
return sizeof(std::uint8_t); }
673 class RField<std::int32_t> :
public Detail::RFieldBase {
675 static std::string TypeName() {
return "std::int32_t"; }
676 explicit RField(std::string_view name)
677 : Detail::RFieldBase(name, TypeName(), ENTupleStructure::kLeaf, true ) {}
678 RField(RField&& other) =
default;
679 RField& operator =(RField&& other) =
default;
681 RFieldBase* Clone(std::string_view newName)
final {
return new RField(newName); }
683 void DoGenerateColumns() final;
685 std::int32_t *Map(NTupleSize_t globalIndex) {
686 return fPrincipalColumn->Map<std::int32_t, EColumnType::kInt32>(globalIndex);
688 std::int32_t *Map(
const RClusterIndex &clusterIndex) {
689 return fPrincipalColumn->Map<std::int32_t, EColumnType::kInt32>(clusterIndex);
692 using Detail::RFieldBase::GenerateValue;
693 template <
typename... ArgsT>
694 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where, ArgsT&&... args)
696 return Detail::RFieldValue(
697 Detail::RColumnElement<std::int32_t, EColumnType::kInt32>(static_cast<std::int32_t*>(where)),
698 this, static_cast<std::int32_t*>(where), std::forward<ArgsT>(args)...);
700 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where)
final {
return GenerateValue(where, 0); }
701 Detail::RFieldValue CaptureValue(
void *where)
final {
702 return Detail::RFieldValue(
true ,
703 Detail::RColumnElement<std::int32_t, EColumnType::kInt32>(static_cast<std::int32_t*>(where)),
this, where);
705 size_t GetValueSize() const final {
return sizeof(std::int32_t); }
709 class RField<std::uint32_t> :
public Detail::RFieldBase {
711 static std::string TypeName() {
return "std::uint32_t"; }
712 explicit RField(std::string_view name)
713 : Detail::RFieldBase(name, TypeName(), ENTupleStructure::kLeaf, true ) {}
714 RField(RField&& other) =
default;
715 RField& operator =(RField&& other) =
default;
717 RFieldBase* Clone(std::string_view newName)
final {
return new RField(newName); }
719 void DoGenerateColumns() final;
721 std::uint32_t *Map(NTupleSize_t globalIndex) {
722 return fPrincipalColumn->Map<std::uint32_t, EColumnType::kInt32>(globalIndex);
724 std::uint32_t *Map(
const RClusterIndex clusterIndex) {
725 return fPrincipalColumn->Map<std::uint32_t, EColumnType::kInt32>(clusterIndex);
728 using Detail::RFieldBase::GenerateValue;
729 template <
typename... ArgsT>
730 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where, ArgsT&&... args)
732 return Detail::RFieldValue(
733 Detail::RColumnElement<std::uint32_t, EColumnType::kInt32>(static_cast<std::uint32_t*>(where)),
734 this, static_cast<std::uint32_t*>(where), std::forward<ArgsT>(args)...);
736 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where)
final {
return GenerateValue(where, 0); }
737 Detail::RFieldValue CaptureValue(
void *where)
final {
738 return Detail::RFieldValue(
true ,
739 Detail::RColumnElement<std::uint32_t, EColumnType::kInt32>(static_cast<std::uint32_t*>(where)),
this, where);
741 size_t GetValueSize() const final {
return sizeof(std::uint32_t); }
745 class RField<std::uint64_t> :
public Detail::RFieldBase {
747 static std::string TypeName() {
return "std::uint64_t"; }
748 explicit RField(std::string_view name)
749 : Detail::RFieldBase(name, TypeName(), ENTupleStructure::kLeaf, true ) {}
750 RField(RField&& other) =
default;
751 RField& operator =(RField&& other) =
default;
753 RFieldBase* Clone(std::string_view newName)
final {
return new RField(newName); }
755 void DoGenerateColumns() final;
757 std::uint64_t *Map(NTupleSize_t globalIndex) {
758 return fPrincipalColumn->Map<std::uint64_t, EColumnType::kInt64>(globalIndex);
760 std::uint64_t *Map(
const RClusterIndex &clusterIndex) {
761 return fPrincipalColumn->Map<std::uint64_t, EColumnType::kInt64>(clusterIndex);
764 using Detail::RFieldBase::GenerateValue;
765 template <
typename... ArgsT>
766 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where, ArgsT&&... args)
768 return Detail::RFieldValue(
769 Detail::RColumnElement<std::uint64_t, EColumnType::kInt64>(static_cast<std::uint64_t*>(where)),
770 this, static_cast<std::uint64_t*>(where), std::forward<ArgsT>(args)...);
772 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where)
final {
return GenerateValue(where, 0); }
773 Detail::RFieldValue CaptureValue(
void *where)
final {
774 return Detail::RFieldValue(
true ,
775 Detail::RColumnElement<std::uint64_t, EColumnType::kInt64>(static_cast<std::uint64_t*>(where)),
this, where);
777 size_t GetValueSize() const final {
return sizeof(std::uint64_t); }
782 class RField<std::string> :
public Detail::RFieldBase {
784 ClusterSize_t fIndex;
785 Detail::RColumnElement<ClusterSize_t, EColumnType::kIndex> fElemIndex;
787 void DoAppend(
const ROOT::Experimental::Detail::RFieldValue& value)
final;
788 void DoReadGlobal(ROOT::Experimental::NTupleSize_t globalIndex,
789 ROOT::Experimental::Detail::RFieldValue *value)
final;
792 static std::string TypeName() {
return "std::string"; }
793 explicit RField(std::string_view name)
794 : Detail::RFieldBase(name, TypeName(), ENTupleStructure::kLeaf, false )
795 , fIndex(0), fElemIndex(&fIndex) {}
796 RField(RField&& other) =
default;
797 RField& operator =(RField&& other) =
default;
799 RFieldBase* Clone(std::string_view newName)
final {
return new RField(newName); }
801 void DoGenerateColumns() final;
803 using Detail::RFieldBase::GenerateValue;
804 template <typename... ArgsT>
805 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where, ArgsT&&... args)
807 return Detail::RFieldValue(
this, static_cast<std::string*>(where), std::forward<ArgsT>(args)...);
809 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where)
final {
return GenerateValue(where,
""); }
810 void DestroyValue(
const Detail::RFieldValue& value,
bool dtorOnly =
false) {
811 auto str = value.Get<std::string>();
812 str->~basic_string();
816 Detail::RFieldValue CaptureValue(
void *where) {
817 return Detail::RFieldValue(
true ,
this, where);
819 size_t GetValueSize() const final {
return sizeof(std::string); }
820 size_t GetAlignment() const final {
return std::alignment_of<std::string>(); }
821 void CommitCluster() final;
825 template <typename ItemT, std::
size_t N>
826 class RField<std::array<ItemT, N>> : public RFieldArray {
827 using ContainerT =
typename std::array<ItemT, N>;
829 static std::string TypeName() {
830 return "std::array<" + RField<ItemT>::TypeName() +
"," + std::to_string(N) +
">";
832 explicit RField(std::string_view name)
833 : RFieldArray(name, std::make_unique<RField<ItemT>>(RField<ItemT>::TypeName()), N)
835 RField(RField&& other) =
default;
836 RField& operator =(RField&& other) =
default;
839 using Detail::RFieldBase::GenerateValue;
840 template <
typename... ArgsT>
841 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void *where, ArgsT&&... args)
843 return Detail::RFieldValue(
this, static_cast<ContainerT*>(where), std::forward<ArgsT>(args)...);
845 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void *where)
final {
846 return GenerateValue(where, ContainerT());
851 #if __cplusplus >= 201703L
852 template <
typename... ItemTs>
853 class RField<std::variant<ItemTs...>> :
public RFieldVariant {
854 using ContainerT =
typename std::variant<ItemTs...>;
856 template <
typename HeadT,
typename... TailTs>
857 static std::string BuildItemTypes()
859 std::string result = RField<HeadT>::TypeName();
860 if constexpr(
sizeof...(TailTs) > 0)
861 result += "," + BuildItemTypes<TailTs...>();
865 template <typename HeadT, typename... TailTs>
866 static std::vector<Detail::RFieldBase *> BuildItemFields(
unsigned int index = 0)
868 std::vector<Detail::RFieldBase *> result;
869 result.emplace_back(
new RField<HeadT>(
"variant" + std::to_string(index)));
870 if constexpr(
sizeof...(TailTs) > 0) {
871 auto tailFields = BuildItemFields<TailTs...>(index + 1);
872 result.insert(result.end(), tailFields.begin(), tailFields.end());
878 static std::string TypeName() {
return "std::variant<" + BuildItemTypes<ItemTs...>() +
">"; }
879 explicit RField(std::string_view name) : RFieldVariant(name, BuildItemFields<ItemTs...>()) {}
880 RField(RField&& other) =
default;
881 RField& operator =(RField&& other) =
default;
884 using Detail::RFieldBase::GenerateValue;
885 template <
typename... ArgsT>
886 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void *where, ArgsT&&... args)
888 return Detail::RFieldValue(
this, static_cast<ContainerT*>(where), std::forward<ArgsT>(args)...);
890 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void *where)
final {
891 return GenerateValue(where, ContainerT());
896 template <
typename ItemT>
897 class RField<std::vector<ItemT>> :
public RFieldVector {
898 using ContainerT =
typename std::vector<ItemT>;
900 static std::string TypeName() {
return "std::vector<" + RField<ItemT>::TypeName() +
">"; }
901 explicit RField(std::string_view name)
902 : RFieldVector(name, std::make_unique<RField<ItemT>>(RField<ItemT>::TypeName()))
904 RField(RField&& other) =
default;
905 RField& operator =(RField&& other) =
default;
908 using Detail::RFieldBase::GenerateValue;
909 template <
typename... ArgsT>
910 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where, ArgsT&&... args)
912 return Detail::RFieldValue(
this, static_cast<ContainerT*>(where), std::forward<ArgsT>(args)...);
914 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where)
final {
915 return GenerateValue(where, ContainerT());
917 Detail::RFieldValue CaptureValue(
void *where)
final {
918 return Detail::RFieldValue(
true ,
this, where);
920 size_t GetValueSize() const final {
return sizeof(ContainerT); }
925 class RField<std::vector<bool>> :
public Detail::RFieldBase {
927 ClusterSize_t fNWritten{0};
930 void DoAppend(
const Detail::RFieldValue& value)
final;
931 void DoReadGlobal(NTupleSize_t globalIndex, Detail::RFieldValue *value)
final;
932 void DoGenerateColumns() final;
935 static std::
string TypeName() {
return "std::vector<bool>"; }
936 explicit RField(std::string_view name);
937 RField(RField&& other) =
default;
938 RField& operator =(RField&& other) =
default;
940 RFieldBase* Clone(std::string_view newName)
final {
return new RField(newName); }
942 using Detail::RFieldBase::GenerateValue;
943 template <
typename... ArgsT>
944 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where, ArgsT&&... args)
946 return Detail::RFieldValue(
this,
static_cast<std::vector<bool>*
>(where), std::forward<ArgsT>(args)...);
948 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where)
final {
949 return GenerateValue(where, std::vector<bool>());
951 Detail::RFieldValue CaptureValue(
void *where)
final {
952 return Detail::RFieldValue(
true ,
this, where);
954 void DestroyValue(
const Detail::RFieldValue& value,
bool dtorOnly =
false) final;
956 size_t GetValueSize() const final {
return sizeof(std::vector<bool>); }
957 size_t GetAlignment() const final {
return std::alignment_of<std::vector<bool>>(); }
958 void CommitCluster() final { fNWritten = 0; }
966 template <
typename ItemT>
967 class RField<ROOT::VecOps::RVec<ItemT>> :
public Detail::RFieldBase {
968 using ContainerT =
typename ROOT::VecOps::RVec<ItemT>;
971 ClusterSize_t fNWritten;
974 void DoAppend(
const Detail::RFieldValue& value)
final {
975 auto typedValue = value.Get<ContainerT>();
976 auto count = typedValue->size();
977 for (
unsigned i = 0; i < count; ++i) {
978 auto itemValue = fSubFields[0]->CaptureValue(&typedValue->data()[i]);
979 fSubFields[0]->Append(itemValue);
981 Detail::RColumnElement<ClusterSize_t, EColumnType::kIndex> elemIndex(&fNWritten);
983 fColumns[0]->Append(elemIndex);
985 void DoReadGlobal(NTupleSize_t globalIndex, Detail::RFieldValue *value)
final {
986 auto typedValue = value->Get<ContainerT>();
987 ClusterSize_t nItems;
988 RClusterIndex collectionStart;
989 fPrincipalColumn->GetCollectionInfo(globalIndex, &collectionStart, &nItems);
990 typedValue->resize(nItems);
991 for (
unsigned i = 0; i < nItems; ++i) {
992 auto itemValue = fSubFields[0]->GenerateValue(&typedValue->data()[i]);
993 fSubFields[0]->Read(collectionStart + i, &itemValue);
998 RField(std::string_view fieldName, std::unique_ptr<Detail::RFieldBase> itemField)
999 : ROOT::Experimental::Detail::RFieldBase(
1000 fieldName,
"ROOT::VecOps::RVec<" + itemField->GetType() +
">", ENTupleStructure::kCollection, false)
1001 , fItemSize(itemField->GetValueSize()), fNWritten(0)
1003 Attach(std::move(itemField));
1005 explicit RField(std::string_view name)
1006 : RField(name, std::make_unique<RField<ItemT>>(RField<ItemT>::TypeName()))
1009 RField(RField&& other) =
default;
1010 RField& operator =(RField&& other) =
default;
1011 ~RField() =
default;
1012 RFieldBase* Clone(std::string_view newName)
final {
1013 auto newItemField = fSubFields[0]->Clone(fSubFields[0]->GetName());
1014 return new RField<ROOT::VecOps::RVec<ItemT>>(newName, std::unique_ptr<Detail::RFieldBase>(newItemField));
1017 void DoGenerateColumns() final {
1018 RColumnModel modelIndex(EColumnType::kIndex,
true );
1019 fColumns.emplace_back(std::unique_ptr<Detail::RColumn>(
1020 Detail::RColumn::Create<ClusterSize_t, EColumnType::kIndex>(modelIndex, 0)));
1021 fPrincipalColumn = fColumns[0].get();
1023 void DestroyValue(
const Detail::RFieldValue& value,
bool dtorOnly =
false) final {
1024 auto vec =
reinterpret_cast<ContainerT*
>(value.GetRawPtr());
1025 auto nItems = vec->size();
1026 for (
unsigned i = 0; i < nItems; ++i) {
1027 auto itemValue = fSubFields[0]->CaptureValue(vec->data() + (i * fItemSize));
1028 fSubFields[0]->DestroyValue(itemValue,
true );
1034 void CommitCluster() final { fNWritten = 0; }
1036 static std::string TypeName() {
return "ROOT::VecOps::RVec<" + RField<ItemT>::TypeName() +
">"; }
1038 using Detail::RFieldBase::GenerateValue;
1039 template <
typename... ArgsT>
1040 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where, ArgsT&&... args)
1042 return Detail::RFieldValue(
this, static_cast<ContainerT*>(where), std::forward<ArgsT>(args)...);
1044 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void* where)
final {
1045 return GenerateValue(where, ContainerT());
1047 Detail::RFieldValue CaptureValue(
void *where)
final {
1048 return Detail::RFieldValue(
true ,
this, static_cast<ContainerT*>(where));
1050 size_t GetValueSize() const final {
return sizeof(ContainerT); }
1051 size_t GetAlignment() const final {
return std::alignment_of<ContainerT>(); }
1058 class RField<ROOT::VecOps::RVec<bool>> :
public Detail::RFieldBase {
1059 using ContainerT =
typename ROOT::VecOps::RVec<bool>;
1061 ClusterSize_t fNWritten{0};
1064 void DoAppend(
const Detail::RFieldValue& value)
final {
1065 auto typedValue = value.Get<ContainerT>();
1066 auto count = typedValue->size();
1067 for (
unsigned i = 0; i < count; ++i) {
1068 bool bval = (*typedValue)[i];
1069 auto itemValue = fSubFields[0]->CaptureValue(&bval);
1070 fSubFields[0]->Append(itemValue);
1072 Detail::RColumnElement<ClusterSize_t, EColumnType::kIndex> elemIndex(&fNWritten);
1074 fColumns[0]->Append(elemIndex);
1076 void DoReadGlobal(NTupleSize_t globalIndex, Detail::RFieldValue *value)
final {
1077 auto typedValue = value->Get<ContainerT>();
1078 ClusterSize_t nItems;
1079 RClusterIndex collectionStart;
1080 fPrincipalColumn->GetCollectionInfo(globalIndex, &collectionStart, &nItems);
1081 typedValue->resize(nItems);
1082 for (
unsigned i = 0; i < nItems; ++i) {
1083 bool bval = (*typedValue)[i];
1084 auto itemValue = fSubFields[0]->GenerateValue(&bval);
1085 fSubFields[0]->Read(collectionStart + i, &itemValue);
1086 (*typedValue)[i] = bval;
1091 RField(std::string_view name)
1092 : ROOT::Experimental::Detail::RFieldBase(name,
"ROOT::VecOps::RVec<bool>", ENTupleStructure::kCollection, false)
1094 Attach(std::make_unique<RField<bool>>(
"bool"));
1096 RField(RField&& other) =
default;
1097 RField& operator =(RField&& other) =
default;
1098 ~RField() =
default;
1099 RFieldBase* Clone(std::string_view newName)
final {
1100 return new RField<ROOT::VecOps::RVec<bool>>(newName);
1103 void DoGenerateColumns() final {
1104 RColumnModel modelIndex(EColumnType::kIndex,
true );
1105 fColumns.emplace_back(std::unique_ptr<Detail::RColumn>(
1106 Detail::RColumn::Create<ClusterSize_t, EColumnType::kIndex>(modelIndex, 0)));
1107 fPrincipalColumn = fColumns[0].get();
1109 void DestroyValue(
const Detail::RFieldValue& value,
bool dtorOnly =
false) final {
1110 auto vec =
reinterpret_cast<ContainerT*
>(value.GetRawPtr());
1115 void CommitCluster() final { fNWritten = 0; }
1117 static std::string TypeName() {
return "ROOT::VecOps::RVec<bool>"; }
1119 using Detail::RFieldBase::GenerateValue;
1120 template <
typename... ArgsT>
1121 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void *where, ArgsT&&... args)
1123 return Detail::RFieldValue(
this, static_cast<ContainerT*>(where), std::forward<ArgsT>(args)...);
1125 ROOT::Experimental::Detail::RFieldValue GenerateValue(
void *where)
final {
1126 return GenerateValue(where, ContainerT());
1128 Detail::RFieldValue CaptureValue(
void *where)
final {
1129 return Detail::RFieldValue(
true ,
this, static_cast<ContainerT*>(where));
1131 size_t GetValueSize() const final {
return sizeof(ContainerT); }
1132 size_t GetAlignment() const final {
return std::alignment_of<ContainerT>(); }