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