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
72protected:
73 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
74 void ConstructValue(void *) const final {}
75
76public:
77 RFieldZero() : RFieldBase("", "", ROOT::ENTupleStructure::kRecord, false /* isSimple */) {}
78
80 size_t GetValueSize() const final { return 0; }
81 size_t GetAlignment() const final { return 0; }
82
84
86 /// Moves all subfields into the returned vector.
87 std::vector<std::unique_ptr<RFieldBase>> ReleaseSubfields();
88};
89
90/// Used in RFieldBase::Check() to record field creation failures.
91/// Also used when deserializing a field that contains unknown values that may come from
92/// future RNTuple versions (e.g. an unknown Structure)
94public:
95 enum class ECategory {
96 /// Generic unrecoverable error
98 /// The type given to RFieldBase::Create was invalid
100 /// The type given to RFieldBase::Create was unknown
102 /// The field could not be created because its descriptor had an unknown structural role
104 };
105
106 using RCategory R__DEPRECATED(6, 42, "enum renamed to ECategory") = ECategory;
107
108private:
109 std::string fError;
111
112protected:
113 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final
114 {
115 return std::make_unique<RInvalidField>(newName, GetTypeName(), fError, fCategory);
116 }
117 void ConstructValue(void *) const final {}
118
119public:
120 RInvalidField(std::string_view name, std::string_view type, std::string_view error, ECategory category)
121 : RFieldBase(name, type, ROOT::ENTupleStructure::kPlain, false /* isSimple */), fError(error), fCategory(category)
122 {
124 }
125
126 const std::string &GetError() const { return fError; }
127 ECategory GetCategory() const { return fCategory; }
128
129 size_t GetValueSize() const final { return 0; }
130 size_t GetAlignment() const final { return 0; }
131}; // RInvalidField
132
133/// The field for a class with dictionary
134class RClassField : public RFieldBase {
135private:
142 std::size_t fOffset;
143 };
144 // Information to read into the staging area a field that is used as an input to an I/O customization rule
146 /// The field used to read the on-disk data. The fields type may be different from the on-disk type as long
147 /// as the on-disk type can be converted to the fields type (through type cast / schema evolution).
148 std::unique_ptr<RFieldBase> fField;
149 std::size_t fOffset; ///< offset in fStagingArea
150 };
151 /// Prefix used in the subfield names generated for base classes
152 static constexpr const char *kPrefixInherited{":"};
153
154 class RClassDeleter : public RDeleter {
155 private:
157
158 public:
159 explicit RClassDeleter(TClass *cl) : fClass(cl) {}
160 void operator()(void *objPtr, bool dtorOnly) final;
161 };
162
164 /// Additional information kept for each entry in `fSubfields`
165 std::vector<RSubFieldInfo> fSubfieldsInfo;
166 std::size_t fMaxAlignment = 1;
167
168 /// The staging area stores inputs to I/O rules according to the offsets given by the streamer info of
169 /// "TypeName@@Version". The area is allocated depending on I/O rules resp. the source members of the I/O rules.
170 std::unique_ptr<unsigned char[]> fStagingArea;
171 /// The TClass instance that corresponds to the staging area.
172 /// The staging class exists as <class name>@@<on-disk version> if the on-disk version is different from the
173 /// current in-memory version, or it can be accessed by the first @@alloc streamer element of the current streamer
174 /// info.
176 std::unordered_map<std::string, RStagingItem> fStagingItems; ///< Lookup staging items by member name
177
178private:
179 RClassField(std::string_view fieldName, const RClassField &source); ///< Used by CloneImpl
180 RClassField(std::string_view fieldName, TClass *classp);
181 void Attach(std::unique_ptr<RFieldBase> child, RSubFieldInfo info);
182
183 /// Returns the id of member 'name' in the class field given by 'fieldId', or kInvalidDescriptorId if no such
184 /// member exist. Looks recursively in base classes.
187 /// Sets fStagingClass according to the given name and version
188 void SetStagingClass(const std::string &className, unsigned int classVersion);
189 /// If there are rules with inputs (source members), create the staging area according to the TClass instance
190 /// that corresponds to the on-disk field.
191 void PrepareStagingArea(const std::vector<const TSchemaRule *> &rules, const ROOT::RNTupleDescriptor &desc,
193 /// Register post-read callback corresponding to a ROOT I/O customization rules.
195 /// Given the on-disk information from the page source, find all the I/O customization rules that apply
196 /// to the class field at hand, to which the fieldDesc descriptor, if provided, must correspond.
197 /// Fields may not have an on-disk representation (e.g., when inserted by schema evolution), in which case the passed
198 /// field descriptor is nullptr.
199 std::vector<const TSchemaRule *> FindRules(const ROOT::RFieldDescriptor *fieldDesc);
200
201protected:
202 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
203
204 void ConstructValue(void *where) const final;
205 std::unique_ptr<RDeleter> GetDeleter() const final { return std::make_unique<RClassDeleter>(fClass); }
206
207 std::size_t AppendImpl(const void *from) final;
208 void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final;
209 void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final;
210
211 std::unique_ptr<RFieldBase> BeforeConnectPageSource(ROOT::Internal::RPageSource &pageSource) final;
212 void ReconcileOnDiskField(const RNTupleDescriptor &desc) final;
213
214public:
215 RClassField(std::string_view fieldName, std::string_view className);
218 ~RClassField() override;
219
220 std::vector<RValue> SplitValue(const RValue &value) const final;
221 size_t GetValueSize() const final;
223 std::uint32_t GetTypeVersion() const final;
224 std::uint32_t GetTypeChecksum() const final;
225 /// For polymorphic classes (that declare or inherit at least one virtual method), return the expected dynamic type
226 /// of any user object. If the class is not polymorphic, return nullptr.
229};
230
231/// The field for a class using ROOT standard streaming
233private:
235 private:
237
238 public:
239 explicit RStreamerFieldDeleter(TClass *cl) : fClass(cl) {}
240 void operator()(void *objPtr, bool dtorOnly) final;
241 };
242
243 TClass *fClass = nullptr;
244 ROOT::Internal::RNTupleSerializer::StreamerInfoMap_t fStreamerInfos; ///< streamer info records seen during writing
245 ROOT::Internal::RColumnIndex fIndex; ///< number of bytes written in the current cluster
246
247private:
248 RStreamerField(std::string_view fieldName, TClass *classp);
249
250protected:
251 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
252
254 void GenerateColumns() final;
256
257 void ConstructValue(void *where) const final;
258 std::unique_ptr<RDeleter> GetDeleter() const final { return std::make_unique<RStreamerFieldDeleter>(fClass); }
259
260 std::size_t AppendImpl(const void *from) final;
261 void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final;
262
263 void CommitClusterImpl() final { fIndex = 0; }
264
265 bool HasExtraTypeInfo() const final { return true; }
266 // Returns the list of seen streamer infos
268
269 std::unique_ptr<RFieldBase> BeforeConnectPageSource(ROOT::Internal::RPageSource &source) final;
271
272public:
273 RStreamerField(std::string_view fieldName, std::string_view className, std::string_view typeAlias = "");
277
278 size_t GetValueSize() const final;
279 size_t GetAlignment() const final;
280 std::uint32_t GetTypeVersion() const final;
281 std::uint32_t GetTypeChecksum() const final;
283};
284
285/// The field for an unscoped or scoped enum with dictionary
287private:
288 REnumField(std::string_view fieldName, TEnum *enump);
289 REnumField(std::string_view fieldName, std::string_view enumName, std::unique_ptr<RFieldBase> intField);
290
291protected:
292 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
293
294 void ConstructValue(void *where) const final { CallConstructValueOn(*fSubfields[0], where); }
295
296 std::size_t AppendImpl(const void *from) final { return CallAppendOn(*fSubfields[0], from); }
299
300 void ReconcileOnDiskField(const RNTupleDescriptor &desc) final;
301
302public:
303 REnumField(std::string_view fieldName, std::string_view enumName);
306 ~REnumField() override = default;
307
308 std::vector<RValue> SplitValue(const RValue &value) const final;
309 size_t GetValueSize() const final { return fSubfields[0]->GetValueSize(); }
310 size_t GetAlignment() const final { return fSubfields[0]->GetAlignment(); }
312};
313
314/// Classes with dictionaries that can be inspected by TClass
315template <typename T, typename = void>
316class RField final : public RClassField {
317public:
318 static std::string TypeName() { return ROOT::Internal::GetRenormalizedTypeName(typeid(T)); }
319 RField(std::string_view name) : RClassField(name, TypeName())
320 {
321 static_assert(std::is_class_v<T>, "no I/O support for this basic C++ type");
322 }
323 RField(RField &&other) = default;
326};
327
330public:
331 static std::string TypeName() { return ROOT::Internal::GetRenormalizedTypeName(typeid(T)); }
332 RField(std::string_view name) : REnumField(name, TypeName()) {}
333 RField(RField &&other) = default;
334 RField &operator=(RField &&other) = default;
335 ~RField() final = default;
336};
337
338/// An artificial field that transforms an RNTuple column that contains the offset of collections into
339/// collection sizes. It is only used for reading, e.g. as projected field or as an artificial field that provides the
340/// "number of" RDF columns for collections (e.g. `R_rdf_sizeof_jets` for a collection named `jets`).
341/// It is used in the templated RField<RNTupleCardinality<SizeT>> form, which represents the collection sizes either
342/// as 32bit unsigned int (std::uint32_t) or as 64bit unsigned int (std::uint64_t).
344 friend class ROOT::RNTupleCollectionView; // to access GetCollectionInfo()
345
346private:
355
356protected:
357 RCardinalityField(std::string_view fieldName, std::string_view typeName)
358 : RFieldBase(fieldName, typeName, ROOT::ENTupleStructure::kPlain, false /* isSimple */)
359 {
360 }
361
362 const RColumnRepresentations &GetColumnRepresentations() const final;
363 // Field is only used for reading
364 void GenerateColumns() final { throw RException(R__FAIL("Cardinality fields must only be used for reading")); }
365 void GenerateColumns(const ROOT::RNTupleDescriptor &) final;
366
367 void ReconcileOnDiskField(const RNTupleDescriptor &desc) final;
368
369public:
372 ~RCardinalityField() override = default;
373
374 void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final;
375
376 const RField<RNTupleCardinality<std::uint32_t>> *As32Bit() const;
377 const RField<RNTupleCardinality<std::uint64_t>> *As64Bit() const;
378};
379
380template <typename T>
381class RSimpleField : public RFieldBase {
382 void ReconcileIntegralField(const RNTupleDescriptor &desc);
383 void ReconcileFloatingPointField(const RNTupleDescriptor &desc);
384
385protected:
388
389 void ConstructValue(void *where) const final { new (where) T{0}; }
390
391 void ReconcileOnDiskField(const RNTupleDescriptor &desc) override
392 {
393 if constexpr (std::is_integral_v<T>) {
394 ReconcileIntegralField(desc);
395 } else if constexpr (std::is_floating_point_v<T>) {
396 ReconcileFloatingPointField(desc);
397 } else {
398 RFieldBase::ReconcileOnDiskField(desc);
399 }
400 }
401
402 RSimpleField(std::string_view name, std::string_view type)
403 : RFieldBase(name, type, ROOT::ENTupleStructure::kPlain, true /* isSimple */)
404 {
405 fTraits |= kTraitTrivialType;
406 }
407
408public:
411 ~RSimpleField() override = default;
412
413 T *Map(ROOT::NTupleSize_t globalIndex) { return fPrincipalColumn->Map<T>(globalIndex); }
414 T *Map(RNTupleLocalIndex localIndex) { return fPrincipalColumn->Map<T>(localIndex); }
416 {
417 return fPrincipalColumn->MapV<T>(globalIndex, nItems);
418 }
420 {
421 return fPrincipalColumn->MapV<T>(localIndex, nItems);
422 }
423
424 size_t GetValueSize() const final { return sizeof(T); }
425 size_t GetAlignment() const final { return alignof(T); }
426};
427
428////////////////////////////////////////////////////////////////////////////////
429/// Template specializations for concrete C++ types
430////////////////////////////////////////////////////////////////////////////////
431
432} // namespace ROOT
433
439
440namespace ROOT {
441
442template <typename SizeT>
445
446protected:
447 std::unique_ptr<ROOT::RFieldBase> CloneImpl(std::string_view newName) const final
448 {
449 return std::make_unique<RField>(newName);
450 }
451 void ConstructValue(void *where) const final { new (where) CardinalityType(0); }
452
453 /// Get the number of elements of the collection identified by globalIndex
455 {
458 fPrincipalColumn->GetCollectionInfo(globalIndex, &collectionStart, &size);
459 *static_cast<CardinalityType *>(to) = size;
460 }
461
462 /// Get the number of elements of the collection identified by clusterIndex
464 {
467 fPrincipalColumn->GetCollectionInfo(localIndex, &collectionStart, &size);
468 *static_cast<CardinalityType *>(to) = size;
469 }
470
471 std::size_t ReadBulkImpl(const RBulkSpec &bulkSpec) final
472 {
475 fPrincipalColumn->GetCollectionInfo(bulkSpec.fFirstIndex, &collectionStart, &collectionSize);
476
477 auto typedValues = static_cast<CardinalityType *>(bulkSpec.fValues);
479
480 auto lastOffset = collectionStart.GetIndexInCluster() + collectionSize;
482 std::size_t nEntries = 1;
483 while (nRemainingEntries > 0) {
485 auto offsets =
486 fPrincipalColumn->MapV<ROOT::Internal::RColumnIndex>(bulkSpec.fFirstIndex + nEntries, nItemsUntilPageEnd);
487 std::size_t nBatch = std::min(nRemainingEntries, nItemsUntilPageEnd);
488 for (std::size_t i = 0; i < nBatch; ++i) {
489 typedValues[nEntries + i] = offsets[i] - lastOffset;
490 lastOffset = offsets[i];
491 }
493 nEntries += nBatch;
494 }
495 return RBulkSpec::kAllSet;
496 }
497
498public:
499 static std::string TypeName() { return "ROOT::RNTupleCardinality<" + RField<SizeT>::TypeName() + ">"; }
500 explicit RField(std::string_view name) : RCardinalityField(name, TypeName()) {}
501 RField(RField &&other) = default;
504
505 size_t GetValueSize() const final { return sizeof(CardinalityType); }
506 size_t GetAlignment() const final { return alignof(CardinalityType); }
507};
508
509/// TObject requires special handling of the fBits and fUniqueID members
510template <>
512 static std::size_t GetOffsetOfMember(const char *name);
513 static std::size_t GetOffsetUniqueID() { return GetOffsetOfMember("fUniqueID"); }
514 static std::size_t GetOffsetBits() { return GetOffsetOfMember("fBits"); }
515
516private:
517 RField(std::string_view fieldName, const RField<TObject> &source); ///< Used by CloneImpl()
518
519protected:
520 std::unique_ptr<RFieldBase> CloneImpl(std::string_view newName) const final;
521
522 void ConstructValue(void *where) const final;
523 std::unique_ptr<RDeleter> GetDeleter() const final { return std::make_unique<RTypedDeleter<TObject>>(); }
524
525 std::size_t AppendImpl(const void *from) final;
526 void ReadTObject(void *to, UInt_t uniqueID, UInt_t bits);
527 void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final;
528 void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final;
529
530public:
531 static std::string TypeName() { return "TObject"; }
532
533 RField(std::string_view fieldName);
534 RField(RField &&other) = default;
537
538 std::vector<RValue> SplitValue(const RValue &value) const final;
539 size_t GetValueSize() const final;
540 size_t GetAlignment() const final;
541 std::uint32_t GetTypeVersion() const final;
542 std::uint32_t GetTypeChecksum() const final;
543 void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final;
544};
545
546// Have to be implemented after the definition of all RField<T> types
547
548namespace Internal {
549
550/// Helper to check if a given type name is the one expected of Field<T>. Usually, this check can be done by
551/// type renormalization of the demangled type name T. The failure case, however, needs to additionally check for
552/// ROOT-specific special cases.
553template <class T>
554bool IsMatchingFieldType(const std::string &actualTypeName)
555{
557}
558
559} // namespace Internal
560
561template <typename T>
562std::unique_ptr<T, typename RFieldBase::RCreateObjectDeleter<T>::deleter> RFieldBase::CreateObject() const
563{
564 if (!Internal::IsMatchingFieldType<T>(GetTypeName())) {
565 throw RException(
566 R__FAIL("type mismatch for field " + GetFieldName() + ": " + GetTypeName() + " vs. " + RField<T>::TypeName()));
567 }
568 return std::unique_ptr<T>(static_cast<T *>(CreateObjectRawPtr()));
569}
570
571// The void type is specialized in RField.cxx
572
573template <>
578
579template <>
580std::unique_ptr<void, typename RFieldBase::RCreateObjectDeleter<void>::deleter>
581ROOT::RFieldBase::CreateObject<void>() const;
582
583} // namespace ROOT
584
585#endif
Cppyy::TCppType_t fClass
#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
Binding & operator=(OUT(*fun)(void))
Abstract base class for classes implementing the visitor design pattern.
The in-memory representation of a 32bit or 64bit on-disk index column.
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:343
RCardinalityField(RCardinalityField &&other)=default
void GetCollectionInfo(ROOT::NTupleSize_t globalIndex, RNTupleLocalIndex *collectionStart, ROOT::NTupleSize_t *size)
Definition RField.hxx:347
RCardinalityField & operator=(RCardinalityField &&other)=default
void GetCollectionInfo(RNTupleLocalIndex localIndex, RNTupleLocalIndex *collectionStart, ROOT::NTupleSize_t *size)
Definition RField.hxx:351
~RCardinalityField() override=default
RCardinalityField(std::string_view fieldName, std::string_view typeName)
Definition RField.hxx:357
void operator()(void *objPtr, bool dtorOnly) final
The field for a class with dictionary.
Definition RField.hxx:134
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:175
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:165
std::size_t fMaxAlignment
Definition RField.hxx:166
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:170
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
Definition RField.hxx:222
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:163
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:205
std::unordered_map< std::string, RStagingItem > fStagingItems
Lookup staging items by member name.
Definition RField.hxx:176
static constexpr const char * kPrefixInherited
Prefix used in the subfield names generated for base classes.
Definition RField.hxx:152
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:286
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
Definition RField.hxx:309
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
Definition RField.hxx:310
~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:294
void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final
Definition RField.hxx:298
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
Definition RField.hxx:297
REnumField & operator=(REnumField &&other)=default
std::size_t AppendImpl(const void *from) final
Operations on values of complex types, e.g.
Definition RField.hxx:296
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.
void Attach(std::unique_ptr< RFieldBase > child)
Add a new subfield to the list of nested fields.
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.
virtual void GenerateColumns()
Implementations in derived classes should create the backing columns corresponding to the field type ...
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.
virtual ROOT::RExtraTypeInfoDescriptor GetExtraTypeInfo() const
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
void AcceptVisitor(ROOT::Detail::RFieldVisitor &visitor) const final
Definition RField.cxx:58
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
Definition RField.hxx:80
bool GetAllowFieldSubstitutions() const
Definition RField.hxx:85
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:74
std::unique_ptr< RFieldBase > CloneImpl(std::string_view newName) const final
Called by Clone(), which additionally copies the on-disk ID.
Definition RField.cxx:41
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
Definition RField.hxx:81
std::vector< std::unique_ptr< RFieldBase > > ReleaseSubfields()
Moves all subfields into the returned vector.
Definition RField.cxx:49
bool fAllowFieldSubstitutions
If field substitutions are allowed, upon connecting to a page source the field hierarchy will replace...
Definition RField.hxx:70
void ReadGlobalImpl(ROOT::NTupleSize_t globalIndex, void *to) final
Get the number of elements of the collection identified by globalIndex.
Definition RField.hxx:454
RField & operator=(RField &&other)=default
std::size_t ReadBulkImpl(const RBulkSpec &bulkSpec) final
General implementation of bulk read.
Definition RField.hxx:471
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:451
void ReadInClusterImpl(RNTupleLocalIndex localIndex, void *to) final
Get the number of elements of the collection identified by clusterIndex.
Definition RField.hxx:463
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:447
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
Definition RField.hxx:506
RField(RField &&other)=default
RField & operator=(RField &&other)=default
~RField() final=default
static std::string TypeName()
Definition RField.hxx:531
std::unique_ptr< RDeleter > GetDeleter() const final
Definition RField.hxx:523
static std::size_t GetOffsetBits()
Definition RField.hxx:514
static std::size_t GetOffsetUniqueID()
Definition RField.hxx:513
Classes with dictionaries that can be inspected by TClass.
Definition RField.hxx:316
~RField() final=default
RField(RField &&other)=default
RField & operator=(RField &&other)=default
static std::string TypeName()
Definition RField.hxx:318
RField(std::string_view name)
Definition RField.hxx:319
Used in RFieldBase::Check() to record field creation failures.
Definition RField.hxx:93
RInvalidField(std::string_view name, std::string_view type, std::string_view error, ECategory category)
Definition RField.hxx:120
@ 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:113
ECategory fCategory
Definition RField.hxx:110
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
Definition RField.hxx:130
std::string fError
Definition RField.hxx:109
const std::string & GetError() const
Definition RField.hxx:126
ECategory GetCategory() const
Definition RField.hxx:127
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
Definition RField.hxx:129
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:117
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:386
size_t GetAlignment() const final
As a rule of thumb, the alignment is equal to the size of the type.
Definition RField.hxx:425
RSimpleField & operator=(RSimpleField &&other)=default
RSimpleField(std::string_view name, std::string_view type)
Definition RField.hxx:402
T * Map(RNTupleLocalIndex localIndex)
Definition RField.hxx:414
~RSimpleField() override=default
T * Map(ROOT::NTupleSize_t globalIndex)
Definition RField.hxx:413
size_t GetValueSize() const final
The number of bytes taken by a value of the appropriate type.
Definition RField.hxx:424
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:391
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:389
T * MapV(ROOT::NTupleSize_t globalIndex, ROOT::NTupleSize_t &nItems)
Definition RField.hxx:415
void GenerateColumns(const ROOT::RNTupleDescriptor &desc) override
Implementations in derived classes should create the backing columns corresponding to the field type ...
Definition RField.hxx:387
T * MapV(RNTupleLocalIndex localIndex, ROOT::NTupleSize_t &nItems)
Definition RField.hxx:419
The field for a class using ROOT standard streaming.
Definition RField.hxx:232
ROOT::Internal::RNTupleSerializer::StreamerInfoMap_t fStreamerInfos
streamer info records seen during writing
Definition RField.hxx:244
ROOT::Internal::RColumnIndex fIndex
number of bytes written in the current cluster
Definition RField.hxx:245
bool HasExtraTypeInfo() const final
Definition RField.hxx:265
void CommitClusterImpl() final
Definition RField.hxx:263
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:41
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:554
std::string GetRenormalizedTypeName(const std::string &metaNormalizedName)
Given a type name normalized by ROOT meta, renormalize it for RNTuple. E.g., insert std::prefix.
std::uint64_t DescriptorId_t
Distriniguishes elements of the same type within a descriptor, e.g. different fields.
std::uint64_t NTupleSize_t
Integer type long enough to hold the maximum number of entries in a column.
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:149
std::unique_ptr< RFieldBase > fField
The field used to read the on-disk data.
Definition RField.hxx:148
Input parameter to RFieldBase::ReadBulk() and RFieldBase::ReadBulkImpl().
Helper types to present an offset column as array of collection sizes.