33#include <unordered_set>
42 const std::string childName = child->GetFieldName();
56 auto result = std::make_unique<RFieldZero>();
58 result->Attach(
f->Clone(
f->GetFieldName()));
59 result->fSubfieldNames.insert(
f->GetFieldName());
66 std::vector<std::unique_ptr<ROOT::RFieldBase>> result;
68 for (
auto &
f : result)
87 return representations;
101 if (fieldDesc.GetTypeName().rfind(
"ROOT::RNTupleCardinality<", 0) != 0) {
103 " expects an on-disk leaf field of the same type\n" +
107 if (!fieldDesc.IsSoACollection() && fieldDesc.GetTypeVersion() != 0) {
145 static const std::string gIntegralTypeNames[] = {
"bool",
"char",
"std::int8_t",
"std::uint8_t",
146 "std::int16_t",
"std::uint16_t",
"std::int32_t",
"std::uint32_t",
147 "std::int64_t",
"std::uint64_t"};
148 if (std::find(std::begin(gIntegralTypeNames), std::end(gIntegralTypeNames), fieldDesc.
GetTypeName()) ==
149 std::end(gIntegralTypeNames)) {
188 return representations;
203 return representations;
213template class ROOT::RSimpleField<int8_t>;
232 return representations;
235void ROOT::RIntegralField<std::int8_t>::AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor)
const
242template class ROOT::RSimpleField<uint8_t>;
261 return representations;
264void ROOT::RIntegralField<std::uint8_t>::AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor)
const
271template class ROOT::RSimpleField<bool>;
290 return representations;
310 return representations;
332 return representations;
366 return representations;
369void ROOT::RIntegralField<std::int16_t>::AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor)
const
376template class ROOT::RSimpleField<uint16_t>;
395 return representations;
398void ROOT::RIntegralField<std::uint16_t>::AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor)
const
405template class ROOT::RSimpleField<int32_t>;
424 return representations;
427void ROOT::RIntegralField<std::int32_t>::AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor)
const
434template class ROOT::RSimpleField<uint32_t>;
453 return representations;
456void ROOT::RIntegralField<std::uint32_t>::AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor)
const
463template class ROOT::RSimpleField<uint64_t>;
482 return representations;
485void ROOT::RIntegralField<std::uint64_t>::AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor)
const
492template class ROOT::RSimpleField<int64_t>;
511 return representations;
514void ROOT::RIntegralField<std::int64_t>::AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor)
const
528 return representations;
533 GenerateColumnsImpl<ROOT::Internal::RColumnIndex, char>();
538 GenerateColumnsImpl<ROOT::Internal::RColumnIndex, char>(desc);
543 auto typedValue =
static_cast<const std::string *
>(from);
544 auto length = typedValue->length();
545 fAuxiliaryColumn->AppendV(typedValue->data(), length);
547 fPrincipalColumn->Append(&fIndex);
548 return length + fPrincipalColumn->GetElement()->GetPackedSize();
553 auto typedValue =
static_cast<std::string *
>(to);
556 fPrincipalColumn->GetCollectionInfo(globalIndex, &collectionStart, &nChars);
560 typedValue->resize(nChars);
561 fAuxiliaryColumn->ReadV(collectionStart, nChars,
const_cast<char *
>(typedValue->data()));
579 Attach(
f->Clone(
f->GetFieldName()));
589std::unique_ptr<ROOT::RFieldBase>
591 std::vector<std::unique_ptr<RFieldBase>> itemFields,
592 std::string_view emulatedFromType)
595 return std::unique_ptr<RFieldBase>(
new RRecordField(fieldName, std::move(itemFields), emulatedFromType));
599 std::unique_ptr<RFieldBase> itemField,
600 std::string_view emulatedFromType)
603 return std::unique_ptr<RFieldBase>(
new RVectorField(fieldName, std::move(itemField), emulatedFromType));
607 std::string_view emulatedFromType)
626 fSize += item->GetValueSize();
633 const std::string itemName = item->GetFieldName();
645 record.
AddItem(std::move(newItem));
650 if (itemAlignment > 1) {
651 auto remainder = baseOffset % itemAlignment;
653 return itemAlignment - remainder;
660 return std::unique_ptr<RRecordField>(
new RRecordField(newName, *
this));
665 std::size_t nbytes = 0;
666 for (
unsigned i = 0; i <
fSubfields.size(); ++i) {
674 for (
unsigned i = 0; i <
fSubfields.size(); ++i) {
681 for (
unsigned i = 0; i <
fSubfields.size(); ++i) {
701 std::unordered_set<std::string_view> onDiskSubfields;
703 onDiskSubfields.insert(subField.GetFieldName());
706 if (onDiskSubfields.count(
f->GetFieldName()) == 0)
713 for (
unsigned i = 0; i <
fSubfields.size(); ++i) {
723 RDeleter::operator()(objPtr, dtorOnly);
728 std::vector<std::unique_ptr<RDeleter>> itemDeleters;
729 itemDeleters.reserve(
fOffsets.size());
733 return std::make_unique<RRecordDeleter>(std::move(itemDeleters),
fOffsets);
738 auto valuePtr = value.
GetPtr<
void>();
739 auto charPtr =
static_cast<unsigned char *
>(valuePtr.get());
740 std::vector<RValue> result;
742 for (
unsigned i = 0; i <
fSubfields.size(); ++i) {
766 return representations;
779template <
typename FUlong,
typename FUlonglong,
typename... Args>
782 if (
WordSize() ==
sizeof(
unsigned long)) {
784 }
else if (
WordSize() ==
sizeof(
unsigned long long)) {
792template <
typename Word_t>
795 constexpr auto kBitsPerWord =
sizeof(Word_t) * 8;
797 const auto *asWordArray =
static_cast<const Word_t *
>(from);
800 for (std::size_t word = 0; word < (nBits + kBitsPerWord - 1) / kBitsPerWord; ++word) {
801 for (std::size_t mask = 0; (mask < kBitsPerWord) && (i < nBits); ++mask, ++i) {
802 elementValue = (asWordArray[word] & (
static_cast<Word_t
>(1) << mask)) != 0;
803 column.
Append(&elementValue);
814template <
typename Word_t>
818 constexpr auto kBitsPerWord =
sizeof(Word_t) * 8;
820 auto *asWordArray =
static_cast<Word_t *
>(to);
822 for (std::size_t i = 0; i < nBits; ++i) {
823 column.
Read(globalIndex * nBits + i, &elementValue);
824 Word_t mask =
static_cast<Word_t
>(1) << (i % kBitsPerWord);
825 Word_t bit =
static_cast<Word_t
>(elementValue) << (i % kBitsPerWord);
826 asWordArray[i / kBitsPerWord] = (asWordArray[i / kBitsPerWord] & ~mask) | bit;
835template <
typename Word_t>
839 constexpr auto kBitsPerWord =
sizeof(Word_t) * 8;
841 auto *asWordArray =
static_cast<Word_t *
>(to);
843 for (std::size_t i = 0; i < nBits; ++i) {
846 Word_t mask =
static_cast<Word_t
>(1) << (i % kBitsPerWord);
847 Word_t bit =
static_cast<Word_t
>(elementValue) << (i % kBitsPerWord);
848 asWordArray[i / kBitsPerWord] = (asWordArray[i / kBitsPerWord] & ~mask) | bit;
865 std::unique_ptr<RFieldBase> itemField)
869 if (!itemField->GetTypeAlias().empty())
870 fTypeAlias = typePrefix +
"<" + itemField->GetTypeAlias() +
">";
872 Attach(std::move(itemField),
"_0");
882 return representations;
913 static const std::vector<std::string> prefixes = {
"std::optional<",
"std::unique_ptr<"};
931 fPrincipalColumn->GetCollectionInfo(globalIndex, &collectionStart, &collectionSize);
939 fPrincipalColumn->GetCollectionInfo(localIndex, &collectionStart, &collectionSize);
952struct PolymorphicClass {
953 virtual ~PolymorphicClass() =
default;
968 return std::make_unique<RUniquePtrField>(newName, std::move(newItemField));
973 auto typedValue =
static_cast<const std::unique_ptr<char> *
>(from);
975 const void *obj = typedValue->get();
979 const std::type_info &t =
typeid(*
static_cast<const PolymorphicClass *
>(obj));
981 std::string msg =
"invalid dynamic type of object, expected " +
fSubfields[0]->GetTypeName();
985 msg = msg +
" but was passed " + demangled;
988 msg +=
" and upcasting of polymorphic types is not supported in RNTuple";
1000 auto ptr =
static_cast<std::unique_ptr<char> *
>(to);
1001 bool isValidValue =
static_cast<bool>(*ptr);
1003 void *valuePtr =
nullptr;
1005 valuePtr = ptr->get();
1007 if (isValidValue && !hasOnDiskValue) {
1010 }
else if (!isValidValue && hasOnDiskValue) {
1012 ptr->reset(
reinterpret_cast<char *
>(valuePtr));
1025 if (hasOnDiskValue) {
1040 itemIndex = localIndex;
1050 auto typedPtr =
static_cast<std::unique_ptr<char> *
>(objPtr);
1053 typedPtr->release();
1055 RDeleter::operator()(objPtr, dtorOnly);
1065 std::vector<RValue> result;
1066 auto valuePtr = value.
GetPtr<
void>();
1067 const auto &uniquePtr = *
static_cast<std::unique_ptr<char> *
>(valuePtr.get());
1069 result.emplace_back(
fSubfields[0]->
BindValue(std::shared_ptr<void>(valuePtr, uniquePtr.get())));
1085 return reinterpret_cast<bool *
>(
reinterpret_cast<unsigned char *
>(optionalPtr) +
fSubfields[0]->GetValueSize());
1096 return std::make_unique<ROptionalField>(newName, std::move(newItemField));
1111 if (hasOnDiskValue) {
1114 *engagementPtr =
true;
1118 *engagementPtr =
false;
1129 if (hasOnDiskValue) {
1144 itemIndex = localIndex;
1160 auto engagementPtr =
reinterpret_cast<bool *
>(
reinterpret_cast<unsigned char *
>(objPtr) +
fEngagementPtrOffset);
1164 RDeleter::operator()(objPtr, dtorOnly);
1169 return std::make_unique<ROptionalDeleter>(
1176 std::vector<RValue> result;
1177 const auto valuePtr = value.
GetPtr<
void>().get();
1188 const auto actualSize =
fSubfields[0]->GetValueSize() +
sizeof(
bool);
1191 auto remainder = actualSize %
alignment;
1195 return actualSize + padding;
1214 if (!itemField->GetTypeAlias().empty())
1215 fTypeAlias =
"std::atomic<" + itemField->GetTypeAlias() +
">";
1217 Attach(std::move(itemField),
"_0");
1223 return std::make_unique<RAtomicField>(newName, std::move(newItemField));
1229 if (fieldDesc.GetTypeName().rfind(
"std::atomic<", 0) == 0) {
1238 std::vector<RValue> result;
#define R__FAIL(msg)
Short-hand to return an RResult<T> in an error state; the RError is implicitly converted into RResult...
static void BitsetReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to, size_t nBits, ROOT::Internal::RColumn &column)
static void BitsetReadInClusterImpl(ROOT::RNTupleLocalIndex localIndex, void *to, size_t nBits, ROOT::Internal::RColumn &column)
static void BitsetAppendImpl(const void *from, size_t nBits, ROOT::Internal::RColumn &column)
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
Abstract base class for classes implementing the visitor design pattern.
virtual void VisitBitsetField(const ROOT::RBitsetField &field)
virtual void VisitByteField(const ROOT::RField< std::byte > &field)
virtual void VisitInt64Field(const ROOT::RIntegralField< std::int64_t > &field)
virtual void VisitInt8Field(const ROOT::RIntegralField< std::int8_t > &field)
virtual void VisitCharField(const ROOT::RField< char > &field)
virtual void VisitDoubleField(const ROOT::RField< double > &field)
virtual void VisitUInt32Field(const ROOT::RIntegralField< std::uint32_t > &field)
virtual void VisitCardinalityField(const ROOT::RCardinalityField &field)
virtual void VisitInt32Field(const ROOT::RIntegralField< std::int32_t > &field)
virtual void VisitUInt8Field(const ROOT::RIntegralField< std::uint8_t > &field)
virtual void VisitFieldZero(const ROOT::RFieldZero &field)
virtual void VisitStringField(const ROOT::RField< std::string > &field)
virtual void VisitUInt16Field(const ROOT::RIntegralField< std::uint16_t > &field)
virtual void VisitNullableField(const ROOT::RNullableField &field)
virtual void VisitInt16Field(const ROOT::RIntegralField< std::int16_t > &field)
virtual void VisitUInt64Field(const ROOT::RIntegralField< std::uint64_t > &field)
virtual void VisitBoolField(const ROOT::RField< bool > &field)
virtual void VisitRecordField(const ROOT::RRecordField &field)
virtual void VisitAtomicField(const ROOT::RAtomicField &field)
virtual void VisitFloatField(const ROOT::RField< float > &field)
The in-memory representation of a 32bit or 64bit on-disk index column.
A column is a storage-backed array of a simple, fixed-size type, from which pages can be mapped into ...
void Read(const ROOT::NTupleSize_t globalIndex, void *to)
void Append(const void *from)
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
RAtomicField(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField)
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
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.
RBitsetField(std::string_view fieldName, std::size_t N)
void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final
void GenerateColumns() final
Implementations in derived classes should create the backing columns corresponding to the field type ...
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.
const RColumnRepresentations & GetColumnRepresentations() const final
Implementations in derived classes should return a static RColumnRepresentations object.
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
void SelectWordSize(FUlong &&fUlong, FUlonglong &&fUlonglong, Args &&...args)
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
const RColumnRepresentations & GetColumnRepresentations() const final
Implementations in derived classes should return a static RColumnRepresentations object.
const RField< RNTupleCardinality< std::uint32_t > > * As32Bit() const
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
const RField< RNTupleCardinality< std::uint64_t > > * As64Bit() const
void GenerateColumns() final
Implementations in derived classes should create the backing columns corresponding to the field type ...
The field for a class with dictionary.
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
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.
std::shared_ptr< T > GetPtr() const
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.
virtual const RColumnRepresentations & GetColumnRepresentations() const
Implementations in derived classes should return a static RColumnRepresentations object.
std::vector< const RFieldBase * > GetConstSubfields() const
void SetOnDiskId(ROOT::DescriptorId_t id)
@ kTraitEmulatedField
This field is a user defined type that was missing dictionaries and was reconstructed from the on-dis...
@ kTraitTriviallyDestructible
The type is cleaned up just by freeing its memory. I.e. the destructor performs a no-op.
@ kTraitExtensible
Can attach new item fields even when already connected.
@ kTraitTriviallyConstructible
No constructor needs to be called, i.e.
virtual void GenerateColumns()
Implementations in derived classes should create the backing columns corresponding to the field type ...
static std::unique_ptr< RDeleter > GetDeleterOf(const RFieldBase &other)
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
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.
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 void * CallCreateObjectRawPtrOn(RFieldBase &other)
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
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.
@ kDiffStructure
The in-memory field and the on-disk field differ in their structural roles.
@ 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.
const std::string & GetTypeName() const
The container field for an ntuple model, which itself has no physical representation.
std::unordered_set< std::string > fSubfieldNames
Efficient detection of duplicate field names.
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
std::vector< std::unique_ptr< RFieldBase > > ReleaseSubfields()
Moves all subfields into the returned vector.
bool fAllowFieldSubstitutions
If field substitutions are allowed, upon connecting to a page source the field hierarchy will replace...
void Attach(std::unique_ptr< RFieldBase > child)
A public version of the Attach method that allows piece-wise construction of the zero field.
Classes with dictionaries that can be inspected by TClass.
The on-storage metadata of an RNTuple.
RFieldDescriptorIterable GetFieldIterable(const RFieldDescriptor &fieldDesc) const
const RFieldDescriptor & GetFieldDescriptor(ROOT::DescriptorId_t fieldId) const
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...
ROOT::NTupleSize_t GetIndexInCluster() const
ROOT::DescriptorId_t GetClusterId() const
void ReconcileOnDiskField(const RNTupleDescriptor &desc) final
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
ROOT::Internal::RColumnIndex fNWritten
The number of written non-null items in this cluster.
RNTupleLocalIndex GetItemIndex(NTupleSize_t globalIndex)
Given the global index of the nullable field, returns the corresponding cluster-local index of the su...
RNullableField(std::string_view fieldName, const std::string &typePrefix, std::unique_ptr< RFieldBase > itemField)
std::size_t AppendValue(const void *from)
void GenerateColumns() final
Implementations in derived classes should create the backing columns corresponding to the field type ...
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
const RFieldBase::RColumnRepresentations & GetColumnRepresentations() const final
Implementations in derived classes should return a static RColumnRepresentations object.
bool fIsEvolvedFromInnerType
std::size_t fEngagementPtrOffset
std::unique_ptr< RDeleter > fItemDeleter
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...
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
std::unique_ptr< RDeleter > GetDeleter() const final
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
std::unique_ptr< RDeleter > fItemDeleter
const bool * GetEngagementPtr(const void *optionalPtr) const
Given a pointer to an std::optional<T> in optionalPtr, extract a pointer to the engagement boolean.
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.
void ReadInClusterImpl(ROOT::RNTupleLocalIndex localIndex, void *to) final
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
void PrepareRead(void *to, bool hasOnDiskValue)
ROptionalField(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField)
std::vector< std::size_t > fOffsets
std::vector< std::unique_ptr< RDeleter > > fItemDeleters
void operator()(void *objPtr, bool dtorOnly) final
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.
std::size_t fMaxAlignment
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const override
Called by Clone(), which additionally copies the on-disk ID.
void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final
std::unordered_set< std::string > fSubfieldNames
Efficient detection of duplicate field names.
RRecordField(std::string_view name, const RRecordField &source)
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
void AttachItemFields(ContainerT &&itemFields)
std::unique_ptr< RDeleter > GetDeleter() const final
bool IsPairOrTuple() const
std::size_t GetItemPadding(std::size_t baseOffset, std::size_t itemAlignment) const
void AddItem(std::unique_ptr< RFieldBase > item)
Adds an additional item field.
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
std::vector< std::size_t > fOffsets
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
void ReconcileOnDiskField(const RNTupleDescriptor &desc) override
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
void ReconcileIntegralField(const RNTupleDescriptor &desc)
void ReconcileFloatingPointField(const RNTupleDescriptor &desc)
std::unique_ptr< RDeleter > fItemDeleter
void operator()(void *objPtr, bool dtorOnly) final
std::unique_ptr< RDeleter > fItemDeleter
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 * fPolymorphicTypeInfo
If the item type is a polymorphic class (that declares or inherits at least one virtual method),...
void * PrepareRead(void *to, bool hasOnDiskValue)
std::unique_ptr< RDeleter > GetDeleter() const final
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
RUniquePtrField(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField)
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
void ReadInClusterImpl(ROOT::RNTupleLocalIndex localIndex, void *to) final
Template specializations for C++ std::vector.
void SetAllowFieldSubstitutions(RFieldZero &fieldZero, bool val)
std::unique_ptr< RFieldBase > CreateEmulatedVectorField(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField, std::string_view emulatedFromType)
if(pos!=-1) leafTypeName.Remove(pos)
std::unique_ptr< RFieldBase > CreateEmulatedRecordField(std::string_view fieldName, std::vector< std::unique_ptr< RFieldBase > > itemFields, std::string_view emulatedFromType)
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 ...
void AddItemToRecord(RRecordField &record, std::unique_ptr< RFieldBase > newItem)
bool IsCustomEnumFieldDesc(const RNTupleDescriptor &desc, const RFieldDescriptor &fieldDesc)
Tells if the field describes a user-defined enum type.
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 RNTuple data model tree can carry different structural information about the type s...
char * DemangleTypeIdName(const std::type_info &ti, int &errorCode)
Demangle in a portable way the type id name.
BVH_ALWAYS_INLINE T length(const Vec< T, N > &v)