24class CreateContextGuard;
26 friend class CreateContextGuard;
28 std::vector<std::string> fClassesOnStack;
31 bool fContinueOnError =
false;
34 CreateContext() =
default;
39class CreateContextGuard {
40 CreateContext &fCreateContext;
41 std::size_t fNOriginalClassesOnStack;
42 bool fOriginalContinueOnError;
45 CreateContextGuard(CreateContext &ctx)
46 : fCreateContext(ctx),
47 fNOriginalClassesOnStack(ctx.fClassesOnStack.
size()),
48 fOriginalContinueOnError(ctx.fContinueOnError)
53 fCreateContext.fClassesOnStack.resize(fNOriginalClassesOnStack);
54 fCreateContext.fContinueOnError = fOriginalContinueOnError;
59 if (std::find(fCreateContext.fClassesOnStack.begin(), fCreateContext.fClassesOnStack.end(), cl) !=
60 fCreateContext.fClassesOnStack.end()) {
63 fCreateContext.fClassesOnStack.emplace_back(cl);
77 field.CommitCluster();
126 : fField(
other.fField),
128 fCapacity(
other.fCapacity),
130 fIsAdopted(
other.fIsAdopted),
131 fNValidValues(
other.fNValidValues),
132 fFirstIndex(
other.fFirstIndex)
141 std::swap(fField,
other.fField);
142 std::swap(fDeleter,
other.fDeleter);
143 std::swap(fValues,
other.fValues);
145 std::swap(fCapacity,
other.fCapacity);
147 std::swap(fIsAdopted,
other.fIsAdopted);
148 std::swap(fMaskAvail,
other.fMaskAvail);
149 std::swap(fNValidValues,
other.fNValidValues);
150 std::swap(fFirstIndex,
other.fFirstIndex);
166 for (std::size_t i = 0; i < fCapacity; ++i) {
167 fDeleter->operator()(GetValuePtrAt(i),
true );
171 operator delete(fValues);
176 if (fCapacity <
size) {
178 throw RException(
R__FAIL(
"invalid attempt to bulk read beyond the adopted buffer"));
184 for (std::size_t i = 0; i <
size; ++i) {
185 fField->ConstructValue(GetValuePtrAt(i));
189 fMaskAvail = std::make_unique<bool[]>(
size);
193 std::fill(fMaskAvail.get(), fMaskAvail.get() +
size,
false);
204 fCapacity = capacity;
207 fMaskAvail = std::make_unique<bool[]>(capacity);
222std::unique_ptr<void, typename ROOT::RFieldBase::RCreateObjectDeleter<void>::deleter>
223ROOT::RFieldBase::CreateObject<void>()
const
247 std::string
result = GetFieldName();
248 auto parent = GetParent();
249 while (parent && !parent->GetFieldName().empty()) {
251 parent = parent->GetParent();
263std::vector<ROOT::RFieldBase::RCheckResult>
268 cfOpts.SetReturnInvalidOnError(
true);
269 cfOpts.SetEmulateUnknownTypes(
false);
272 std::vector<RCheckResult>
result;
314 std::unique_ptr<ROOT::RFieldBase>
result;
365 }
else if (
resolvedType.substr(0, 12) ==
"std::vector<") {
369 }
else if (
resolvedType.substr(0, 19) ==
"ROOT::VecOps::RVec<") {
373 }
else if (
resolvedType.substr(0, 11) ==
"std::array<") {
381 }
else if (
resolvedType.substr(0, 13) ==
"std::variant<") {
383 std::vector<std::unique_ptr<RFieldBase>>
items;
385 for (
unsigned int i = 0; i <
innerTypes.size(); ++i) {
390 }
else if (
resolvedType.substr(0, 10) ==
"std::pair<") {
395 std::array<std::unique_ptr<RFieldBase>, 2>
items{
399 }
else if (
resolvedType.substr(0, 11) ==
"std::tuple<") {
401 std::vector<std::unique_ptr<RFieldBase>>
items;
403 for (
unsigned int i = 0; i <
innerTypes.size(); ++i) {
408 }
else if (
resolvedType.substr(0, 12) ==
"std::bitset<") {
411 }
else if (
resolvedType.substr(0, 16) ==
"std::unique_ptr<") {
415 }
else if (
resolvedType.substr(0, 14) ==
"std::optional<") {
423 }
else if (
resolvedType.substr(0, 19) ==
"std::unordered_set<") {
427 }
else if (
resolvedType.substr(0, 14) ==
"std::multiset<") {
431 }
else if (
resolvedType.substr(0, 24) ==
"std::unordered_multiset<") {
445 }
else if (
resolvedType.substr(0, 19) ==
"std::unordered_map<") {
453 }
else if (
resolvedType.substr(0, 14) ==
"std::multimap<") {
461 }
else if (
resolvedType.substr(0, 24) ==
"std::unordered_multimap<") {
465 fnFail(
"the type list for std::unordered_multimap must have exactly two elements"));
470 }
else if (
resolvedType.substr(0, 12) ==
"std::atomic<") {
474 }
else if (
resolvedType.substr(0, 25) ==
"ROOT::RNTupleCardinality<") {
480 result = std::make_unique<RField<RNTupleCardinality<std::uint32_t>>>(
fieldName);
482 result = std::make_unique<RField<RNTupleCardinality<std::uint64_t>>>(
fieldName);
500 if (cl->GetCollectionProxy()) {
501 result = std::make_unique<RProxiedCollectionField>(
fieldName, typeName);
551 }
catch (
const RException &
e) {
552 auto error =
e.GetError();
554 return std::unique_ptr<RFieldBase>(std::make_unique<RInvalidField>(
fieldName, typeName, error.GetReport(),
559 }
catch (
const std::logic_error &
e) {
562 return std::unique_ptr<RFieldBase>(
587 auto clone = CloneImpl(
newName);
588 clone->fTypeAlias = fTypeAlias;
589 clone->fOnDiskId = fOnDiskId;
590 clone->fDescription = fDescription;
592 clone->fColumnRepresentatives = fColumnRepresentatives;
598 R__ASSERT(
false &&
"A non-simple RField must implement its own AppendImpl");
609 ReadGlobalImpl(fPrincipalColumn->GetGlobalIndex(
localIndex), to);
615 std::size_t
nRead = 0;
616 for (std::size_t i = 0; i <
bulkSpec.fCount; ++i) {
634 void *
where =
operator new(GetValueSize());
636 ConstructValue(
where);
642 void *obj = CreateObjectRawPtr();
648 return std::vector<RValue>();
655 if (fState != EState::kUnconnected)
656 throw RException(
R__FAIL(
"invalid attempt to attach subfield to already connected field"));
657 child->fParent =
this;
658 fSubfields.emplace_back(std::move(
child));
664 for (
auto f =
this;
f !=
nullptr;
f =
f->GetParent()) {
665 auto parent =
f->GetParent();
670 result *= std::max(
f->GetNRepetitions(), std::size_t{1U});
677 std::vector<RFieldBase *>
result;
678 result.reserve(fSubfields.size());
679 for (
const auto &
f : fSubfields) {
687 std::vector<const RFieldBase *>
result;
688 result.reserve(fSubfields.size());
689 for (
const auto &
f : fSubfields) {
697 if (!fAvailableColumns.empty()) {
699 for (
auto &column : fAvailableColumns) {
709 if (!fAvailableColumns.empty()) {
711 for (
auto &column : fAvailableColumns) {
715 column->CommitSuppressed();
724 if (fState != EState::kUnconnected)
725 throw RException(
R__FAIL(
"cannot set field description once field is connected"));
731 if (fState != EState::kUnconnected)
740 if (~fTraits & kTraitMappable)
741 return AppendImpl(from);
743 fPrincipalColumn->Append(from);
744 return fPrincipalColumn->GetElement()->GetPackedSize();
763 return RBulkSpec::kAllSet;
766 if (fIsArtificial || !fReadCallbacks.empty()) {
806 if (fColumnRepresentatives.empty()) {
807 return {GetColumnRepresentations().GetSerializationDefault()};
811 result.reserve(fColumnRepresentatives.size());
812 for (
const auto &
r : fColumnRepresentatives) {
820 if (fState != EState::kUnconnected)
821 throw RException(
R__FAIL(
"cannot set column representative once field is connected"));
822 const auto &
validTypes = GetColumnRepresentations().GetSerializationTypes();
823 fColumnRepresentatives.clear();
831 if (std::find_if(fColumnRepresentatives.begin(), fColumnRepresentatives.end(),
832 [&
r](
const auto &
rep) { return r == rep.get(); }) == fColumnRepresentatives.end())
844 throw RException(
R__FAIL(
"No on-disk field information for `" + GetQualifiedFieldName() +
"`"));
853 throw RException(
R__FAIL(
"No on-disk column information for field `" + GetQualifiedFieldName() +
"`"));
858 for (
const auto &t : GetColumnRepresentations().GetDeserializationTypes()) {
870 "` cannot be matched to its in-memory type `" + GetTypeName() +
"` " +
876 fReadCallbacks.push_back(func);
878 return fReadCallbacks.size() - 1;
883 fReadCallbacks.erase(fReadCallbacks.begin() + idx);
884 fIsSimple = (fTraits & kTraitMappable) && !fIsArtificial && fReadCallbacks.empty();
889 if ((options.
GetCompression() == 0) && HasDefaultColumnRepresentative()) {
906 SetColumnRepresentatives({
rep});
909 if (fTypeAlias ==
"Double32_t")
917 if (fState != EState::kUnconnected)
918 throw RException(
R__FAIL(
"invalid attempt to connect an already connected field to a page sink"));
920 AutoAdjustColumnTypes(
pageSink.GetWriteOptions());
923 for (
auto &column : fAvailableColumns) {
931 if (HasExtraTypeInfo()) {
932 pageSink.RegisterOnCommitDatasetCallback(
936 fState = EState::kConnectedToSink;
942 for (
auto &
f : fSubfields)
947 if (fState != EState::kUnconnected)
948 throw RException(
R__FAIL(
"invalid attempt to connect an already connected field to a page source"));
950 if (!fColumnRepresentatives.empty())
951 throw RException(
R__FAIL(
"fixed column representative only valid when connecting to a page sink"));
952 if (!fDescription.empty())
953 throw RException(
R__FAIL(
"setting description only valid when connecting to a page sink"));
958 while (
itr->GetParent()) {
962 for (
auto &
f : fParent->fSubfields) {
972 throw RException(
R__FAIL(
"invalid attempt to substitute field " + GetQualifiedFieldName()));
976 if (!fIsArtificial) {
978 ReconcileOnDiskField(
pageSource.GetSharedDescriptorGuard().GetRef());
981 for (
auto &
f : fSubfields) {
983 f->SetOnDiskId(
pageSource.GetSharedDescriptorGuard()->FindFieldId(
f->GetFieldName(), GetOnDiskId()));
989 if (!fIsArtificial) {
992 GenerateColumns(desc);
993 if (fColumnRepresentatives.empty()) {
995 for (
const auto &t : GetColumnRepresentations().GetDeserializationTypes()) {
997 fColumnRepresentatives = {t};
1002 R__ASSERT(!fColumnRepresentatives.empty());
1005 fOnDiskTypeVersion =
fieldDesc.GetTypeVersion();
1006 if (
fieldDesc.GetTypeChecksum().has_value())
1007 fOnDiskTypeChecksum = *
fieldDesc.GetTypeChecksum();
1010 for (
auto &column : fAvailableColumns)
1011 column->ConnectPageSource(fOnDiskId,
pageSource);
1013 fState = EState::kConnectedToSource;
1031 std::ostringstream
errMsg;
1032 errMsg <<
"in-memory field " << GetQualifiedFieldName() <<
" of type " << GetTypeName() <<
" is incompatible "
1033 <<
"with on-disk field " <<
fieldDesc.GetFieldName() <<
":";
1034 if (
diffBits & kDiffFieldVersion) {
1035 errMsg <<
" field version " << GetFieldVersion() <<
" vs. " <<
fieldDesc.GetFieldVersion() <<
";";
1038 errMsg <<
" type version " << GetTypeVersion() <<
" vs. " <<
fieldDesc.GetTypeVersion() <<
";";
1041 errMsg <<
" structural role " << GetStructure() <<
" vs. " <<
fieldDesc.GetStructure() <<
";";
1044 errMsg <<
" incompatible on-disk type name " <<
fieldDesc.GetTypeName() <<
";";
1046 if (
diffBits & kDiffNRepetitions) {
1047 errMsg <<
" repetition count " << GetNRepetitions() <<
" vs. " <<
fieldDesc.GetNRepetitions() <<
";";
1053 const std::vector<std::string> &
prefixes)
const
1056 if (
fieldDesc.GetTypeName().rfind(
p, 0) == 0)
1059 return R__FAIL(
"incompatible type " +
fieldDesc.GetTypeName() +
" for field " + GetQualifiedFieldName());
1065 if ((~
ignoreBits & kDiffFieldVersion) && (GetFieldVersion() !=
fieldDesc.GetFieldVersion()))
1073 if ((~
ignoreBits & kDiffNRepetitions) && (GetNRepetitions() !=
fieldDesc.GetNRepetitions()))
#define R__FORWARD_RESULT(res)
Short-hand to return an RResult<T> value from a subroutine to the calling stack frame.
#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
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.
winID h TVirtualViewer3D TVirtualGLPainter p
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 id
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 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.
static const char * GetColumnTypeName(ROOT::ENTupleColumnType type)
Abstract interface to write data into an ntuple.
Abstract interface to read data from an ntuple.
Base class for all ROOT issued exceptions.
Points to an array of objects with RNTuple I/O support, used for bulk reading.
std::unique_ptr< bool[]> fMaskAvail
Masks invalid values in the array.
std::unique_ptr< RFieldBase::RDeleter > fDeleter
void Reset(RNTupleLocalIndex firstIndex, std::size_t size)
Sets a new range for the bulk.
void * fValues
Cached deleter of fField.
RBulkValues & operator=(const RBulkValues &)=delete
RBulkValues(RFieldBase *field)
void AdoptBuffer(void *buf, std::size_t capacity)
The list of column representations a field can have.
Selection_t fSerializationTypes
std::vector< ColumnRepresentation_t > Selection_t
A list of column representations.
Selection_t fDeserializationTypes
The union of the serialization types and the deserialization extra types passed during construction.
Points to an object with RNTuple I/O support and keeps a pointer to the corresponding field.
void BindRawPtr(void *rawPtr)
A field translates read and write calls from/to underlying columns to/from tree values.
void SetColumnRepresentatives(const RColumnRepresentations::Selection_t &representatives)
Fixes a column representative.
ROOT::Internal::RColumn * fPrincipalColumn
All fields that have columns have a distinct main column.
virtual void ReconcileOnDiskField(const RNTupleDescriptor &desc)
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
ROOT::NTupleSize_t EntryToColumnElementIndex(ROOT::NTupleSize_t globalIndex) const
Translate an entry index to a column element index of the principal column and vice versa.
void Attach(std::unique_ptr< RFieldBase > child)
Add a new subfield to the list of nested fields.
virtual void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const
void FlushColumns()
Flushes data from active columns.
virtual void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to)
virtual const RColumnRepresentations & GetColumnRepresentations() const
Implementations in derived classes should return a static RColumnRepresentations object.
bool fIsSimple
A field qualifies as simple if it is mappable (which implies it has a single principal column),...
RConstSchemaIterator cbegin() const
void AutoAdjustColumnTypes(const ROOT::RNTupleWriteOptions &options)
When connecting a field to a page sink, the field's default column representation is subject to adjus...
std::vector< const RFieldBase * > GetConstSubfields() const
void SetOnDiskId(ROOT::DescriptorId_t id)
void RemoveReadCallback(size_t idx)
std::vector< RFieldBase * > GetMutableSubfields()
static std::vector< RCheckResult > Check(const std::string &fieldName, const std::string &typeName)
Checks if the given type is supported by RNTuple.
size_t AddReadCallback(ReadCallback_t func)
Set a user-defined function to be called after reading a value, giving a chance to inspect and/or mod...
RConstSchemaIterator cend() const
std::size_t fNRepetitions
For fixed sized arrays, the array length.
std::function< void(void *)> ReadCallback_t
std::size_t Append(const void *from)
Write the given value into columns.
RValue CreateValue()
Generates an object of the field's type, wraps it in a shared pointer and returns it as an RValue con...
const ColumnRepresentation_t & EnsureCompatibleColumnTypes(const ROOT::RNTupleDescriptor &desc, std::uint16_t representationIndex) const
Returns the on-disk column types found in the provided descriptor for fOnDiskId and the given represe...
virtual std::vector< RValue > SplitValue(const RValue &value) const
Creates the list of direct child values given an existing value for this field.
std::string GetQualifiedFieldName() const
Returns the field name and parent field names separated by dots (grandparent.parent....
RBulkValues CreateBulk()
Creates a new, initially empty bulk.
void ConnectPageSink(ROOT::Internal::RPageSink &pageSink, ROOT::NTupleSize_t firstEntry=0)
Fields and their columns live in the void until connected to a physical page storage.
std::size_t ReadBulk(const RBulkSpec &bulkSpec)
Returns the number of newly available values, that is the number of bools in bulkSpec....
std::vector< ROOT::ENTupleColumnType > ColumnRepresentation_t
RResult< void > EnsureMatchingTypePrefix(const RFieldDescriptor &fieldDesc, const std::vector< std::string > &prefixes) const
Many fields accept a range of type prefixes for schema evolution, e.g.
virtual void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to)
std::uint32_t fTraits
Properties of the type that allow for optimizations of collections of that type.
virtual std::size_t AppendImpl(const void *from)
Operations on values of complex types, e.g.
RFieldBase * fParent
Subfields point to their mother field.
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::uint32_t CompareOnDiskField(const RFieldDescriptor &fieldDesc, std::uint32_t ignoreBits) const
Returns a combination of kDiff... flags, indicating peroperties that are different between the field ...
std::string fType
The C++ type captured by this field.
RColumnRepresentations::Selection_t GetColumnRepresentatives() const
Returns the fColumnRepresentative pointee or, if unset (always the case for artificial fields),...
@ 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.
@ kTraitMappable
A field of a fundamental type that can be directly mapped via RField<T>::Map(), i....
@ kTraitInvalidField
This field is an instance of RInvalidField and can be safely static_cast to it.
ROOT::ENTupleStructure fStructure
The role of this field in the data model structure.
RValue BindValue(std::shared_ptr< void > objPtr)
Creates a value from a memory location with an already constructed object.
void SetDescription(std::string_view description)
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.
std::string fName
The field name relative to its parent field.
void CommitCluster()
Flushes data from active columns to disk and calls CommitClusterImpl()
void ConnectPageSource(ROOT::Internal::RPageSource &pageSource)
Connects the field and its subfield tree to the given page source.
RResult< void > EnsureMatchingOnDiskField(const RFieldDescriptor &fieldDesc, std::uint32_t ignoreBits=0) const
Compares the field to the provieded on-disk field descriptor.
void * CreateObjectRawPtr() const
Factory method for the field's type. The caller owns the returned pointer.
virtual std::size_t ReadBulkImpl(const RBulkSpec &bulkSpec)
General implementation of bulk read.
Metadata stored for every field of an RNTuple.
The container field for an ntuple model, which itself has no physical representation.
Used in RFieldBase::Check() to record field creation failures.
@ kGeneric
Generic unrecoverable error.
@ kUnknownType
The type given to RFieldBase::Create was unknown.
@ kTypeError
The type given to RFieldBase::Create was invalid.
The on-storage metadata of an RNTuple.
const RFieldDescriptor & GetFieldDescriptor(ROOT::DescriptorId_t fieldId) const
RColumnDescriptorIterable GetColumnIterable() const
Addresses a column element or field item relative to a particular cluster, instead of a global NTuple...
Common user-tunable settings for storing RNTuples.
std::uint32_t GetCompression() const
const_iterator begin() const
const_iterator end() const
The class is used as a return type for operations that can fail; wraps a value of type T or an RError...
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.
static TEnum * GetEnum(const std::type_info &ti, ESearchAction sa=kALoadAndInterpLookup)
std::vector< std::string > TokenizeTypeList(std::string_view templateType, std::size_t maxArgs=0)
Used in RFieldBase::Create() in order to get the comma-separated list of template types E....
std::unique_ptr< RFieldBase > CreateEmulatedVectorField(std::string_view fieldName, std::unique_ptr< RFieldBase > itemField, std::string_view emulatedFromType)
RResult< void > EnsureValidNameForRNTuple(std::string_view name, std::string_view where)
Check whether a given string is a valid name according to the RNTuple specification.
ROOT::RLogChannel & NTupleLog()
Log channel for RNTuple diagnostics.
void CallCommitClusterOnField(RFieldBase &)
void CallConnectPageSourceOnField(RFieldBase &, ROOT::Internal::RPageSource &)
unsigned long long ParseUIntTypeToken(const std::string &uintToken)
std::unique_ptr< RFieldBase > CreateEmulatedRecordField(std::string_view fieldName, std::vector< std::unique_ptr< RFieldBase > > itemFields, std::string_view emulatedFromType)
ROOT::RResult< std::unique_ptr< ROOT::RFieldBase > > CallFieldBaseCreate(const std::string &fieldName, const std::string &typeName, const ROOT::RCreateFieldOptions &options, const ROOT::RNTupleDescriptor *desc, ROOT::DescriptorId_t fieldId)
ERNTupleSerializationMode GetRNTupleSerializationMode(TClass *cl)
auto MakeAliasedSharedPtr(T *rawPtr)
std::string GetCanonicalTypePrefix(const std::string &typeName)
Applies RNTuple specific type name normalization rules (see specs) that help the string parsing in RF...
void CallFlushColumnsOnField(RFieldBase &)
std::string GetNormalizedUnresolvedTypeName(const std::string &origName)
Applies all RNTuple type normalization rules except typedef resolution.
void CallConnectPageSinkOnField(RFieldBase &, ROOT::Internal::RPageSink &, ROOT::NTupleSize_t firstEntry=0)
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...
std::string ResolveTypedef(const char *tname, bool resolveAll=false)
bool GetReturnInvalidOnError() const
bool GetEmulateUnknownTypes() const
Input parameter to RFieldBase::ReadBulk() and RFieldBase::ReadBulkImpl().
Used in the return value of the Check() method.
std::default_delete< T > deleter