Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RField.hxx
Go to the documentation of this file.
1/// \file ROOT/RField.hxx
2/// \ingroup NTuple
3/// \author Jakob Blomer <jblomer@cern.ch>
4/// \date 2018-10-09
5
6/*************************************************************************
7 * Copyright (C) 1995-2019, Rene Brun and Fons Rademakers. *
8 * All rights reserved. *
9 * *
10 * For the licensing terms see $ROOTSYS/LICENSE. *
11 * For the list of contributors see $ROOTSYS/README/CREDITS. *
12 *************************************************************************/
13
14#ifndef ROOT_RField
15#define ROOT_RField
16
17#include <ROOT/RError.hxx>
18#include <ROOT/RFieldBase.hxx>
19#include <ROOT/RFieldUtils.hxx>
21#include <ROOT/RNTupleTypes.hxx>
22#include <ROOT/RSpan.hxx>
23#include <string_view>
24#include <ROOT/TypeTraits.hxx>
25
26#include <TGenericClassInfo.h>
27
28#include <algorithm>
29#include <array>
30#include <cstddef>
31#include <iostream>
32#include <memory>
33#include <string>
34#include <type_traits>
35#include <typeinfo>
36#include <vector>
37
38class TClass;
39class TEnum;
40class TObject;
42
43namespace ROOT {
44
45class TSchemaRule;
46class RNTupleCollectionView;
47
48namespace Detail {
49class RFieldVisitor;
50} // namespace Detail
51
52class RFieldZero;
53namespace Internal {
54void SetAllowFieldSubstitutions(RFieldZero &fieldZero, bool val);
55}
56
57/// The container field for an ntuple model, which itself has no physical representation.
58/// Therefore, the zero field must not be connected to a page source or sink.
59class RFieldZero final : public RFieldBase {
61
62 /// If field substitutions are allowed, upon connecting to a page source the field hierarchy will replace created
63 /// fields by fields that match the on-disk schema. This happens for
64 /// - Vector fields (RVectorField, RRVecField) that connect to an on-disk fixed-size array
65 /// - Streamer fields that connect to an on-disk class field
66 /// Field substitutions must not be enabled when the field hierarchy already handed out RValue objects because
67 /// they would leave dangling field pointers to the replaced fields. This is used in cases when the field/model
68 /// is created by RNTuple (not imposed), before it is made available to the user.
69 /// This flag is reset on Clone().
71
72 std::unordered_set<std::string> fSubFieldNames; ///< Efficient detection of duplicate field names
73
74protected:
75 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
76 void ConstructValue(void *) const final {}
77
78public:
79 RFieldZero();
80
81 /// A public version of the Attach method that allows piece-wise construction of the zero field.
82 /// Will throw on duplicate subfield names.
83 void Attach(std::unique_ptr<RFieldBase> child);
84 size_t GetValueSize() const final { return 0; }
85 size_t GetAlignment() const final { return 0; }
86
88
90 /// Moves all subfields into the returned vector.
91 std::vector<std::unique_ptr<RFieldBase>> ReleaseSubfields();
92};
93
94/// Used in RFieldBase::Check() to record field creation failures.
95/// Also used when deserializing a field that contains unknown values that may come from
96/// future RNTuple versions (e.g. an unknown Structure)
98public:
99 enum class ECategory {
100 /// Generic unrecoverable error
101 kGeneric,
102 /// The type given to RFieldBase::Create was invalid
104 /// The type given to RFieldBase::Create was unknown
106 /// The field could not be created because its descriptor had an unknown structural role
108 };
109
110 using RCategory R__DEPRECATED(6, 42, "enum renamed to ECategory") = ECategory;
111
112private:
113 std::string fError;
115
116protected:
117 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final
118 {
119 return std::make_unique<RInvalidField>(newName, GetTypeName(), fError, fCategory);
120 }
121 void ConstructValue(void *) const final {}
122
123public:
124 RInvalidField(std::string_view name, std::string_view type, std::string_view error, ECategory category)
125 : RFieldBase(name, type, ROOT::ENTupleStructure::kPlain, false /* isSimple */), fError(error), fCategory(category)
126 {
128 }
129
130 const std::string &GetError() const { return fError; }
131 ECategory GetCategory() const { return fCategory; }
132
133 size_t GetValueSize() const final { return 0; }
134 size_t GetAlignment() const final { return 0; }
135}; // RInvalidField
136
137/// The field for a class with dictionary
138class RClassField : public RFieldBase {
139private:
146 std::size_t fOffset;
147 };
148 // Information to read into the staging area a field that is used as an input to an I/O customization rule
150 /// The field used to read the on-disk data. The fields type may be different from the on-disk type as long
151 /// as the on-disk type can be converted to the fields type (through type cast / schema evolution).
152 std::unique_ptr<RFieldBase> fField;
153 std::size_t fOffset; ///< offset in fStagingArea
154 };
155 /// Prefix used in the subfield names generated for base classes
156 static constexpr const char *kPrefixInherited{":"};
157
158 class RClassDeleter : public RDeleter {
159 private:
161
162 public:
163 explicit RClassDeleter(TClass *cl) : fClass(cl) {}
164 void operator()(void *objPtr, bool dtorOnly) final;
165 };
166
168 /// Additional information kept for each entry in `fSubfields`
169 std::vector<RSubFieldInfo> fSubfieldsInfo;
170 std::size_t fMaxAlignment = 1;
171
172 /// The staging area stores inputs to I/O rules according to the offsets given by the streamer info of
173 /// "TypeName@@Version". The area is allocated depending on I/O rules resp. the source members of the I/O rules.
174 std::unique_ptr<unsigned char[]> fStagingArea;
175 /// The TClass instance that corresponds to the staging area.
176 /// The staging class exists as <class name>@@<on-disk version> if the on-disk version is different from the
177 /// current in-memory version, or it can be accessed by the first @@alloc streamer element of the current streamer
178 /// info.
180 std::unordered_map<std::string, RStagingItem> fStagingItems; ///< Lookup staging items by member name
181
182private:
183 RClassField(std::string_view fieldName, const RClassField &source); ///< Used by CloneImpl
184 RClassField(std::string_view fieldName, TClass *classp);
185 void Attach(std::unique_ptr<RFieldBase> child, RSubFieldInfo info);
186
187 /// Returns the id of member 'name' in the class field given by 'fieldId', or kInvalidDescriptorId if no such
188 /// member exist. Looks recursively in base classes.
191 /// Sets fStagingClass according to the given name and version
192 void SetStagingClass(const std::string &className, unsigned int classVersion);
193 /// If there are rules with inputs (source members), create the staging area according to the TClass instance
194 /// that corresponds to the on-disk field.
195 void PrepareStagingArea(const std::vector<const TSchemaRule *> &rules, const ROOT::RNTupleDescriptor &desc,
197 /// Register post-read callback corresponding to a ROOT I/O customization rules.
199 /// Given the on-disk information from the page source, find all the I/O customization rules that apply
200 /// to the class field at hand, to which the fieldDesc descriptor, if provided, must correspond.
201 /// Fields may not have an on-disk representation (e.g., when inserted by schema evolution), in which case the passed
202 /// field descriptor is nullptr.
203 std::vector<const TSchemaRule *> FindRules(const ROOT::RFieldDescriptor *fieldDesc);
204
205protected:
206 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
207
208 void ConstructValue(void *where) const final;
209 std::unique_ptr<RDeleter> GetDeleter() const final { return std::make_unique<RClassDeleter>(fClass); }
210
211 std::size_t AppendImpl(const void *from) final;
212 void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final;
213 void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final;
214
215 std::unique_ptr<RFieldBase> BeforeConnectPageSource(ROOT::Internal::RPageSource &pageSource) final;
216 void ReconcileOnDiskField(const RNTupleDescriptor &desc) final;
217
218public:
219 RClassField(std::string_view fieldName, std::string_view className);
222 ~RClassField() override;
223
224 std::vector<RValue> SplitValue(const RValue &value) const final;
225 size_t GetValueSize() const final;
227 std::uint32_t GetTypeVersion() const final;
228 std::uint32_t GetTypeChecksum() const final;
229 /// For polymorphic classes (that declare or inherit at least one virtual method), return the expected dynamic type
230 /// of any user object. If the class is not polymorphic, return nullptr.
232 /// Return the TClass instance backing this field.
233 const TClass *GetClass() const { return fClass; }
235};
236
237/// The field for a class using ROOT standard streaming
239private:
241 private:
243
244 public:
245 explicit RStreamerFieldDeleter(TClass *cl) : fClass(cl) {}
246 void operator()(void *objPtr, bool dtorOnly) final;
247 };
248
249 TClass *fClass = nullptr;
250 ROOT::Internal::RNTupleSerializer::StreamerInfoMap_t fStreamerInfos; ///< streamer info records seen during writing
251 ROOT::Internal::RColumnIndex fIndex; ///< number of bytes written in the current cluster
252
253private:
254 RStreamerField(std::string_view fieldName, TClass *classp);
255
256protected:
257 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
258
260 void GenerateColumns() final;
262
263 void ConstructValue(void *where) const final;
264 std::unique_ptr<RDeleter> GetDeleter() const final { return std::make_unique<RStreamerFieldDeleter>(fClass); }
265
266 std::size_t AppendImpl(const void *from) final;
267 void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final;
268
270
271 bool HasExtraTypeInfo() const final { return true; }
272 // Returns the list of seen streamer infos
274
275 std::unique_ptr<RFieldBase> BeforeConnectPageSource(ROOT::Internal::RPageSource &source) final;
277
278public:
279 RStreamerField(std::string_view fieldName, std::string_view className);
283
284 size_t GetValueSize() const final;
285 size_t GetAlignment() const final;
286 std::uint32_t GetTypeVersion() const final;
287 std::uint32_t GetTypeChecksum() const final;
288 TClass *GetClass() const { return fClass; }
290};
291
292/// The field for an unscoped or scoped enum with dictionary
293class REnumField : public RFieldBase {
294private:
295 REnumField(std::string_view fieldName, TEnum *enump);
296 REnumField(std::string_view fieldName, std::string_view enumName, std::unique_ptr<RFieldBase> intField);
297
298protected:
299 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
300
301 void ConstructValue(void *where) const final { CallConstructValueOn(*fSubfields[0], where); }
302
303 std::size_t AppendImpl(const void *from) final { return CallAppendOn(*fSubfields[0], from); }
306
307 void ReconcileOnDiskField(const RNTupleDescriptor &desc) final;
308
309public:
310 REnumField(std::string_view fieldName, std::string_view enumName);
313 ~REnumField() override = default;
314
315 std::vector<RValue> SplitValue(const RValue &value) const final;
316 size_t GetValueSize() const final { return fSubfields[0]->GetValueSize(); }
317 size_t GetAlignment() const final { return fSubfields[0]->GetAlignment(); }
319};
320
321/// Classes with dictionaries that can be inspected by TClass
322template <typename T, typename = void>
323class RField final : public RClassField {
324public:
325 static std::string TypeName() { return ROOT::Internal::GetRenormalizedTypeName(typeid(T)); }
326 RField(std::string_view name) : RClassField(name, Internal::GetDemangledTypeName(typeid(T)))
327 {
328 static_assert(std::is_class_v<T>, "no I/O support for this basic C++ type");
329 }
330 RField(RField &&other) = default;
333};
334
337public:
338 static std::string TypeName() { return ROOT::Internal::GetRenormalizedTypeName(typeid(T)); }
339 RField(std::string_view name) : REnumField(name, TypeName()) {}
340 RField(RField &&other) = default;
341 RField &operator=(RField &&other) = default;
342 ~RField() final = default;
343};
344
345/// An artificial field that transforms an RNTuple column that contains the offset of collections into
346/// collection sizes. It is only used for reading, e.g. as projected field or as an artificial field that provides the
347/// "number of" RDF columns for collections (e.g. `R_rdf_sizeof_jets` for a collection named `jets`).
348/// It is used in the templated RField<RNTupleCardinality<SizeT>> form, which represents the collection sizes either
349/// as 32bit unsigned int (std::uint32_t) or as 64bit unsigned int (std::uint64_t).
351 friend class ROOT::RNTupleCollectionView; // to access GetCollectionInfo()
352
353private:
362
363protected:
364 RCardinalityField(std::string_view fieldName, std::string_view typeName)
365 : RFieldBase(fieldName, typeName, ROOT::ENTupleStructure::kPlain, false /* isSimple */)
366 {
367 }
368
369 const RColumnRepresentations &GetColumnRepresentations() const final;
370 // Field is only used for reading
371 void GenerateColumns() final { throw RException(R__FAIL("Cardinality fields must only be used for reading")); }
372 void GenerateColumns(const ROOT::RNTupleDescriptor &) final;
373
374 void ReconcileOnDiskField(const RNTupleDescriptor &desc) final;
375
376public:
379 ~RCardinalityField() override = default;
380
381 void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final;
382
383 const RField<RNTupleCardinality<std::uint32_t>> *As32Bit() const;
384 const RField<RNTupleCardinality<std::uint64_t>> *As64Bit() const;
385};
386
387template <typename T>
388class RSimpleField : public RFieldBase {
389 void ReconcileIntegralField(const RNTupleDescriptor &desc);
390 void ReconcileFloatingPointField(const RNTupleDescriptor &desc);
391
392protected:
395
396 void ConstructValue(void *where) const final { new (where) T{0}; }
397
398 void ReconcileOnDiskField(const RNTupleDescriptor &desc) override
399 {
400 if constexpr (std::is_integral_v<T>) {
401 ReconcileIntegralField(desc);
402 } else if constexpr (std::is_floating_point_v<T>) {
403 ReconcileFloatingPointField(desc);
404 } else {
405 RFieldBase::ReconcileOnDiskField(desc);
406 }
407 }
408
409 RSimpleField(std::string_view name, std::string_view type)
410 : RFieldBase(name, type, ROOT::ENTupleStructure::kPlain, true /* isSimple */)
411 {
412 fTraits |= kTraitTrivialType;
413 }
414
415public:
418 ~RSimpleField() override = default;
419
420 T *Map(ROOT::NTupleSize_t globalIndex) { return fPrincipalColumn->Map<T>(globalIndex); }
421 T *Map(RNTupleLocalIndex localIndex) { return fPrincipalColumn->Map<T>(localIndex); }
423 {
424 return fPrincipalColumn->MapV<T>(globalIndex, nItems);
425 }
427 {
428 return fPrincipalColumn->MapV<T>(localIndex, nItems);
429 }
430
431 size_t GetValueSize() const final { return sizeof(T); }
432 size_t GetAlignment() const final { return alignof(T); }
433};
434
435////////////////////////////////////////////////////////////////////////////////
436/// Template specializations for concrete C++ types
437////////////////////////////////////////////////////////////////////////////////
438
439} // namespace ROOT
440
446
447namespace ROOT {
448
449template <typename SizeT>
452
453protected:
454 std::unique_ptr<ROOT::RFieldBase> CloneImpl(std::string_view newName) const final
455 {
456 return std::make_unique<RField>(newName);
457 }
458 void ConstructValue(void *where) const final { new (where) CardinalityType(0); }
459
460 /// Get the number of elements of the collection identified by globalIndex
468
469 /// Get the number of elements of the collection identified by clusterIndex
477
478 std::size_t ReadBulkImpl(const RBulkSpec &bulkSpec) final
479 {
483
484 auto typedValues = static_cast<CardinalityType *>(bulkSpec.fValues);
486
487 auto lastOffset = collectionStart.GetIndexInCluster() + collectionSize;
489 std::size_t nEntries = 1;
490 while (nRemainingEntries > 0) {
492 auto offsets =
494 std::size_t nBatch = std::min(nRemainingEntries, nItemsUntilPageEnd);
495 for (std::size_t i = 0; i < nBatch; ++i) {
496 typedValues[nEntries + i] = offsets[i] - lastOffset;
497 lastOffset = offsets[i];
498 }
500 nEntries += nBatch;
501 }
502 return RBulkSpec::kAllSet;
503 }
504
505public:
506 static std::string TypeName() { return "ROOT::RNTupleCardinality<" + RField<SizeT>::TypeName() + ">"; }
507 explicit RField(std::string_view name) : RCardinalityField(name, TypeName()) {}
508 RField(RField &&other) = default;
511
512 size_t GetValueSize() const final { return sizeof(CardinalityType); }
513 size_t GetAlignment() const final { return alignof(CardinalityType); }
514};
515
516/// TObject requires special handling of the fBits and fUniqueID members
517template <>
519 static std::size_t GetOffsetOfMember(const char *name);
520 static std::size_t GetOffsetUniqueID() { return GetOffsetOfMember("fUniqueID"); }
521 static std::size_t GetOffsetBits() { return GetOffsetOfMember("fBits"); }
522
523private:
524 RField(std::string_view fieldName, const RField<TObject> &source); ///< Used by CloneImpl()
525
526protected:
527 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
528
529 void ConstructValue(void *where) const final;
530 std::unique_ptr<RDeleter> GetDeleter() const final { return std::make_unique<RTypedDeleter<TObject>>(); }
531
532 std::size_t AppendImpl(const void *from) final;
533 void ReadTObject(void *to, UInt_t uniqueID, UInt_t bits);
534 void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final;
535 void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final;
536
537public:
538 static std::string TypeName() { return "TObject"; }
539
540 RField(std::string_view fieldName);
541 RField(RField &&other) = default;
544
546 size_t GetValueSize() const final;
547 size_t GetAlignment() const final;
548 std::uint32_t GetTypeVersion() const final;
549 std::uint32_t GetTypeChecksum() const final;
551};
552
553// Have to be implemented after the definition of all RField<T> types
554
555namespace Internal {
556
557/// Helper to check if a given type name is the one expected of Field<T>. Usually, this check can be done by
558/// type renormalization of the demangled type name T. The failure case, however, needs to additionally check for
559/// ROOT-specific special cases.
560template <class T>
561bool IsMatchingFieldType(const std::string &actualTypeName)
562{
564}
565
566} // namespace Internal
567
568template <typename T>
569std::unique_ptr<T, typename RFieldBase::RCreateObjectDeleter<T>::deleter> RFieldBase::CreateObject() const
570{
571 if (!Internal::IsMatchingFieldType<T>(GetTypeName())) {
572 throw RException(
573 R__FAIL("type mismatch for field " + GetFieldName() + ": " + GetTypeName() + " vs. " + RField<T>::TypeName()));
574 }
575 return std::unique_ptr<T>(static_cast<T *>(CreateObjectRawPtr()));
576}
577
578// The void type is specialized in RField.cxx
579
580template <>
585
586template <>
587std::unique_ptr<void, typename RFieldBase::RCreateObjectDeleter<void>::deleter>
588ROOT::RFieldBase::CreateObject<void>() const;
589
590} // namespace ROOT
591
592#endif
#define R__FAIL(msg)
Short-hand to return an RResult<T> in an error state; the RError is implicitly converted into RResult...
Definition RError.hxx:300
size_t size(const MatrixT &matrix)
retrieve the size of a square matrix
unsigned int UInt_t
Unsigned integer 4 bytes (unsigned int)
Definition RtypesCore.h:60
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
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
char name[80]
Definition TGX11.cxx:110
TRObject operator()(const T1 &t1) const
Abstract base class for classes implementing the visitor design pattern.
The in-memory representation of a 32bit or 64bit on-disk index column.
void GetCollectionInfo(const ROOT::NTupleSize_t globalIndex, RNTupleLocalIndex *collectionStart, ROOT::NTupleSize_t *collectionSize)
For offset columns only, look at the two adjacent values that define a collection's coordinates.
Definition RColumn.hxx:283
CppT * MapV(const ROOT::NTupleSize_t globalIndex, ROOT::NTupleSize_t &nItems)
Definition RColumn.hxx:241
std::map< Int_t, TVirtualStreamerInfo * > StreamerInfoMap_t
Abstract interface to read data from an ntuple.
An artificial field that transforms an RNTuple column that contains the offset of collections into co...
Definition RField.hxx:350
RCardinalityField(RCardinalityField &&other)=default
void GetCollectionInfo(ROOT::NTupleSize_t globalIndex, RNTupleLocalIndex *collectionStart, ROOT::NTupleSize_t *size)
Definition RField.hxx:354
RCardinalityField & operator=(RCardinalityField &&other)=default
void GetCollectionInfo(RNTupleLocalIndex localIndex, RNTupleLocalIndex *collectionStart, ROOT::NTupleSize_t *size)
Definition RField.hxx:358
~RCardinalityField() override=default
RCardinalityField(std::string_view fieldName, std::string_view typeName)
Definition RField.hxx:364
void operator()(void *objPtr, bool dtorOnly) final
The field for a class with dictionary.
Definition RField.hxx:138
const TClass * GetClass() const
Return the TClass instance backing this field.
Definition RField.hxx:233
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.
Definition RField.hxx:179
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.
RClassField(RClassField &&other)=default
std::vector< RSubFieldInfo > fSubfieldsInfo
Additional information kept for each entry in fSubfields
Definition RField.hxx:169
std::size_t fMaxAlignment
Definition RField.hxx:170
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< unsigned char[]> fStagingArea
The staging area stores inputs to I/O rules according to the offsets given by the streamer info of "T...
Definition RField.hxx:174
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
Definition RField.hxx:226
RClassField & operator=(RClassField &&other)=default
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
void Attach(std::unique_ptr< RFieldBase > child, RSubFieldInfo info)
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
TClass * fClass
Definition RField.hxx:167
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...
~RClassField() override
std::uint32_t GetTypeChecksum() const final
Return the current TClass reported checksum of this class. Only valid if kTraitTypeChecksum is set.
std::unique_ptr< RDeleter > GetDeleter() const final
Definition RField.hxx:209
std::unordered_map< std::string, RStagingItem > fStagingItems
Lookup staging items by member name.
Definition RField.hxx:180
static constexpr const char * kPrefixInherited
Prefix used in the subfield names generated for base classes.
Definition RField.hxx:156
void SetStagingClass(const std::string &className, unsigned int classVersion)
Sets fStagingClass according to the given name and version.
The field for an unscoped or scoped enum with dictionary.
Definition RField.hxx:293
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.
Definition RField.hxx:316
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
Definition RField.hxx:317
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() override=default
REnumField(REnumField &&other)=default
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
Definition RField.hxx:301
void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final
Definition RField.hxx:305
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
Definition RField.hxx:304
REnumField & operator=(REnumField &&other)=default
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.
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
Definition RField.hxx:303
Base class for all ROOT issued exceptions.
Definition RError.hxx:79
Field specific extra type information from the header / extenstion header.
The list of column representations a field can have.
A functor to release the memory acquired by CreateValue() (memory and constructor).
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.
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::unique_ptr< T, typename RCreateObjectDeleter< T >::deleter > CreateObject() const
Generates an object of the field type and allocates new initialized memory according to the type.
Definition RField.hxx:569
const std::string & GetFieldName() 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.
const std::string & GetTypeName() const
@ kTraitInvalidField
This field is an instance of RInvalidField and can be safely static_cast to it.
static void CallReadOn(RFieldBase &other, RNTupleLocalIndex localIndex, void *to)
static void CallConstructValueOn(const RFieldBase &other, void *where)
Allow derived classes to call ConstructValue(void *) and GetDeleter() on other (sub)fields.
void * CreateObjectRawPtr() const
Factory method for the field's type. The caller owns the returned pointer.
Metadata stored for every field of an RNTuple.
The container field for an ntuple model, which itself has no physical representation.
Definition RField.hxx:59
std::unordered_set< std::string > fSubFieldNames
Efficient detection of duplicate field names.
Definition RField.hxx:72
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
Definition RField.cxx:74
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
Definition RField.hxx:84
bool GetAllowFieldSubstitutions() const
Definition RField.hxx:89
void ConstructValue(void *) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
Definition RField.hxx:76
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
Definition RField.cxx:55
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
Definition RField.hxx:85
std::vector< std::unique_ptr< RFieldBase > > ReleaseSubfields()
Moves all subfields into the returned vector.
Definition RField.cxx:65
bool fAllowFieldSubstitutions
If field substitutions are allowed, upon connecting to a page source the field hierarchy will replace...
Definition RField.hxx:70
void Attach(std::unique_ptr< RFieldBase > child)
A public version of the Attach method that allows piece-wise construction of the zero field.
Definition RField.cxx:41
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
Get the number of elements of the collection identified by globalIndex.
Definition RField.hxx:461
RField & operator=(RField &&other)=default
std::size_t ReadBulkImpl(const RBulkSpec &bulkSpec) final
General implementation of bulk read.
Definition RField.hxx:478
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
Definition RField.hxx:458
void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final
Get the number of elements of the collection identified by clusterIndex.
Definition RField.hxx:470
std::unique_ptr< ROOT::RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
Definition RField.hxx:454
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
Definition RField.hxx:513
RField(RField &&other)=default
RField & operator=(RField &&other)=default
~RField() final=default
static std::string TypeName()
Definition RField.hxx:538
std::unique_ptr< RDeleter > GetDeleter() const final
Definition RField.hxx:530
static std::size_t GetOffsetBits()
Definition RField.hxx:521
static std::size_t GetOffsetUniqueID()
Definition RField.hxx:520
Classes with dictionaries that can be inspected by TClass.
Definition RField.hxx:323
~RField() final=default
RField(RField &&other)=default
RField & operator=(RField &&other)=default
static std::string TypeName()
Definition RField.hxx:325
RField(std::string_view name)
Definition RField.hxx:326
Used in RFieldBase::Check() to record field creation failures.
Definition RField.hxx:97
RInvalidField(std::string_view name, std::string_view type, std::string_view error, ECategory category)
Definition RField.hxx:124
@ kGeneric
Generic unrecoverable error.
@ kUnknownType
The type given to RFieldBase::Create was unknown.
@ kTypeError
The type given to RFieldBase::Create was invalid.
@ kUnknownStructure
The field could not be created because its descriptor had an unknown structural role.
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
Definition RField.hxx:117
ECategory fCategory
Definition RField.hxx:114
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
Definition RField.hxx:134
std::string fError
Definition RField.hxx:113
const std::string & GetError() const
Definition RField.hxx:130
ECategory GetCategory() const
Definition RField.hxx:131
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
Definition RField.hxx:133
void ConstructValue(void *) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
Definition RField.hxx:121
A view for a collection, that can itself generate new ntuple views for its nested fields.
The on-storage metadata of an RNTuple.
Addresses a column element or field item relative to a particular cluster, instead of a global NTuple...
void GenerateColumns() override
Implementations in derived classes should create the backing columns corresponding to the field type ...
Definition RField.hxx:393
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
Definition RField.hxx:432
RSimpleField & operator=(RSimpleField &&other)=default
RSimpleField(std::string_view name, std::string_view type)
Definition RField.hxx:409
T * Map(RNTupleLocalIndex localIndex)
Definition RField.hxx:421
~RSimpleField() override=default
T * Map(ROOT::NTupleSize_t globalIndex)
Definition RField.hxx:420
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
Definition RField.hxx:431
void ReconcileOnDiskField(const RNTupleDescriptor &desc) override
For non-artificial fields, check compatibility of the in-memory field and the on-disk field.
Definition RField.hxx:398
RSimpleField(RSimpleField &&other)=default
void ConstructValue(void *where) const final
Constructs value in a given location of size at least GetValueSize(). Called by the base class' Creat...
Definition RField.hxx:396
T * MapV(ROOT::NTupleSize_t globalIndex, ROOT::NTupleSize_t &nItems)
Definition RField.hxx:422
void GenerateColumns(const ROOT::RNTupleDescriptor &desc) override
Implementations in derived classes should create the backing columns corresponding to the field type ...
Definition RField.hxx:394
T * MapV(RNTupleLocalIndex localIndex, ROOT::NTupleSize_t &nItems)
Definition RField.hxx:426
void operator()(void *objPtr, bool dtorOnly) final
The field for a class using ROOT standard streaming.
Definition RField.hxx:238
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
Definition RField.hxx:250
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
Definition RField.hxx:251
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.
bool HasExtraTypeInfo() const final
Definition RField.hxx:271
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
void CommitClusterImpl() final
Definition RField.hxx:269
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.
std::unique_ptr< RDeleter > GetDeleter() const final
Definition RField.hxx:264
TClass * GetClass() const
Definition RField.hxx:288
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
TClass instances represent classes, structs and namespaces in the ROOT type system.
Definition TClass.h:84
The TEnum class implements the enum type.
Definition TEnum.h:33
Mother of all ROOT objects.
Definition TObject.h:42
Abstract Interface class describing Streamer information for one class.
void SetAllowFieldSubstitutions(RFieldZero &fieldZero, bool val)
Definition RField.cxx:36
bool IsMatchingFieldType(const std::string &actualTypeName)
Helper to check if a given type name is the one expected of Field<T>.
Definition RField.hxx:561
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::string GetDemangledTypeName(const std::type_info &t)
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.
ENTupleStructure
The fields in the RNTuple data model tree can carry different structural information about the type s...
std::size_t fOffset
offset in fStagingArea
Definition RField.hxx:153
std::unique_ptr< RFieldBase > fField
The field used to read the on-disk data.
Definition RField.hxx:152
Input parameter to RFieldBase::ReadBulk() and RFieldBase::ReadBulkImpl().
Helper types to present an offset column as array of collection sizes.