Logo ROOT  
Reference Guide
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Loading...
Searching...
No Matches
RField.cxx
Go to the documentation of this file.
1/// \file RField.cxx
2/// \ingroup NTuple
3/// \author Jakob Blomer <jblomer@cern.ch>
4/// \date 2018-10-15
5
6/*************************************************************************
7 * Copyright (C) 1995-2019, Rene Brun and Fons Rademakers. *
8 * All rights reserved. *
9 * *
10 * For the licensing terms see $ROOTSYS/LICENSE. *
11 * For the list of contributors see $ROOTSYS/README/CREDITS. *
12 *************************************************************************/
13
14#include <ROOT/RColumn.hxx>
15#include <ROOT/REntry.hxx>
16#include <ROOT/RError.hxx>
17#include <ROOT/RField.hxx>
19#include <ROOT/RLogger.hxx>
20#include <ROOT/RNTupleModel.hxx>
22#include <ROOT/RNTupleUtil.hxx>
23
24#include <algorithm>
25#include <cstdint>
26#include <exception>
27#include <functional>
28#include <iostream>
29#include <memory>
30#include <type_traits>
31
32std::unique_ptr<ROOT::RFieldBase> ROOT::RFieldZero::CloneImpl(std::string_view /*newName*/) const
33{
34 auto result = std::make_unique<RFieldZero>();
35 for (auto &f : fSubfields)
36 result->Attach(f->Clone(f->GetFieldName()));
37 return result;
38}
39
41{
42 visitor.VisitFieldZero(*this);
43}
44
45//------------------------------------------------------------------------------
46
56
61
63{
64 visitor.VisitCardinalityField(*this);
65}
66
71
76
77//------------------------------------------------------------------------------
78
79template class ROOT::RSimpleField<char>;
80
100
102{
103 visitor.VisitCharField(*this);
104}
105
106//------------------------------------------------------------------------------
107
108template class ROOT::RSimpleField<std::byte>;
109
111{
112 static RColumnRepresentations representations({{ENTupleColumnType::kByte}}, {});
113 return representations;
114}
115
117{
118 visitor.VisitByteField(*this);
119}
120
121//------------------------------------------------------------------------------
122
123template class ROOT::RSimpleField<int8_t>;
124
126{
127 static RColumnRepresentations representations({{ENTupleColumnType::kInt8}}, {{ENTupleColumnType::kChar},
142 return representations;
143}
144
146{
147 visitor.VisitInt8Field(*this);
148}
149
150//------------------------------------------------------------------------------
151
152template class ROOT::RSimpleField<uint8_t>;
153
155{
156 static RColumnRepresentations representations({{ENTupleColumnType::kUInt8}}, {{ENTupleColumnType::kChar},
171 return representations;
172}
173
175{
176 visitor.VisitUInt8Field(*this);
177}
178
179//------------------------------------------------------------------------------
180
181template class ROOT::RSimpleField<bool>;
182
202
204{
205 visitor.VisitBoolField(*this);
206}
207
208//------------------------------------------------------------------------------
209
210template class ROOT::RSimpleField<float>;
211
222
224{
225 visitor.VisitFloatField(*this);
226}
227
228//------------------------------------------------------------------------------
229
230template class ROOT::RSimpleField<double>;
231
244
246{
247 visitor.VisitDoubleField(*this);
248}
249
251{
252 fTypeAlias = "Double32_t";
253}
254
255//------------------------------------------------------------------------------
256
257template class ROOT::RSimpleField<int16_t>;
258
260{
276 return representations;
277}
278
280{
281 visitor.VisitInt16Field(*this);
282}
283
284//------------------------------------------------------------------------------
285
286template class ROOT::RSimpleField<uint16_t>;
287
289{
305 return representations;
306}
307
309{
310 visitor.VisitUInt16Field(*this);
311}
312
313//------------------------------------------------------------------------------
314
315template class ROOT::RSimpleField<int32_t>;
316
318{
334 return representations;
335}
336
338{
339 visitor.VisitInt32Field(*this);
340}
341
342//------------------------------------------------------------------------------
343
344template class ROOT::RSimpleField<uint32_t>;
345
347{
363 return representations;
364}
365
367{
368 visitor.VisitUInt32Field(*this);
369}
370
371//------------------------------------------------------------------------------
372
373template class ROOT::RSimpleField<uint64_t>;
374
376{
392 return representations;
393}
394
396{
397 visitor.VisitUInt64Field(*this);
398}
399
400//------------------------------------------------------------------------------
401
402template class ROOT::RSimpleField<int64_t>;
403
405{
421 return representations;
422}
423
425{
426 visitor.VisitInt64Field(*this);
427}
428
429//------------------------------------------------------------------------------
430
432{
437 {});
438 return representations;
439}
440
442{
444}
445
447{
449}
450
451std::size_t ROOT::RField<std::string>::AppendImpl(const void *from)
452{
453 auto typedValue = static_cast<const std::string *>(from);
454 auto length = typedValue->length();
455 fAuxiliaryColumn->AppendV(typedValue->data(), length);
456 fIndex += length;
457 fPrincipalColumn->Append(&fIndex);
458 return length + fPrincipalColumn->GetElement()->GetPackedSize();
459}
460
462{
463 auto typedValue = static_cast<std::string *>(to);
464 RNTupleLocalIndex collectionStart;
466 fPrincipalColumn->GetCollectionInfo(globalIndex, &collectionStart, &nChars);
467 if (nChars == 0) {
468 typedValue->clear();
469 } else {
470 typedValue->resize(nChars);
471 fAuxiliaryColumn->ReadV(collectionStart, nChars, const_cast<char *>(typedValue->data()));
472 }
473}
474
476{
477 visitor.VisitStringField(*this);
478}
479
480//------------------------------------------------------------------------------
481
483 : ROOT::RFieldBase(name, source.GetTypeName(), ROOT::ENTupleStructure::kRecord, false /* isSimple */),
484 fMaxAlignment(source.fMaxAlignment),
486 fOffsets(source.fOffsets)
487{
488 for (const auto &f : source.GetConstSubfields())
489 Attach(f->Clone(f->GetFieldName()));
490 fTraits = source.fTraits;
491}
492
493ROOT::RRecordField::RRecordField(std::string_view fieldName, std::string_view typeName)
494 : ROOT::RFieldBase(fieldName, typeName, ROOT::ENTupleStructure::kRecord, false /* isSimple */)
495{
496}
497
498void ROOT::RRecordField::AttachItemFields(std::vector<std::unique_ptr<RFieldBase>> itemFields)
499{
500 fTraits |= kTraitTrivialType;
501 for (auto &item : itemFields) {
502 fMaxAlignment = std::max(fMaxAlignment, item->GetAlignment());
503 fSize += GetItemPadding(fSize, item->GetAlignment()) + item->GetValueSize();
504 fTraits &= item->GetTraits();
505 Attach(std::move(item));
506 }
507 // Trailing padding: although this is implementation-dependent, most add enough padding to comply with the
508 // requirements of the type with strictest alignment
509 fSize += GetItemPadding(fSize, fMaxAlignment);
510}
511
512std::unique_ptr<ROOT::RFieldBase>
513ROOT::Internal::CreateEmulatedField(std::string_view fieldName, std::vector<std::unique_ptr<RFieldBase>> itemFields,
514 std::string_view emulatedFromType)
515{
516 return std::unique_ptr<RFieldBase>(new RRecordField(fieldName, std::move(itemFields), emulatedFromType));
517}
518
519ROOT::RRecordField::RRecordField(std::string_view fieldName, std::vector<std::unique_ptr<RFieldBase>> itemFields,
520 std::string_view emulatedFromType)
522{
524 fOffsets.reserve(itemFields.size());
525 for (auto &item : itemFields) {
526 fSize += GetItemPadding(fSize, item->GetAlignment());
527 fOffsets.push_back(fSize);
528 fMaxAlignment = std::max(fMaxAlignment, item->GetAlignment());
529 fSize += item->GetValueSize();
530 fTraits &= item->GetTraits();
531 Attach(std::move(item));
532 }
534 // Trailing padding: although this is implementation-dependent, most add enough padding to comply with the
535 // requirements of the type with strictest alignment
537}
538
539ROOT::RRecordField::RRecordField(std::string_view fieldName, std::vector<std::unique_ptr<RFieldBase>> itemFields)
541{
542}
543
544std::size_t ROOT::RRecordField::GetItemPadding(std::size_t baseOffset, std::size_t itemAlignment) const
545{
546 if (itemAlignment > 1) {
547 auto remainder = baseOffset % itemAlignment;
548 if (remainder != 0)
549 return itemAlignment - remainder;
550 }
551 return 0;
552}
553
554std::unique_ptr<ROOT::RFieldBase> ROOT::RRecordField::CloneImpl(std::string_view newName) const
555{
556 return std::unique_ptr<RRecordField>(new RRecordField(newName, *this));
557}
558
559std::size_t ROOT::RRecordField::AppendImpl(const void *from)
560{
561 std::size_t nbytes = 0;
562 for (unsigned i = 0; i < fSubfields.size(); ++i) {
563 nbytes += CallAppendOn(*fSubfields[i], static_cast<const unsigned char *>(from) + fOffsets[i]);
564 }
565 return nbytes;
566}
567
569{
570 for (unsigned i = 0; i < fSubfields.size(); ++i) {
571 CallReadOn(*fSubfields[i], globalIndex, static_cast<unsigned char *>(to) + fOffsets[i]);
572 }
573}
574
576{
577 for (unsigned i = 0; i < fSubfields.size(); ++i) {
578 CallReadOn(*fSubfields[i], localIndex, static_cast<unsigned char *>(to) + fOffsets[i]);
579 }
580}
581
583{
584 for (unsigned i = 0; i < fSubfields.size(); ++i) {
585 CallConstructValueOn(*fSubfields[i], static_cast<unsigned char *>(where) + fOffsets[i]);
586 }
587}
588
590{
591 for (unsigned i = 0; i < fItemDeleters.size(); ++i) {
592 fItemDeleters[i]->operator()(reinterpret_cast<unsigned char *>(objPtr) + fOffsets[i], true /* dtorOnly */);
593 }
594 RDeleter::operator()(objPtr, dtorOnly);
595}
596
597std::unique_ptr<ROOT::RFieldBase::RDeleter> ROOT::RRecordField::GetDeleter() const
598{
599 std::vector<std::unique_ptr<RDeleter>> itemDeleters;
600 itemDeleters.reserve(fOffsets.size());
601 for (const auto &f : fSubfields) {
602 itemDeleters.emplace_back(GetDeleterOf(*f));
603 }
604 return std::make_unique<RRecordDeleter>(std::move(itemDeleters), fOffsets);
605}
606
607std::vector<ROOT::RFieldBase::RValue> ROOT::RRecordField::SplitValue(const RValue &value) const
608{
609 auto basePtr = value.GetPtr<unsigned char>().get();
610 std::vector<RValue> result;
611 result.reserve(fSubfields.size());
612 for (unsigned i = 0; i < fSubfields.size(); ++i) {
613 result.emplace_back(fSubfields[i]->BindValue(std::shared_ptr<void>(value.GetPtr<void>(), basePtr + fOffsets[i])));
614 }
615 return result;
616}
617
619{
620 visitor.VisitRecordField(*this);
621}
622
623//------------------------------------------------------------------------------
624
625ROOT::RBitsetField::RBitsetField(std::string_view fieldName, std::size_t N)
626 : ROOT::RFieldBase(fieldName, "std::bitset<" + std::to_string(N) + ">", ROOT::ENTupleStructure::kLeaf,
627 false /* isSimple */, N),
628 fN(N)
629{
631}
632
638
643
648
649std::size_t ROOT::RBitsetField::AppendImpl(const void *from)
650{
651 const auto *asULongArray = static_cast<const Word_t *>(from);
652 bool elementValue;
653 std::size_t i = 0;
654 for (std::size_t word = 0; word < (fN + kBitsPerWord - 1) / kBitsPerWord; ++word) {
655 for (std::size_t mask = 0; (mask < kBitsPerWord) && (i < fN); ++mask, ++i) {
656 elementValue = (asULongArray[word] & (static_cast<Word_t>(1) << mask)) != 0;
657 fPrincipalColumn->Append(&elementValue);
658 }
659 }
660 return fN;
661}
662
664{
665 auto *asULongArray = static_cast<Word_t *>(to);
666 bool elementValue;
667 for (std::size_t i = 0; i < fN; ++i) {
668 fPrincipalColumn->Read(globalIndex * fN + i, &elementValue);
669 Word_t mask = static_cast<Word_t>(1) << (i % kBitsPerWord);
670 Word_t bit = static_cast<Word_t>(elementValue) << (i % kBitsPerWord);
671 asULongArray[i / kBitsPerWord] = (asULongArray[i / kBitsPerWord] & ~mask) | bit;
672 }
673}
674
676{
677 auto *asULongArray = static_cast<Word_t *>(to);
678 bool elementValue;
679 for (std::size_t i = 0; i < fN; ++i) {
680 fPrincipalColumn->Read(RNTupleLocalIndex(localIndex.GetClusterId(), localIndex.GetIndexInCluster() * fN) + i,
681 &elementValue);
682 Word_t mask = static_cast<Word_t>(1) << (i % kBitsPerWord);
683 Word_t bit = static_cast<Word_t>(elementValue) << (i % kBitsPerWord);
684 asULongArray[i / kBitsPerWord] = (asULongArray[i / kBitsPerWord] & ~mask) | bit;
685 }
686}
687
689{
690 visitor.VisitBitsetField(*this);
691}
692
693//------------------------------------------------------------------------------
694
695ROOT::RNullableField::RNullableField(std::string_view fieldName, std::string_view typeName,
696 std::unique_ptr<RFieldBase> itemField)
697 : ROOT::RFieldBase(fieldName, typeName, ROOT::ENTupleStructure::kCollection, false /* isSimple */)
698{
699 Attach(std::move(itemField));
700}
701
711
716
721
723{
724 fPrincipalColumn->Append(&fNWritten);
725 return sizeof(ROOT::Internal::RColumnIndex);
726}
727
728std::size_t ROOT::RNullableField::AppendValue(const void *from)
729{
730 auto nbytesItem = CallAppendOn(*fSubfields[0], from);
731 fNWritten++;
732 fPrincipalColumn->Append(&fNWritten);
734}
735
743
745{
746 visitor.VisitNullableField(*this);
747}
748
749//------------------------------------------------------------------------------
750
751ROOT::RUniquePtrField::RUniquePtrField(std::string_view fieldName, std::string_view typeName,
752 std::unique_ptr<RFieldBase> itemField)
753 : RNullableField(fieldName, typeName, std::move(itemField)), fItemDeleter(GetDeleterOf(*fSubfields[0]))
754{
755}
756
757std::unique_ptr<ROOT::RFieldBase> ROOT::RUniquePtrField::CloneImpl(std::string_view newName) const
758{
759 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
760 return std::make_unique<RUniquePtrField>(newName, GetTypeName(), std::move(newItemField));
761}
762
763std::size_t ROOT::RUniquePtrField::AppendImpl(const void *from)
764{
765 auto typedValue = static_cast<const std::unique_ptr<char> *>(from);
766 if (*typedValue) {
767 return AppendValue(typedValue->get());
768 } else {
769 return AppendNull();
770 }
771}
772
774{
775 auto ptr = static_cast<std::unique_ptr<char> *>(to);
776 bool isValidValue = static_cast<bool>(*ptr);
777
778 auto itemIndex = GetItemIndex(globalIndex);
779 bool isValidItem = itemIndex.GetIndexInCluster() != ROOT::kInvalidNTupleIndex;
780
781 void *valuePtr = nullptr;
782 if (isValidValue)
783 valuePtr = ptr->get();
784
785 if (isValidValue && !isValidItem) {
786 ptr->release();
787 fItemDeleter->operator()(valuePtr, false /* dtorOnly */);
788 return;
789 }
790
791 if (!isValidItem) // On-disk value missing; nothing else to do
792 return;
793
794 if (!isValidValue) {
795 valuePtr = CallCreateObjectRawPtrOn(*fSubfields[0]);
796 ptr->reset(reinterpret_cast<char *>(valuePtr));
797 }
798
799 CallReadOn(*fSubfields[0], itemIndex, valuePtr);
800}
801
803{
804 auto typedPtr = static_cast<std::unique_ptr<char> *>(objPtr);
805 if (*typedPtr) {
806 fItemDeleter->operator()(typedPtr->get(), false /* dtorOnly */);
807 typedPtr->release();
808 }
809 RDeleter::operator()(objPtr, dtorOnly);
810}
811
812std::unique_ptr<ROOT::RFieldBase::RDeleter> ROOT::RUniquePtrField::GetDeleter() const
813{
814 return std::make_unique<RUniquePtrDeleter>(GetDeleterOf(*fSubfields[0]));
815}
816
817std::vector<ROOT::RFieldBase::RValue> ROOT::RUniquePtrField::SplitValue(const RValue &value) const
818{
819 std::vector<RValue> result;
820 const auto &ptr = value.GetRef<std::unique_ptr<char>>();
821 if (ptr) {
822 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<void>(value.GetPtr<void>(), ptr.get())));
823 }
824 return result;
825}
826
827//------------------------------------------------------------------------------
828
829ROOT::ROptionalField::ROptionalField(std::string_view fieldName, std::string_view typeName,
830 std::unique_ptr<RFieldBase> itemField)
831 : RNullableField(fieldName, typeName, std::move(itemField)), fItemDeleter(GetDeleterOf(*fSubfields[0]))
832{
835}
836
838{
839 return reinterpret_cast<bool *>(reinterpret_cast<unsigned char *>(optionalPtr) + fSubfields[0]->GetValueSize());
840}
841
843{
844 return GetEngagementPtr(const_cast<void *>(optionalPtr));
845}
846
847std::unique_ptr<ROOT::RFieldBase> ROOT::ROptionalField::CloneImpl(std::string_view newName) const
848{
849 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
850 return std::make_unique<ROptionalField>(newName, GetTypeName(), std::move(newItemField));
851}
852
853std::size_t ROOT::ROptionalField::AppendImpl(const void *from)
854{
855 if (*GetEngagementPtr(from)) {
856 return AppendValue(from);
857 } else {
858 return AppendNull();
859 }
860}
861
863{
864 auto engagementPtr = GetEngagementPtr(to);
865 auto itemIndex = GetItemIndex(globalIndex);
866 if (itemIndex.GetIndexInCluster() == ROOT::kInvalidNTupleIndex) {
867 if (*engagementPtr && !(fSubfields[0]->GetTraits() & kTraitTriviallyDestructible))
868 fItemDeleter->operator()(to, true /* dtorOnly */);
869 *engagementPtr = false;
870 } else {
871 if (!(*engagementPtr) && !(fSubfields[0]->GetTraits() & kTraitTriviallyConstructible))
872 CallConstructValueOn(*fSubfields[0], to);
873 CallReadOn(*fSubfields[0], itemIndex, to);
874 *engagementPtr = true;
875 }
876}
877
879{
880 *GetEngagementPtr(where) = false;
881}
882
884{
885 if (fItemDeleter) {
886 auto engagementPtr = reinterpret_cast<bool *>(reinterpret_cast<unsigned char *>(objPtr) + fEngagementPtrOffset);
887 if (*engagementPtr)
888 fItemDeleter->operator()(objPtr, true /* dtorOnly */);
889 }
890 RDeleter::operator()(objPtr, dtorOnly);
891}
892
893std::unique_ptr<ROOT::RFieldBase::RDeleter> ROOT::ROptionalField::GetDeleter() const
894{
895 return std::make_unique<ROptionalDeleter>(
896 (fSubfields[0]->GetTraits() & kTraitTriviallyDestructible) ? nullptr : GetDeleterOf(*fSubfields[0]),
897 fSubfields[0]->GetValueSize());
898}
899
900std::vector<ROOT::RFieldBase::RValue> ROOT::ROptionalField::SplitValue(const RValue &value) const
901{
902 std::vector<RValue> result;
903 const auto valuePtr = value.GetPtr<void>().get();
904 if (*GetEngagementPtr(valuePtr)) {
905 result.emplace_back(fSubfields[0]->BindValue(std::shared_ptr<void>(value.GetPtr<void>(), valuePtr)));
906 }
907 return result;
908}
909
911{
912 const auto alignment = GetAlignment();
913 // real size is the sum of the value size and the engagement boolean
914 const auto actualSize = fSubfields[0]->GetValueSize() + sizeof(bool);
915 auto padding = 0;
916 if (alignment > 1) {
917 auto remainder = actualSize % alignment;
918 if (remainder != 0)
919 padding = alignment - remainder;
920 }
921 return actualSize + padding;
922}
923
925{
926 return fSubfields[0]->GetAlignment();
927}
928
929//------------------------------------------------------------------------------
930
931ROOT::RAtomicField::RAtomicField(std::string_view fieldName, std::string_view typeName,
932 std::unique_ptr<RFieldBase> itemField)
933 : RFieldBase(fieldName, typeName, ROOT::ENTupleStructure::kLeaf, false /* isSimple */)
934{
935 if (itemField->GetTraits() & kTraitTriviallyConstructible)
937 if (itemField->GetTraits() & kTraitTriviallyDestructible)
939 Attach(std::move(itemField));
940}
941
942std::unique_ptr<ROOT::RFieldBase> ROOT::RAtomicField::CloneImpl(std::string_view newName) const
943{
944 auto newItemField = fSubfields[0]->Clone(fSubfields[0]->GetFieldName());
945 return std::make_unique<RAtomicField>(newName, GetTypeName(), std::move(newItemField));
946}
947
948std::vector<ROOT::RFieldBase::RValue> ROOT::RAtomicField::SplitValue(const RValue &value) const
949{
950 std::vector<RValue> result;
951 result.emplace_back(fSubfields[0]->BindValue(value.GetPtr<void>()));
952 return result;
953}
954
956{
957 visitor.VisitAtomicField(*this);
958}
dim_t fSize
#define f(i)
Definition RSha256.hxx:104
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
#define N
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 mask
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 char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h length
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
char name[80]
Definition TGX11.cxx:110
TCanvas * alignment()
Definition alignment.C:1
Abstract base class for classes implementing the visitor design pattern.
The in-memory representation of a 32bit or 64bit on-disk index column.
RAtomicField(std::string_view fieldName, std::string_view typeName, std::unique_ptr< RFieldBase > itemField)
Definition RField.cxx:931
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
Definition RField.cxx:955
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
Definition RField.cxx:942
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
Definition RField.cxx:948
RBitsetField(std::string_view fieldName, std::size_t N)
Definition RField.cxx:625
unsigned long Word_t
void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final
Definition RField.cxx:675
void GenerateColumns() final
Implementations in derived classes should create the backing columns corresponding to the field type ...
Definition RField.cxx:639
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
Definition RField.cxx:663
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
Definition RField.cxx:649
const RColumnRepresentations & GetColumnRepresentations() const final
Implementations in derived classes should return a static RColumnRepresentations object.
Definition RField.cxx:633
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
Definition RField.cxx:688
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
Definition RField.cxx:62
const RColumnRepresentations & GetColumnRepresentations() const final
Implementations in derived classes should return a static RColumnRepresentations object.
Definition RField.cxx:47
const RField< RNTupleCardinality< std::uint32_t > > * As32Bit() const
Definition RField.cxx:67
const RField< RNTupleCardinality< std::uint64_t > > * As64Bit() const
Definition RField.cxx:72
void GenerateColumns() final
Implementations in derived classes should create the backing columns corresponding to the field type ...
Definition RField.hxx:331
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
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.
virtual const RColumnRepresentations & GetColumnRepresentations() const
Implementations in derived classes should return a static RColumnRepresentations object.
virtual void GenerateColumns()
Implementations in derived classes should create the backing columns corresponding to the field type ...
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...
@ kTraitTrivialType
Shorthand for types that are both trivially constructible and destructible.
@ kTraitTriviallyDestructible
The type is cleaned up just by freeing its memory. I.e. the destructor performs a no-op.
@ kTraitTriviallyConstructible
No constructor needs to be called, i.e.
std::uint32_t GetTraits() const
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
Definition RField.cxx:40
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
Definition RField.cxx:32
Classes with dictionaries that can be inspected by TClass.
Definition RField.hxx:283
The on-storage metadata of an RNTuple.
Addresses a column element or field item relative to a particular cluster, instead of a global NTuple...
Template specializations for C++ std::optional and std::unique_ptr.
std::size_t AppendNull()
Definition RField.cxx:722
RNTupleLocalIndex GetItemIndex(ROOT::NTupleSize_t globalIndex)
Given the index of the nullable field, returns the corresponding global index of the subfield or,...
Definition RField.cxx:736
RNullableField(std::string_view fieldName, std::string_view typeName, std::unique_ptr< RFieldBase > itemField)
Definition RField.cxx:695
std::size_t AppendValue(const void *from)
Definition RField.cxx:728
void GenerateColumns() final
Implementations in derived classes should create the backing columns corresponding to the field type ...
Definition RField.cxx:712
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
Definition RField.cxx:744
const RFieldBase::RColumnRepresentations & GetColumnRepresentations() const final
Implementations in derived classes should return a static RColumnRepresentations object.
Definition RField.cxx:702
void operator()(void *objPtr, bool dtorOnly) final
Definition RField.cxx:883
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
Definition RField.cxx:878
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
Definition RField.cxx:924
std::unique_ptr< RDeleter > GetDeleter() const final
Definition RField.cxx:893
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
Definition RField.cxx:847
const bool * GetEngagementPtr(const void *optionalPtr) const
Given a pointer to an std::optional<T> in optionalPtr, extract a pointer to the engagement boolean.
Definition RField.cxx:842
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
Definition RField.cxx:862
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
Definition RField.cxx:853
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
Definition RField.cxx:900
ROptionalField(std::string_view fieldName, std::string_view typeName, std::unique_ptr< RFieldBase > itemField)
Definition RField.cxx:829
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
Definition RField.cxx:910
void operator()(void *objPtr, bool dtorOnly) final
Definition RField.cxx:589
The field for an untyped record.
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
Definition RField.cxx:607
std::size_t fMaxAlignment
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
Definition RField.cxx:554
void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final
Definition RField.cxx:575
RRecordField(std::string_view name, const RRecordField &source)
Definition RField.cxx:482
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
Definition RField.cxx:618
std::unique_ptr< RDeleter > GetDeleter() const final
Definition RField.cxx:597
void AttachItemFields(std::vector< std::unique_ptr< RFieldBase > > itemFields)
Definition RField.cxx:498
std::size_t GetItemPadding(std::size_t baseOffset, std::size_t itemAlignment) const
Definition RField.cxx:544
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
Definition RField.cxx:568
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
Definition RField.cxx:582
std::vector< std::size_t > fOffsets
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
Definition RField.cxx:559
void operator()(void *objPtr, bool dtorOnly) final
Definition RField.cxx:802
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
Definition RField.cxx:817
RUniquePtrField(std::string_view fieldName, std::string_view typeName, std::unique_ptr< RFieldBase > itemField)
Definition RField.cxx:751
std::unique_ptr< RDeleter > GetDeleter() const final
Definition RField.cxx:812
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
Definition RField.cxx:773
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
Definition RField.cxx:757
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
Definition RField.cxx:763
std::unique_ptr< RFieldBase > CreateEmulatedField(std::string_view fieldName, std::vector< std::unique_ptr< RFieldBase > > itemFields, std::string_view emulatedFromType)
Definition RField.cxx:513
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
constexpr NTupleSize_t kInvalidNTupleIndex
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.