50#include <unordered_set>
58TClass *EnsureValidClass(std::string_view className)
72 " cannot be constructed from a class that's not at least Interpreted"));
83 "use RProxiedCollectionField instead"));
94 R__FAIL(field.
GetTypeName() +
" has streamer mode enforced, not supported as native RNTuple class"));
104 if (realMember->GetStreamer()) {
106 " with a custom streamer; not supported natively in RNTuple"));
111TEnum *EnsureValidEnum(std::string_view enumName)
123std::string GetTypeList(std::span<std::unique_ptr<ROOT::RFieldBase>> itemFields,
bool useTypeAliases)
126 for (
size_t i = 0; i < itemFields.size(); ++i) {
127 if (useTypeAliases && !itemFields[i]->GetTypeAlias().empty()) {
128 result += itemFields[i]->GetTypeAlias();
130 result += itemFields[i]->GetTypeName();
143 std::string typePrefix;
159 if (
const auto pairField =
dynamic_cast<const ROOT::RPairField *
>(innerField)) {
160 std::string typePrefix;
168 const auto &items = pairField->GetConstSubfields();
169 std::string
type = typePrefix;
170 for (
int i : {0, 1}) {
171 if (useTypeAliases && !items[i]->GetTypeAlias().empty()) {
172 type += items[i]->GetTypeAlias();
174 type += items[i]->GetTypeName();
194 RFieldBase::Attach(f->Clone(f->GetFieldName()));
200 :
RClassField(fieldName, EnsureValidClass(className))
209 EnsureValidUserClass(
fClass, *
this,
"RClassField");
220 std::string renormalizedAlias;
225 const auto *bases =
fClass->GetListOfBases();
228 if (baseClass->GetDelta() < 0) {
230 " virtually inherits from " + baseClass->GetName()));
232 TClass *
c = baseClass->GetClassPointer();
235 fTraits &= subField->GetTraits();
244 if (!dataMember->IsPersistent()) {
253 std::string typeName{dataMember->GetTrueTypeName()};
256 if (dataMember->Property() &
kIsArray) {
257 for (
int dim = 0,
n = dataMember->GetArrayDim(); dim <
n; ++dim) {
258 typeName +=
"[" + std::to_string(dataMember->GetMaxIndex(dim)) +
"]";
264 fTraits &= subField->GetTraits();
276 deleter->operator()(
fStagingArea.get() + si.fOffset,
true );
292 const auto ruleset =
fClass->GetSchemaRules();
299 rules = ruleset->FindRules(
fClass->GetName(),
fClass->GetClassVersion(),
fClass->GetCheckSum());
302 std::string normalizedName;
309 rules = ruleset->FindRules(normalizedName, fieldDesc->
GetTypeVersion());
315 std::unordered_map<std::string, std::string> sourceNameAndType;
316 std::size_t nskip = 0;
317 for (
auto itr = rules.begin(); itr != rules.end() - nskip;) {
318 const auto rule = *itr;
323 <<
"ignoring I/O customization rule with unsupported type: " << rule->GetRuleType();
324 itr = rules.erase(itr);
328 bool hasConflictingSourceMembers =
false;
330 auto memberType = source->GetTypeForDeclaration() + source->GetDimensions();
331 auto [itrSrc, isNew] = sourceNameAndType.emplace(source->GetName(), memberType);
332 if (!isNew && (itrSrc->second != memberType)) {
334 <<
"ignoring I/O customization rule due to conflicting source member type: " << itrSrc->second <<
" vs. "
335 << memberType <<
" for member " << source->GetName();
336 hasConflictingSourceMembers =
true;
340 if (hasConflictingSourceMembers) {
341 itr = rules.erase(itr);
346 if (rule->GetTarget() ==
nullptr) {
348 if (itr != rules.end() - nskip)
349 std::iter_swap(itr++, rules.end() - nskip);
361 return std::unique_ptr<RClassField>(
new RClassField(newName, *
this));
366 std::size_t nbytes = 0;
367 for (
unsigned i = 0; i <
fSubfields.size(); i++) {
378 for (
unsigned i = 0; i <
fSubfields.size(); i++) {
388 for (
unsigned i = 0; i <
fSubfields.size(); i++) {
396 auto idSourceMember = desc.
FindFieldId(memberName, classFieldId);
398 return idSourceMember;
401 const auto subFieldName = subFieldDesc.GetFieldName();
402 if (subFieldName.length() > 2 && subFieldName[0] ==
':' && subFieldName[1] ==
'_') {
403 idSourceMember =
LookupMember(desc, memberName, subFieldDesc.GetId());
405 return idSourceMember;
432 std::size_t stagingAreaSize = 0;
433 for (
const auto rule : rules) {
448 auto memberType = source->GetTypeForDeclaration() + source->GetDimensions();
449 auto memberField =
Create(
"" , std::string(memberType)).Unwrap();
450 memberField->SetOnDiskId(memberFieldId);
451 auto fieldZero = std::make_unique<RFieldZero>();
453 fieldZero->Attach(std::move(memberField));
454 stagingItem.
fField = std::move(fieldZero);
460 stagingAreaSize = std::max(stagingAreaSize, stagingItem.
fOffset + stagingItem.
fField->begin()->GetValueSize());
464 if (stagingAreaSize) {
467 fStagingArea = std::make_unique<unsigned char[]>(stagingAreaSize);
470 const auto &memberField = *si.fField->cbegin();
481 if (func ==
nullptr) {
486 TVirtualObject onfileObj{nullptr};
487 onfileObj.fClass = stagingClass;
488 onfileObj.fObject = stagingArea;
489 func(
static_cast<char *
>(
target), &onfileObj);
490 onfileObj.fObject =
nullptr;
496 std::vector<const TSchemaRule *> rules;
499 std::unordered_set<std::string> regularSubfields;
502 int nOnDiskBaseClasses = 0;
522 for (
auto linkId : fieldDesc.GetLinkIds()) {
524 regularSubfields.insert(subFieldDesc.GetFieldName());
525 if (!subFieldDesc.GetFieldName().empty() && subFieldDesc.GetFieldName()[0] ==
':')
526 nOnDiskBaseClasses++;
540 " vs. " + descTypeName));
544 const bool hasSources = std::any_of(rules.begin(), rules.end(), [](
const auto &
r) {
545 return r->GetSource() && (r->GetSource()->GetEntries() > 0);
555 si.fField = std::move(
static_cast<RFieldZero *
>(si.fField.get())->ReleaseSubfields()[0]);
560 for (
const auto rule : rules) {
561 if (!rule->GetTarget())
565 regularSubfields.erase(std::string(
target->GetString()));
570 for (
const auto rule : rules) {
575 int nInMemoryBaseClasses = 0;
578 if (regularSubfields.count(fieldName) == 0) {
581 if (!fieldName.empty() && fieldName[0] ==
':')
582 nInMemoryBaseClasses++;
585 if (nInMemoryBaseClasses != 0 && nOnDiskBaseClasses != 0 && nInMemoryBaseClasses != nOnDiskBaseClasses) {
587 GetTypeName() +
", " + std::to_string(nInMemoryBaseClasses) +
588 " base classes in memory "
590 std::to_string(nOnDiskBaseClasses) +
" base classes on-disk\n" +
609 fClass->Destructor(objPtr,
true );
610 RDeleter::operator()(objPtr, dtorOnly);
615 std::vector<RValue>
result;
616 auto valuePtr =
value.GetPtr<
void>();
617 auto charPtr =
static_cast<unsigned char *
>(valuePtr.get());
619 for (
unsigned i = 0; i <
fSubfields.size(); i++) {
628 return fClass->GetClassSize();
633 return fClass->GetClassVersion();
638 return fClass->GetCheckSum();
647 return fClass->GetTypeInfo();
669 :
RSoAField(fieldName, EnsureValidClass(className))
678 static std::once_flag once;
679 std::call_once(once, []() {
683 EnsureValidUserClass(
fSoAClass, *
this,
"RSoAField");
685 if (recordTypeName.empty()) {
687 " is not marked with the rntupleSoARecord "
688 "dictionary option; cannot create corresponding RSoAField."));
691 Attach(std::make_unique<ROOT::RClassField>(
"_0", recordTypeName));
696 if (
static_cast<std::uint32_t
>(
fSoAClass->GetClassVersion()) !=
fSubfields[0]->GetTypeVersion()) {
697 throw RException(
R__FAIL(std::string(
"version mismatch between SoA type and underlying record type: ") +
698 std::to_string(
fSoAClass->GetClassVersion()) +
" vs. " +
699 std::to_string(
fSubfields[0]->GetTypeVersion())));
703 std::unordered_map<std::string, std::size_t> recordFieldNameToIdx;
706 assert(!
f->GetFieldName().empty());
707 if (
f->GetFieldName()[0] ==
':') {
708 throw RException(
R__FAIL(
"SoA fields with inheritance are currently unsupported"));
710 recordFieldNameToIdx[
f->GetFieldName()] = i;
713 const auto *bases =
fSoAClass->GetListOfBases();
716 if (baseClass->GetDelta() < 0) {
718 " virtually inherits from " + baseClass->GetName()));
721 throw RException(
R__FAIL(
"SoA fields with inheritance are currently unsupported"));
725 unsigned int nMembers = 0;
727 if ((dataMember->Property() &
kIsStatic) || !dataMember->IsPersistent())
730 if (dataMember->Property() &
kIsArray) {
731 throw RException(
R__FAIL(std::string(
"unsupported array type in SoA class: ") + dataMember->GetName()));
734 const std::string typeName{dataMember->GetTrueTypeName()};
736 auto vecFieldPtr =
dynamic_cast<RRVecField *
>(subField.get());
738 throw RException(
R__FAIL(
"invalid field type in SoA class: " + subField->GetTypeName()));
741 auto vecField = std::unique_ptr<RRVecField>(vecFieldPtr);
743 auto itr = recordFieldNameToIdx.find(vecField->GetFieldName());
744 if (itr == recordFieldNameToIdx.end()) {
745 throw RException(
R__FAIL(std::string(
"unexpected SoA member: ") + vecField->GetFieldName()));
748 if (vecField->begin()->GetTypeName() != memberField->
GetTypeName() ||
749 vecField->begin()->GetTypeAlias() != memberField->
GetTypeAlias()) {
750 const std::string leftType =
751 vecField->begin()->GetTypeName() +
752 (vecField->begin()->
GetTypeAlias().empty() ?
"" :
" [" + vecField->begin()->GetTypeAlias() +
"]");
753 const std::string rightType =
756 throw RException(
R__FAIL(std::string(
"SoA member type mismatch: ") + vecField->GetFieldName() +
" (" +
757 leftType +
" vs. " + rightType +
")"));
766 if (recordFieldNameToIdx.size() != nMembers) {
770 std::string renormalizedAlias;
779 return std::unique_ptr<RSoAField>(
new RSoAField(newName, *
this));
789 return representations;
807 for (std::size_t i = 0; i < nSoAMembers; ++i) {
808 const void *rvecPtr =
static_cast<const unsigned char *
>(from) +
fSoAMemberOffsets[i];
810 assert(*sizePtr >= 0);
814 if (
static_cast<std::size_t
>(*sizePtr) !=
N) {
816 throw RException(
R__FAIL(
"SoA length mismatch for " +
f->GetFieldName() +
": " + std::to_string(*sizePtr) +
817 " vs. " + std::to_string(
N) +
" (expected)"));
822 std::size_t nbytes = 0;
824 for (std::size_t i = 0; i < nSoAMembers; ++i) {
825 const void *rvecPtr =
static_cast<const unsigned char *
>(from) +
fSoAMemberOffsets[i];
832 for (std::size_t j = 0; j <
N; ++j) {
857 RDeleter::operator()(objPtr, dtorOnly);
863 return std::vector<RValue>();
894 :
REnumField(fieldName, EnsureValidEnum(enumName))
904 throw RException(R__FAIL(GetTypeName() +
" is not supported"));
908 case kBool_t: Attach(std::make_unique<RField<Bool_t>>(
"_0")); break;
909 case kChar_t: Attach(std::make_unique<RField<Char_t>>(
"_0")); break;
910 case kUChar_t: Attach(std::make_unique<RField<UChar_t>>(
"_0")); break;
911 case kShort_t: Attach(std::make_unique<RField<Short_t>>(
"_0")); break;
912 case kUShort_t: Attach(std::make_unique<RField<UShort_t>>(
"_0")); break;
913 case kInt_t: Attach(std::make_unique<RField<Int_t>>(
"_0")); break;
914 case kUInt_t: Attach(std::make_unique<RField<UInt_t>>(
"_0")); break;
915 case kLong_t: Attach(std::make_unique<RField<Long_t>>(
"_0")); break;
916 case kLong64_t: Attach(std::make_unique<RField<Long64_t>>(
"_0")); break;
917 case kULong_t: Attach(std::make_unique<RField<ULong_t>>(
"_0")); break;
918 case kULong64_t: Attach(std::make_unique<RField<ULong64_t>>(
"_0")); break;
919 default: throw RException(R__FAIL(
"Unsupported underlying integral type for enum type " + GetTypeName()));
926 std::unique_ptr<RFieldBase> intField)
929 Attach(std::move(intField));
947 std::vector<RValue>
result;
960 :
ROOT::
RRecordField(fieldName,
"std::pair<" + GetTypeList(itemFields, false ) +
">")
962 const std::string typeAlias =
"std::pair<" + GetTypeList(itemFields,
true ) +
">";
974 auto firstElem =
c->GetRealData(
"first");
977 fOffsets.push_back(firstElem->GetThisOffset());
979 auto secondElem =
c->GetRealData(
"second");
982 fOffsets.push_back(secondElem->GetThisOffset());
989 return std::unique_ptr<RPairField>(
new RPairField(newName, std::move(itemClones)));
994 static const std::vector<std::string> prefixes = {
"std::pair<",
"std::tuple<"};
1000 const auto nOnDiskSubfields = fieldDesc.
GetLinkIds().size();
1001 if (nOnDiskSubfields != 2) {
1003 std::to_string(nOnDiskSubfields) +
"\n" +
1019 (ifuncs.
fNext !=
nullptr));
1031 static const std::vector<std::string> supportedStdTypes = {
1032 "std::set<",
"std::unordered_set<",
"std::multiset<",
"std::unordered_multiset<",
1033 "std::map<",
"std::unordered_map<",
"std::multimap<",
"std::unordered_multimap<"};
1034 bool isSupported =
false;
1035 for (
const auto &tn : supportedStdTypes) {
1045 std::string renormalizedAlias;
1047 fTypeAlias = renormalizedAlias;
1049 fProxy.reset(classp->GetCollectionProxy()->Generate());
1050 fProperties = fProxy->GetProperties();
1051 fCollectionType = fProxy->GetCollectionType();
1052 if (fProxy->HasPointers())
1053 throw RException(
R__FAIL(
"collection proxies whose value type is a pointer are not supported"));
1055 fIFuncsRead = RCollectionIterableOnce::GetIteratorFuncs(fProxy.get(),
true );
1056 fIFuncsWrite = RCollectionIterableOnce::GetIteratorFuncs(fProxy.get(),
false );
1064 throw RException(
R__FAIL(
"custom associative collection proxies not supported"));
1066 std::unique_ptr<ROOT::RFieldBase> itemField;
1068 if (
auto valueClass =
fProxy->GetValueClass()) {
1070 itemField = RFieldBase::Create(
"_0", valueClass->GetName()).Unwrap();
1072 switch (fProxy->GetType()) {
1073 case EDataType::kChar_t: itemField = std::make_unique<RField<Char_t>>(
"_0"); break;
1074 case EDataType::kUChar_t: itemField = std::make_unique<RField<UChar_t>>(
"_0"); break;
1075 case EDataType::kShort_t: itemField = std::make_unique<RField<Short_t>>(
"_0"); break;
1076 case EDataType::kUShort_t: itemField = std::make_unique<RField<UShort_t>>(
"_0"); break;
1077 case EDataType::kInt_t: itemField = std::make_unique<RField<Int_t>>(
"_0"); break;
1078 case EDataType::kUInt_t: itemField = std::make_unique<RField<UInt_t>>(
"_0"); break;
1079 case EDataType::kLong_t: itemField = std::make_unique<RField<Long_t>>(
"_0"); break;
1080 case EDataType::kLong64_t: itemField = std::make_unique<RField<Long64_t>>(
"_0"); break;
1081 case EDataType::kULong_t: itemField = std::make_unique<RField<ULong_t>>(
"_0"); break;
1082 case EDataType::kULong64_t: itemField = std::make_unique<RField<ULong64_t>>(
"_0"); break;
1083 case EDataType::kFloat_t: itemField = std::make_unique<RField<Float_t>>(
"_0"); break;
1084 case EDataType::kDouble_t: itemField = std::make_unique<RField<Double_t>>(
"_0"); break;
1085 case EDataType::kBool_t: itemField = std::make_unique<RField<Bool_t>>(
"_0"); break;
1086 default: throw RException(R__FAIL(
"unsupported value type: " + std::to_string(fProxy->GetType())));
1090 fItemSize = itemField->GetValueSize();
1091 Attach(std::move(itemField));
1105 std::size_t nbytes = 0;
1123 fPrincipalColumn->GetCollectionInfo(globalIndex, &collectionStart, &nItems);
1145 return representations;
1174 return std::make_unique<RProxiedCollectionDeleter>(
fProxy);
1185 fProxy->Destructor(objPtr,
true );
1186 RDeleter::operator()(objPtr, dtorOnly);
1191 std::vector<RValue>
result;
1192 auto valueRawPtr =
value.GetPtr<
void>().get();
1210 EnsureValidClass(BuildMapTypeName(mapType, itemField.get(), false ))),
1213 if (!itemField->GetTypeAlias().empty())
1214 fTypeAlias = BuildMapTypeName(mapType, itemField.get(),
true );
1216 auto *itemClass =
fProxy->GetValueClass();
1219 Attach(std::move(itemField),
"_0");
1229 static const std::vector<std::string> prefixesRegular = {
"std::map<",
"std::unordered_map<"};
1246 EnsureValidClass(BuildSetTypeName(setType, *itemField, false ))),
1249 if (!itemField->GetTypeAlias().empty())
1250 fTypeAlias = BuildSetTypeName(setType, *itemField,
true );
1254 Attach(std::move(itemField),
"_0");
1264 static const std::vector<std::string> prefixesRegular = {
"std::set<",
"std::unordered_set<",
"std::map<",
1265 "std::unordered_map<"};
1288 RCallbackStreamerInfo fCallbackStreamerInfo;
1292 :
TBufferFile(
mode, bufsize), fCallbackStreamerInfo(callbackStreamerInfo)
1311 std::string renormalizedAlias;
1334 fClass->Streamer(
const_cast<void *
>(from), buffer);
1336 auto nbytes = buffer.Length();
1347 fPrincipalColumn->GetCollectionInfo(globalIndex, &collectionStart, &nbytes);
1351 fClass->Streamer(to, buffer);
1361 return representations;
1392 fClass->Destructor(objPtr,
true );
1393 RDeleter::operator()(objPtr, dtorOnly);
1408 return std::min(
alignof(std::max_align_t),
GetValueSize());
1413 return fClass->GetClassSize();
1418 return fClass->GetClassVersion();
1423 return fClass->GetCheckSum();
1436 return dataMember->GetOffset();
1461 return std::unique_ptr<RField<TObject>>(
new RField<TObject>(newName, *
this));
1468 auto *obj =
static_cast<const TObject *
>(from);
1473 std::size_t nbytes = 0;
1487 auto *obj =
static_cast<TObject *
>(to);
1496 *
reinterpret_cast<UInt_t *
>(
reinterpret_cast<unsigned char *
>(to) +
GetOffsetBits()) = bits;
1532 std::vector<RValue>
result;
1535 auto charPtr =
static_cast<unsigned char *
>(ptr.get());
1559 :
ROOT::
RRecordField(fieldName,
"std::tuple<" + GetTypeList(itemFields, false ) +
">")
1561 const std::string typeAlias =
"std::tuple<" + GetTypeList(itemFields,
true ) +
">";
1577 for (
unsigned i = 0; i <
fSubfields.size(); ++i) {
1578 std::string memberName(
"_" + std::to_string(i));
1579 auto member =
c->GetRealData(memberName.c_str());
1582 fOffsets.push_back(member->GetThisOffset());
1588 std::vector<std::unique_ptr<RFieldBase>> itemClones;
1591 itemClones.emplace_back(
f->Clone(
f->GetFieldName()));
1593 return std::unique_ptr<RTupleField>(
new RTupleField(newName, std::move(itemClones)));
1598 static const std::vector<std::string> prefixes = {
"std::pair<",
"std::tuple<"};
1604 const auto nOnDiskSubfields = fieldDesc.
GetLinkIds().size();
1606 if (nOnDiskSubfields != nSubfields) {
1608 std::to_string(nOnDiskSubfields) +
" vs. " + std::to_string(nSubfields) +
"\n" +
1618constexpr std::size_t GetVariantTagSize()
1621 std::variant<char> t;
1622 constexpr auto sizeOfT =
sizeof(t);
1624 static_assert(sizeOfT == 2 || sizeOfT == 8,
"unsupported std::variant layout");
1625 return sizeOfT == 2 ? 1 : 4;
1628template <std::
size_t VariantSizeT>
1630 using ValueType_t =
typename std::conditional_t<VariantSizeT == 1, std::uint8_t,
1631 typename std::conditional_t<VariantSizeT == 4, std::uint32_t, void>>;
1645 Attach(
f->Clone(
f->GetFieldName()));
1650 :
ROOT::
RFieldBase(fieldName,
"std::variant<" + GetTypeList(itemFields, false ) +
">",
1656 const std::string typeAlias =
"std::variant<" + GetTypeList(itemFields,
true ) +
">";
1660 auto nFields = itemFields.size();
1665 for (
unsigned int i = 0; i < nFields; ++i) {
1668 fTraits &= itemFields[i]->GetTraits();
1669 Attach(std::move(itemFields[i]),
"_" + std::to_string(i));
1680 const auto tagSize = GetVariantTagSize();
1681 const auto padding = tagSize - (
fMaxItemSize % tagSize);
1687 return std::unique_ptr<RVariantField>(
new RVariantField(newName, *
this));
1692 using TagType_t = RVariantTag<GetVariantTagSize()>::ValueType_t;
1693 auto tag = *
reinterpret_cast<const TagType_t *
>(
reinterpret_cast<const unsigned char *
>(variantPtr) + tagOffset);
1694 return (tag == TagType_t(-1)) ? 0 : tag + 1;
1699 using TagType_t = RVariantTag<GetVariantTagSize()>::ValueType_t;
1700 auto tagPtr =
reinterpret_cast<TagType_t *
>(
reinterpret_cast<unsigned char *
>(variantPtr) + tagOffset);
1701 *tagPtr = (tag == 0) ? TagType_t(-1) :
static_cast<TagType_t
>(tag - 1);
1707 std::size_t nbytes = 0;
1729 void *varPtr =
reinterpret_cast<unsigned char *
>(to) +
fVariantOffset;
1739 return representations;
1754 static const std::vector<std::string> prefixes = {
"std::variant<"};
1760 if (
fSubfields.size() != fieldDesc.GetLinkIds().size()) {
1779 RDeleter::operator()(objPtr, dtorOnly);
1784 std::vector<std::unique_ptr<RDeleter>> itemDeleters;
1794 return std::max(
fMaxAlignment,
alignof(RVariantTag<GetVariantTagSize()>::ValueType_t));
1800 const auto actualSize =
fTagOffset + GetVariantTagSize();
1802 return actualSize + ((padding ==
alignment) ? 0 : padding);
#define R__FAIL(msg)
Short-hand to return an RResult<T> in an error state; the RError is implicitly converted into RResult...
#define R__LOG_WARNING(...)
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
int Int_t
Signed integer 4 bytes (int)
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int)
if(isa< VarDecl >(D)||isa< FieldDecl >(D)||isa< EnumConstantDecl >(D))
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 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 Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t target
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 r
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 index
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 child
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char mode
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 Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t type
Abstract base class for classes implementing the visitor design pattern.
virtual void VisitProxiedCollectionField(const ROOT::RProxiedCollectionField &field)
virtual void VisitTObjectField(const ROOT::RField< TObject > &field)
virtual void VisitStreamerField(const ROOT::RStreamerField &field)
virtual void VisitEnumField(const ROOT::REnumField &field)
virtual void VisitClassField(const ROOT::RClassField &field)
void operator()(void *objPtr, bool dtorOnly) final
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
std::vector< std::size_t > fSoAMemberOffsets
The offset of the RVec members in the SoA type in the order of subfields of the underlying record typ...
const std::type_info * GetPolymorphicTypeInfo() const
For polymorphic classes (that declare or inherit at least one virtual method), return the expected dy...
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
std::vector< RFieldBase * > fRecordMemberFields
Direct access to the member fields of the underlying record.
RSoAField(std::string_view fieldName, const RSoAField &source)
Used by CloneImpl.
std::uint32_t GetTypeVersion() const final
Indicates an evolution of the C++ type itself.
std::size_t fMaxAlignment
std::uint32_t GetTypeChecksum() const final
Return the current TClass reported checksum of this class. Only valid if kTraitTypeChecksum is set.
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::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
void GenerateColumns() final
Implementations in derived classes should create the backing columns corresponding to the field type ...
ROOT::Internal::RColumnIndex fNWritten
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
Holds the index and the tag of a kSwitch column.
static std::string SerializeStreamerInfos(const StreamerInfoMap_t &infos)
const ROOT::RNTupleDescriptor & GetRef() const
Abstract interface to read data from an ntuple.
void RegisterStreamerInfos()
Builds the streamer info records from the descriptor's extra type info section. This is necessary whe...
const RSharedDescriptorGuard GetSharedDescriptorGuard() const
Takes the read lock for the descriptor. Multiple threads can take the lock concurrently....
void operator()(void *objPtr, bool dtorOnly) final
std::unique_ptr< RFieldBase > BeforeConnectPageSource(ROOT::Internal::RPageSource &pageSource) final
Called by ConnectPageSource() before connecting; derived classes may override this as appropriate,...
void AddReadCallbacksFromIORule(const TSchemaRule *rule)
Register post-read callback corresponding to a ROOT I/O customization rules.
TClass * fStagingClass
The TClass instance that corresponds to the staging area.
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
std::size_t fMaxAlignment
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
std::vector< RSubfieldInfo > fSubfieldsInfo
Additional information kept for each entry in fSubfields
void Attach(std::unique_ptr< RFieldBase > child, RSubfieldInfo info)
std::unique_ptr< unsigned char[]> fStagingArea
The staging area stores inputs to I/O rules according to the offsets given by the streamer info of "T...
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
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...
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
std::vector< const TSchemaRule * > FindRules(const ROOT::RFieldDescriptor *fieldDesc)
Given the on-disk information from the page source, find all the I/O customization rules that apply t...
ROOT::DescriptorId_t LookupMember(const ROOT::RNTupleDescriptor &desc, std::string_view memberName, ROOT::DescriptorId_t classFieldId)
Returns the id of member 'name' in the class field given by 'fieldId', or kInvalidDescriptorId if no ...
void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final
std::uint32_t GetTypeVersion() const final
Indicates an evolution of the C++ type itself.
RClassField(std::string_view fieldName, const RClassField &source)
Used by CloneImpl.
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
void PrepareStagingArea(const std::vector< const TSchemaRule * > &rules, const ROOT::RNTupleDescriptor &desc, const ROOT::RFieldDescriptor &classFieldId)
If there are rules with inputs (source members), create the staging area according to the TClass inst...
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
const std::type_info * GetPolymorphicTypeInfo() const
For polymorphic classes (that declare or inherit at least one virtual method), return the expected dy...
std::uint32_t GetTypeChecksum() const final
Return the current TClass reported checksum of this class. Only valid if kTraitTypeChecksum is set.
std::unordered_map< std::string, RStagingItem > fStagingItems
Lookup staging items by member name.
static constexpr const char * kPrefixInherited
Prefix used in the subfield names generated for base classes.
void SetStagingClass(const std::string &className, unsigned int classVersion)
Sets fStagingClass according to the given name and version.
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
REnumField(std::string_view fieldName, TEnum *enump)
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
Base class for all ROOT issued exceptions.
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.
virtual size_t GetValueSize() const =0
The number of bytes taken by a value of the appropriate type.
void Attach(std::unique_ptr< RFieldBase > child, std::string_view expectedChildName="")
Add a new subfield to the list of nested fields.
ROOT::Internal::RColumn * fPrincipalColumn
All fields that have columns have a distinct main column.
std::vector< std::unique_ptr< RFieldBase > > fSubfields
Collections and classes own subfields.
std::vector< const RFieldBase * > GetConstSubfields() const
@ 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.
@ kTraitSoACollection
The field represents a collection in SoA layout.
@ kTraitTypeChecksum
The TClass checksum is set and valid.
static std::unique_ptr< RDeleter > GetDeleterOf(const RFieldBase &other)
static ROOT::Internal::RColumn * GetPrincipalColumnOf(const RFieldBase &other)
Fields may need direct access to the principal column of their subfields, e.g. in RRVecField::ReadBul...
ROOT::Internal::RColumn * fAuxiliaryColumn
Some fields have a second column in its column representation.
RResult< void > EnsureMatchingOnDiskCollection(const RNTupleDescriptor &desc) const
Convenience wrapper for the common case of calling EnsureMatchinOnDiskField() for collections.
static void CallSetArtificialOn(RFieldBase &other)
Allow parents to mark their childs as artificial fields (used in class and record fields)
std::string GetQualifiedFieldName() const
Returns the field name and parent field names separated by dots (grandparent.parent....
const std::string & GetFieldName() const
std::vector< ReadCallback_t > fReadCallbacks
List of functions to be called after reading a value.
RResult< void > EnsureMatchingOnDiskField(const RNTupleDescriptor &desc, std::uint32_t ignoreBits=0) const
Compares the field to the corresponding on-disk field information in the provided descriptor.
const std::string & GetTypeAlias() const
static std::size_t CallAppendOn(RFieldBase &other, const void *from)
Allow derived classes to call Append() and Read() on other (sub)fields.
std::uint32_t fTraits
Properties of the type that allow for optimizations of collections of that type.
RFieldBase(std::string_view name, std::string_view type, ROOT::ENTupleStructure structure, bool isSimple, std::size_t nRepetitions=0)
The constructor creates the underlying column objects and connects them to either a sink or a source.
static RResult< std::unique_ptr< RFieldBase > > Create(const std::string &fieldName, const std::string &typeName, const ROOT::RCreateFieldOptions &options, const ROOT::RNTupleDescriptor *desc, ROOT::DescriptorId_t fieldId)
Factory method to resurrect a field from the stored on-disk type information.
std::string fTypeAlias
A typedef or using name that was used when creating the field.
std::uint32_t GetTraits() const
const std::string & GetTypeName() const
void GenerateColumnsImpl(const ColumnRepresentation_t &representation, std::uint16_t representationIndex)
Helpers for generating columns.
RValue BindValue(std::shared_ptr< void > objPtr)
Creates a value from a memory location with an already constructed object.
static void CallReadOn(RFieldBase &other, RNTupleLocalIndex localIndex, void *to)
ROOT::DescriptorId_t GetOnDiskId() const
std::unique_ptr< RFieldBase > Clone(std::string_view newName) const
Copies the field and its subfields using a possibly new name and a new, unconnected set of columns.
static void CallConstructValueOn(const RFieldBase &other, void *where)
Allow derived classes to call ConstructValue(void *) and GetDeleter() on other (sub)fields.
RResult< void > EnsureMatchingTypePrefix(const RNTupleDescriptor &desc, const std::vector< std::string > &prefixes) const
Many fields accept a range of type prefixes for schema evolution, e.g.
@ kDiffTypeName
The in-memory field and the on-disk field have different type names.
@ kDiffTypeVersion
The in-memory field and the on-disk field differ in the type version.
Metadata stored for every field of an RNTuple.
ROOT::DescriptorId_t GetId() const
const std::vector< ROOT::DescriptorId_t > & GetLinkIds() const
std::optional< std::uint32_t > GetTypeChecksum() const
std::uint32_t GetTypeVersion() const
const std::string & GetTypeName() const
void ReadTObject(void *to, UInt_t uniqueID, UInt_t bits)
RField(std::string_view fieldName, const RField< TObject > &source)
Used by CloneImpl()
static std::size_t GetOffsetBits()
static std::size_t GetOffsetUniqueID()
Classes with dictionaries that can be inspected by TClass.
RField(std::string_view name)
RMapField(std::string_view fieldName, EMapType mapType, std::unique_ptr< RFieldBase > itemField)
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
The on-storage metadata of an RNTuple.
RFieldDescriptorIterable GetFieldIterable(const RFieldDescriptor &fieldDesc) const
const RFieldDescriptor & GetFieldDescriptor(ROOT::DescriptorId_t fieldId) const
const std::string & GetName() const
std::string GetTypeNameForComparison(const RFieldDescriptor &fieldDesc) const
Adjust the type name of the passed RFieldDescriptor for comparison with another renormalized type nam...
ROOT::DescriptorId_t FindFieldId(std::string_view fieldName, ROOT::DescriptorId_t parentId) const
Addresses a column element or field item relative to a particular cluster, instead of a global NTuple...
Template specializations for C++ std::pair.
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
RPairField(std::string_view fieldName, std::array< std::unique_ptr< RFieldBase >, 2 > itemFields)
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
Allows for iterating over the elements of a proxied collection.
static RIteratorFuncs GetIteratorFuncs(TVirtualCollectionProxy *proxy, bool readFromDisk)
std::shared_ptr< TVirtualCollectionProxy > fProxy
RCollectionIterableOnce::RIteratorFuncs fIFuncsWrite
std::unique_ptr< RDeleter > fItemDeleter
void operator()(void *objPtr, bool dtorOnly) final
void GenerateColumns() final
Implementations in derived classes should create the backing columns corresponding to the field type ...
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const override
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.
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
RProxiedCollectionField(std::string_view fieldName, TClass *classp)
Constructor used when the value type of the collection is not known in advance, i....
RCollectionIterableOnce::RIteratorFuncs fIFuncsWrite
ROOT::Internal::RColumnIndex fNWritten
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
RCollectionIterableOnce::RIteratorFuncs fIFuncsRead
Two sets of functions to operate on iterators, to be used depending on the access type.
std::shared_ptr< TVirtualCollectionProxy > fProxy
The collection proxy is needed by the deleters and thus defined as a shared pointer.
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
std::unique_ptr< RDeleter > GetDeleter() const final
void ReconcileOnDiskField(const RNTupleDescriptor &desc) override
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
Template specializations for ROOT's RVec.
RRecordField(std::string_view name, const RRecordField &source)
void AttachItemFields(ContainerT &&itemFields)
std::vector< std::size_t > fOffsets
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
RSetField(std::string_view fieldName, ESetType setType, std::unique_ptr< RFieldBase > itemField)
void operator()(void *objPtr, bool dtorOnly) final
ROOT::RExtraTypeInfoDescriptor GetExtraTypeInfo() const final
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
ROOT::Internal::RNTupleSerializer::StreamerInfoMap_t fStreamerInfos
streamer info records seen during writing
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
std::uint32_t GetTypeVersion() const final
Indicates an evolution of the C++ type itself.
void GenerateColumns() final
Implementations in derived classes should create the backing columns corresponding to the field type ...
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
ROOT::Internal::RColumnIndex fIndex
number of bytes written in the current cluster
std::uint32_t GetTypeChecksum() const final
Return the current TClass reported checksum of this class. Only valid if kTraitTypeChecksum is set.
std::unique_ptr< RFieldBase > BeforeConnectPageSource(ROOT::Internal::RPageSource &source) final
Called by ConnectPageSource() before connecting; derived classes may override this as appropriate,...
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
RStreamerField(std::string_view fieldName, TClass *classp)
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
const RColumnRepresentations & GetColumnRepresentations() const final
Implementations in derived classes should return a static RColumnRepresentations object.
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
RTupleField(std::string_view fieldName, std::vector< std::unique_ptr< RFieldBase > > itemFields)
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
std::vector< std::unique_ptr< RDeleter > > fItemDeleters
std::size_t fVariantOffset
void operator()(void *objPtr, bool dtorOnly) final
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
static constexpr std::size_t kMaxVariants
std::vector< ROOT::Internal::RColumnIndex::ValueType > fNWritten
static std::uint8_t GetTag(const void *variantPtr, std::size_t tagOffset)
Extracts the index from an std::variant and transforms it into the 1-based index used for the switch ...
void GenerateColumns() final
Implementations in derived classes should create the backing columns corresponding to the field type ...
size_t fVariantOffset
In the std::variant memory layout, the actual union of types may start at an offset > 0.
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
std::unique_ptr< RDeleter > GetDeleter() const final
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
const RColumnRepresentations & GetColumnRepresentations() const final
Implementations in derived classes should return a static RColumnRepresentations object.
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
size_t fTagOffset
In the std::variant memory layout, at which byte number is the index stored.
RVariantField(std::string_view name, const RVariantField &source)
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
static void SetTag(void *variantPtr, std::size_t tagOffset, std::uint8_t tag)
void CommitClusterImpl() final
ReadFuncPtr_t GetReadFunctionPointer() const
Get the pointer to the function to be run for the rule (if it is a read rule).
The concrete implementation of TBuffer for writing/reading to/from a ROOT file or socket.
TClass instances represent classes, structs and namespaces in the ROOT type system.
UInt_t GetCheckSum(ECheckSum code=kCurrentCheckSum) const
Call GetCheckSum with validity check.
Bool_t CanSplit() const
Return true if the data member of this TClass can be saved separately.
void BuildRealData(void *pointer=nullptr, Bool_t isTransient=kFALSE)
Build a full list of persistent data members.
TList * GetListOfDataMembers(Bool_t load=kTRUE)
Return list containing the TDataMembers of a class.
TList * GetListOfRealData() const
Int_t Size() const
Return size of object of this class.
TVirtualStreamerInfo * GetStreamerInfo(Int_t version=0, Bool_t isTransient=kFALSE) const
returns a pointer to the TVirtualStreamerInfo object for version If the object does not exist,...
TVirtualCollectionProxy * GetCollectionProxy() const
Return the proxy describing the collection (if any).
Long_t Property() const override
Returns the properties of the TClass as a bit field stored as a Long_t value.
Version_t GetClassVersion() const
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
All ROOT classes may have RTTI (run time type identification) support added.
The TEnum class implements the enum type.
EDataType GetUnderlyingType() const
Get the underlying integer type of the enum: enum E { kOne }; // ==> int enum F: long; // ==> long Re...
Long_t Property() const override
Get property description word. For meaning of bits see EProperty.
static TEnum * GetEnum(const std::type_info &ti, ESearchAction sa=kALoadAndInterpLookup)
const char * GetName() const override
Returns name of object.
Mother of all ROOT objects.
@ kIsOnHeap
object is on heap
@ kNotDeleted
object has not been deleted
@ kIsReferenced
if object is referenced by a TRef or TRefArray
RAII helper class that ensures that PushProxy() / PopProxy() are called when entering / leaving a C++...
Defines a common interface to inspect/change the contents of an object that represents a collection.
@ kNeedDelete
The collection contains directly or indirectly (via other collection) some pointers that need explici...
virtual Next_t GetFunctionNext(Bool_t read=kTRUE)=0
Return a pointer to a function that can advance an iterator (see Next_t).
virtual DeleteTwoIterators_t GetFunctionDeleteTwoIterators(Bool_t read=kTRUE)=0
virtual CreateIterators_t GetFunctionCreateIterators(Bool_t read=kTRUE)=0
Return a pointer to a function that can create an iterator pair, where each iterator points to the be...
Abstract Interface class describing Streamer information for one class.
virtual Int_t GetNumber() const =0
TRangeCast< T, false > TRangeStaticCast
TRangeStaticCast is an adapter class that allows the typed iteration through a TCollection.
void SetAllowFieldSubstitutions(RFieldZero &fieldZero, bool val)
std::tuple< unsigned char **, std::int32_t *, std::int32_t * > GetRVecDataMembers(void *rvecPtr)
Retrieve the addresses of the data members of a generic RVec from a pointer to the beginning of the R...
ROOT::RLogChannel & NTupleLog()
Log channel for RNTuple diagnostics.
void CallConnectPageSourceOnField(RFieldBase &, ROOT::Internal::RPageSource &)
std::string GetRNTupleSoARecord(const TClass *cl)
Checks if the "rntuple.SoARecord" class attribute is set in the dictionary.
bool NeedsMetaNameAsAlias(const std::string &metaNormalizedName, std::string &renormalizedAlias, bool isArgInTemplatedUserClass=false)
Checks if the meta normalized name is different from the RNTuple normalized name in a way that would ...
std::string GetTypeTraceReport(const RFieldBase &field, const RNTupleDescriptor &desc)
Prints the hierarchy of types with their field names and field IDs for the given in-memory field and ...
ERNTupleSerializationMode GetRNTupleSerializationMode(const TClass *cl)
std::string GetRenormalizedTypeName(const std::string &metaNormalizedName)
Given a type name normalized by ROOT meta, renormalize it for RNTuple. E.g., insert std::prefix.
std::uint64_t DescriptorId_t
Distriniguishes elements of the same type within a descriptor, e.g. different fields.
std::uint64_t NTupleSize_t
Integer type long enough to hold the maximum number of entries in a column.
constexpr DescriptorId_t kInvalidDescriptorId
ENTupleStructure
The fields in the RNTuple data model tree can carry different structural information about the type s...
void GetNormalizedName(std::string &norm_name, std::string_view name)
Return the normalized name.
std::size_t fOffset
offset in fStagingArea
std::unique_ptr< RFieldBase > fField
The field used to read the on-disk data.
TVirtualCollectionProxy::Next_t fNext
TVirtualCollectionProxy::CreateIterators_t fCreateIterators
TVirtualCollectionProxy::DeleteTwoIterators_t fDeleteTwoIterators