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);
203 for (std::size_t i = 0; i <
fSize; ++i)
204 fNValidValues +=
static_cast<std::size_t
>(fMaskAvail[i]);
211 fCapacity = capacity;
214 fMaskAvail = std::make_unique<bool[]>(capacity);
229std::unique_ptr<void, typename ROOT::RFieldBase::RCreateObjectDeleter<void>::deleter>
230ROOT::RFieldBase::CreateObject<void>()
const
254 std::string
result = GetFieldName();
255 auto parent = GetParent();
256 while (parent && !parent->GetFieldName().empty()) {
258 parent = parent->GetParent();
270std::vector<ROOT::RFieldBase::RCheckResult>
275 cfOpts.SetReturnInvalidOnError(
true);
276 cfOpts.SetEmulateUnknownTypes(
false);
279 std::vector<RCheckResult>
result;
321 std::unique_ptr<ROOT::RFieldBase>
result;
372 }
else if (
resolvedType.substr(0, 12) ==
"std::vector<") {
376 }
else if (
resolvedType.substr(0, 19) ==
"ROOT::VecOps::RVec<") {
380 }
else if (
resolvedType.substr(0, 11) ==
"std::array<") {
388 }
else if (
resolvedType.substr(0, 13) ==
"std::variant<") {
390 std::vector<std::unique_ptr<RFieldBase>>
items;
392 for (
unsigned int i = 0; i <
innerTypes.size(); ++i) {
397 }
else if (
resolvedType.substr(0, 10) ==
"std::pair<") {
402 std::array<std::unique_ptr<RFieldBase>, 2>
items{
406 }
else if (
resolvedType.substr(0, 11) ==
"std::tuple<") {
408 std::vector<std::unique_ptr<RFieldBase>>
items;
410 for (
unsigned int i = 0; i <
innerTypes.size(); ++i) {
415 }
else if (
resolvedType.substr(0, 12) ==
"std::bitset<") {
418 }
else if (
resolvedType.substr(0, 16) ==
"std::unique_ptr<") {
424 }
else if (
resolvedType.substr(0, 14) ==
"std::optional<") {
436 }
else if (
resolvedType.substr(0, 19) ==
"std::unordered_set<") {
442 }
else if (
resolvedType.substr(0, 14) ==
"std::multiset<") {
448 }
else if (
resolvedType.substr(0, 24) ==
"std::unordered_multiset<") {
471 }
else if (
resolvedType.substr(0, 19) ==
"std::unordered_map<") {
485 result = std::make_unique<RMapField>(
487 }
else if (
resolvedType.substr(0, 14) ==
"std::multimap<") {
503 }
else if (
resolvedType.substr(0, 24) ==
"std::unordered_multimap<") {
507 fnFail(
"the type list for std::unordered_multimap must have exactly two elements"));
518 result = std::make_unique<RMapField>(
520 }
else if (
resolvedType.substr(0, 12) ==
"std::atomic<") {
526 }
else if (
resolvedType.substr(0, 25) ==
"ROOT::RNTupleCardinality<") {
532 result = std::make_unique<RField<RNTupleCardinality<std::uint32_t>>>(
fieldName);
534 result = std::make_unique<RField<RNTupleCardinality<std::uint64_t>>>(
fieldName);
552 if (cl->GetCollectionProxy()) {
553 result = std::make_unique<RProxiedCollectionField>(
fieldName, typeName);
603 }
catch (
const RException &
e) {
604 auto error =
e.GetError();
606 return std::unique_ptr<RFieldBase>(std::make_unique<RInvalidField>(
fieldName, typeName, error.GetReport(),
611 }
catch (
const std::logic_error &
e) {
614 return std::unique_ptr<RFieldBase>(
639 auto clone = CloneImpl(
newName);
640 clone->fTypeAlias = fTypeAlias;
641 clone->fOnDiskId = fOnDiskId;
642 clone->fDescription = fDescription;
644 clone->fColumnRepresentatives = fColumnRepresentatives;
650 R__ASSERT(
false &&
"A non-simple RField must implement its own AppendImpl");
661 ReadGlobalImpl(fPrincipalColumn->GetGlobalIndex(
localIndex), to);
667 std::size_t
nRead = 0;
668 for (std::size_t i = 0; i <
bulkSpec.fCount; ++i) {
686 void *
where =
operator new(GetValueSize());
688 ConstructValue(
where);
694 void *obj = CreateObjectRawPtr();
700 return std::vector<RValue>();
707 if (fState != EState::kUnconnected)
708 throw RException(
R__FAIL(
"invalid attempt to attach subfield to already connected field"));
709 child->fParent =
this;
710 fSubfields.emplace_back(std::move(
child));
716 for (
auto f =
this;
f !=
nullptr;
f =
f->GetParent()) {
717 auto parent =
f->GetParent();
722 result *= std::max(
f->GetNRepetitions(), std::size_t{1U});
729 std::vector<RFieldBase *>
result;
730 result.reserve(fSubfields.size());
731 for (
const auto &
f : fSubfields) {
739 std::vector<const RFieldBase *>
result;
740 result.reserve(fSubfields.size());
741 for (
const auto &
f : fSubfields) {
749 if (!fAvailableColumns.empty()) {
751 for (
auto &column : fAvailableColumns) {
761 if (!fAvailableColumns.empty()) {
763 for (
auto &column : fAvailableColumns) {
767 column->CommitSuppressed();
776 if (fState != EState::kUnconnected)
777 throw RException(
R__FAIL(
"cannot set field description once field is connected"));
783 if (fState != EState::kUnconnected)
792 if (~fTraits & kTraitMappable)
793 return AppendImpl(from);
795 fPrincipalColumn->Append(from);
796 return fPrincipalColumn->GetElement()->GetPackedSize();
815 return RBulkSpec::kAllSet;
818 if (fIsArtificial || !fReadCallbacks.empty()) {
858 if (fColumnRepresentatives.empty()) {
859 return {GetColumnRepresentations().GetSerializationDefault()};
863 result.reserve(fColumnRepresentatives.size());
864 for (
const auto &
r : fColumnRepresentatives) {
872 if (fState != EState::kUnconnected)
873 throw RException(
R__FAIL(
"cannot set column representative once field is connected"));
874 const auto &
validTypes = GetColumnRepresentations().GetSerializationTypes();
875 fColumnRepresentatives.clear();
883 if (std::find_if(fColumnRepresentatives.begin(), fColumnRepresentatives.end(),
884 [&
r](
const auto &
rep) { return r == rep.get(); }) == fColumnRepresentatives.end())
896 throw RException(
R__FAIL(
"No on-disk field information for `" + GetQualifiedFieldName() +
"`"));
905 throw RException(
R__FAIL(
"No on-disk column information for field `" + GetQualifiedFieldName() +
"`"));
910 for (
const auto &t : GetColumnRepresentations().GetDeserializationTypes()) {
922 "` cannot be matched to its in-memory type `" + GetTypeName() +
"` " +
928 fReadCallbacks.push_back(func);
930 return fReadCallbacks.size() - 1;
935 fReadCallbacks.erase(fReadCallbacks.begin() + idx);
936 fIsSimple = (fTraits & kTraitMappable) && !fIsArtificial && fReadCallbacks.empty();
941 if ((options.
GetCompression() == 0) && HasDefaultColumnRepresentative()) {
958 SetColumnRepresentatives({
rep});
961 if (fTypeAlias ==
"Double32_t")
969 if (fState != EState::kUnconnected)
970 throw RException(
R__FAIL(
"invalid attempt to connect an already connected field to a page sink"));
972 AutoAdjustColumnTypes(
pageSink.GetWriteOptions());
975 for (
auto &column : fAvailableColumns) {
983 if (HasExtraTypeInfo()) {
984 pageSink.RegisterOnCommitDatasetCallback(
988 fState = EState::kConnectedToSink;
994 throw RException(
R__FAIL(
"invalid attempt to connect zero field to page source"));
995 if (fState != EState::kUnconnected)
996 throw RException(
R__FAIL(
"invalid attempt to connect an already connected field to a page source"));
998 if (!fColumnRepresentatives.empty())
999 throw RException(
R__FAIL(
"fixed column representative only valid when connecting to a page sink"));
1000 if (!fDescription.empty())
1001 throw RException(
R__FAIL(
"setting description only valid when connecting to a page sink"));
1005 if (!fIsArtificial) {
1007 ReconcileOnDiskField(
pageSource.GetSharedDescriptorGuard().GetRef());
1010 for (
auto &
f : fSubfields) {
1012 f->SetOnDiskId(
pageSource.GetSharedDescriptorGuard()->FindFieldId(
f->GetFieldName(), GetOnDiskId()));
1018 if (!fIsArtificial) {
1021 GenerateColumns(desc);
1022 if (fColumnRepresentatives.empty()) {
1024 for (
const auto &t : GetColumnRepresentations().GetDeserializationTypes()) {
1026 fColumnRepresentatives = {t};
1031 R__ASSERT(!fColumnRepresentatives.empty());
1034 fOnDiskTypeVersion =
fieldDesc.GetTypeVersion();
1035 if (
fieldDesc.GetTypeChecksum().has_value())
1036 fOnDiskTypeChecksum = *
fieldDesc.GetTypeChecksum();
1039 for (
auto &column : fAvailableColumns)
1040 column->ConnectPageSource(fOnDiskId,
pageSource);
1042 fState = EState::kConnectedToSource;
1059 std::ostringstream
errMsg;
1060 errMsg <<
"in-memory field " << GetQualifiedFieldName() <<
" of type " << GetTypeName() <<
" is incompatible "
1061 <<
"with on-disk field " <<
fieldDesc.GetFieldName() <<
":";
1062 if (
diffBits & kDiffFieldVersion) {
1063 errMsg <<
" field version " << GetFieldVersion() <<
" vs. " <<
fieldDesc.GetFieldVersion() <<
";";
1066 errMsg <<
" type version " << GetTypeVersion() <<
" vs. " <<
fieldDesc.GetTypeVersion() <<
";";
1069 errMsg <<
" structural role " << GetStructure() <<
" vs. " <<
fieldDesc.GetStructure() <<
";";
1072 errMsg <<
" incompatible on-disk type name " <<
fieldDesc.GetTypeName() <<
";";
1074 if (
diffBits & kDiffNRepetitions) {
1075 errMsg <<
" repetition count " << GetNRepetitions() <<
" vs. " <<
fieldDesc.GetNRepetitions() <<
";";
1081 const std::vector<std::string> &
prefixes)
const
1084 if (
fieldDesc.GetTypeName().rfind(
p, 0) == 0)
1093 if ((~
ignoreBits & kDiffFieldVersion) && (GetFieldVersion() !=
fieldDesc.GetFieldVersion()))
1101 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
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.
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.
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),...
void EnsureMatchingOnDiskField(const RFieldDescriptor &fieldDesc, std::uint32_t ignoreBits=0) const
Compares the field to the provieded on-disk field descriptor.
@ 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.
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