Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
RFieldVisitor.hxx
Go to the documentation of this file.
1/// \file ROOT/RFieldVisitor.hxx
2/// \author Simon Leisibach <simon.satoshi.rene.leisibach@cern.ch>
3/// \date 2019-06-11
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_RFieldVisitor
14#define ROOT_RFieldVisitor
15
16#include <ROOT/RField.hxx>
17#include <ROOT/RNTupleTypes.hxx>
18
19#include <algorithm>
20#include <iostream>
21#include <sstream>
22#include <string>
23#include <vector>
24
25namespace ROOT {
26namespace Detail {
27
28// clang-format off
29/**
30\class ROOT::Detail::RFieldVisitor
31\ingroup NTuple
32\brief Abstract base class for classes implementing the visitor design pattern.
33
34RFieldVisitor::VisitField() is invoked by RFieldBase::AcceptVisitor().
35
36**Example: creating a custom field visitor**
37~~~ {.cpp}
38// 1. Define your visitor:
39class MyVisitor : public RFieldVisitor {
40public:
41 // This is the only method you need to define. The others will default to calling this.
42 // Only implement other methods if you need special logic for a specific field type.
43 void VisitField(const ROOT::RFieldBase &field) final {
44 // ... do custom logic here ...
45 }
46};
47
48// 2. Use it:
49const auto &field = reader->GetModel().GetConstFieldZero();
50MyVisitor visitor;
51visitor.VisitField(field);
52~~~
53
54As an example of a concrete use case, see Internal::RPrintSchemaVisitor.
55*/
56// clang-format on
58public:
59 virtual void VisitField(const ROOT::RFieldBase &field) = 0;
60 virtual void VisitFieldZero(const ROOT::RFieldZero &field) { VisitField(field); }
61 virtual void VisitArrayField(const ROOT::RArrayField &field) { VisitField(field); }
62 virtual void VisitArrayAsRVecField(const ROOT::RArrayAsRVecField &field) { VisitField(field); }
63 virtual void VisitArrayAsVectorField(const ROOT::RArrayAsVectorField &field) { VisitField(field); }
64 virtual void VisitAtomicField(const ROOT::RAtomicField &field) { VisitField(field); }
65 virtual void VisitBitsetField(const ROOT::RBitsetField &field) { VisitField(field); }
66 virtual void VisitBoolField(const ROOT::RField<bool> &field) { VisitField(field); }
67 virtual void VisitClassField(const ROOT::RClassField &field) { VisitField(field); }
68 virtual void VisitTObjectField(const ROOT::RField<TObject> &field) { VisitField(field); }
69 virtual void VisitStreamerField(const ROOT::RStreamerField &field) { VisitField(field); }
71 virtual void VisitRecordField(const ROOT::RRecordField &field) { VisitField(field); }
72 virtual void VisitCardinalityField(const ROOT::RCardinalityField &field) { VisitField(field); }
73 virtual void VisitDoubleField(const ROOT::RField<double> &field) { VisitField(field); }
74 virtual void VisitEnumField(const ROOT::REnumField &field) { VisitField(field); }
75 virtual void VisitFloatField(const ROOT::RField<float> &field) { VisitField(field); }
76 virtual void VisitByteField(const ROOT::RField<std::byte> &field) { VisitField(field); }
77 virtual void VisitCharField(const ROOT::RField<char> &field) { VisitField(field); }
78 // We have to accept RIntegralField here because there can be multiple basic types that map to the same fixed-width
79 // integer type; for example on 64-bit Unix systems, both long and long long map to std::int64_t.
80 virtual void VisitInt8Field(const ROOT::RIntegralField<std::int8_t> &field) { VisitField(field); }
81 virtual void VisitInt16Field(const ROOT::RIntegralField<std::int16_t> &field) { VisitField(field); }
82 virtual void VisitInt32Field(const ROOT::RIntegralField<std::int32_t> &field) { VisitField(field); }
83 virtual void VisitInt64Field(const ROOT::RIntegralField<std::int64_t> &field) { VisitField(field); }
84 virtual void VisitNullableField(const ROOT::RNullableField &field) { VisitField(field); }
85 virtual void VisitStringField(const ROOT::RField<std::string> &field) { VisitField(field); }
86 virtual void VisitUInt8Field(const ROOT::RIntegralField<std::uint8_t> &field) { VisitField(field); }
90 virtual void VisitVectorField(const ROOT::RVectorField &field) { VisitField(field); }
91 virtual void VisitVectorBoolField(const ROOT::RField<std::vector<bool>> &field) { VisitField(field); }
92 virtual void VisitRVecField(const ROOT::RRVecField &field) { VisitField(field); }
93}; // class RFieldVisitor
94
95} // namespace Detail
96
97namespace Internal {
98
99// clang-format off
100/**
101\class ROOT::Internal::RPrepareVisitor
102\ingroup NTuple
103\brief Visitor used for a pre-processing run to collect information needed by another visitor class.
104
105 Currently used for RPrintSchemaVisitor in RNTupleReader::PrintInfo() to collect information about levels, max depth etc.
106*/
107// clang-format on
109private:
110 unsigned int fDeepestLevel = 1;
111 unsigned int fNumFields = 1;
112
113public:
114 RPrepareVisitor() = default;
115 void VisitField(const ROOT::RFieldBase &field) final;
116 void VisitFieldZero(const ROOT::RFieldZero &field) final;
117
118 unsigned int GetDeepestLevel() const { return fDeepestLevel; }
119 unsigned int GetNumFields() const { return fNumFields; }
120};
121
122// clang-format off
123/**
124\class ROOT::Internal::RPrintSchemaVisitor
125\ingroup NTuple
126\brief Contains settings for printing and prints a summary of an RField instance.
127
128This visitor is used by RNTupleReader::PrintInfo()
129*/
130// clang-format on
132private:
133 /// Where to write the printout to
134 std::ostream &fOutput;
138 int fFieldNo = 1;
139 std::string fTreePrefix;
140 std::string fFieldNoPrefix;
141
142public:
143 RPrintSchemaVisitor(std::ostream &out = std::cout, int deepestLevel = 1, int numFields = 1)
144 : fOutput{out}, fDeepestLevel{deepestLevel}, fNumFields{numFields}
145 {
147 }
148 /// Prints summary of Field
149 void VisitField(const ROOT::RFieldBase &field) final;
150 void VisitFieldZero(const ROOT::RFieldZero &fieldZero) final;
151 void SetDeepestLevel(int d);
152 void SetNumFields(int n);
153 /// Computes how many characters should be placed between the frame symbol and ':' for left and right side of ':' for
154 /// visually pleasing output.
155 // E.g.
156 // Field 1 : vpx (std::vector<float>)
157 // Field 1.1 : vpx/vpx (float)
158 // int fAvailableSpaceKeyString (num characters on left side before " : ")
159 // deepestlevel here is 2 (1.1 is deepest and has 2 numbers).
160 // For every additional level an additional " " and ".1" (4 characters) is added, so the number of required
161 // additional characters is 4 * fDeepestLevel. For level 1, 8 characters are required ("Field 1 "), so an
162 // additional + 4 is added. To account for cases where the total number of fields is not a single digit number and
163 // more space is required to output big numbers, fNumFields is incorporated into the calculation.
165 {
166 fAvailableSpaceKeyString = 4 * fDeepestLevel + 4 + static_cast<int>(std::to_string(fNumFields).size());
167 }
168};
169
170// clang-format off
171/**
172\class ROOT::Internal::RPrintValueVisitor
173\ingroup NTuple
174\brief Renders a JSON value corresponding to the field.
175*/
176// clang-format on
178public:
185
186private:
188 /// The output is directed to fOutput which may differ from std::cout.
189 std::ostream &fOutput;
190 unsigned int fLevel;
192
193 void PrintIndent();
194 void PrintName(const ROOT::RFieldBase &field);
195 void PrintCollection(const ROOT::RFieldBase &field);
196 void PrintRecord(const ROOT::RFieldBase &field);
197
198public:
199 RPrintValueVisitor(ROOT::RFieldBase::RValue value, std::ostream &output, unsigned int level = 0,
200 RPrintOptions options = RPrintOptions())
201 : fValue(value), fOutput{output}, fLevel(level), fPrintOptions(options)
202 {
203 }
204
205 void VisitField(const ROOT::RFieldBase &field) final;
206
207 void VisitBoolField(const ROOT::RField<bool> &field) final;
208 void VisitDoubleField(const ROOT::RField<double> &field) final;
209 void VisitFloatField(const ROOT::RField<float> &field) final;
210 void VisitByteField(const ROOT::RField<std::byte> &field) final;
211 void VisitCharField(const ROOT::RField<char> &field) final;
212 void VisitInt8Field(const ROOT::RIntegralField<std::int8_t> &field) final;
216 void VisitStringField(const ROOT::RField<std::string> &field) final;
221
222 void VisitCardinalityField(const ROOT::RCardinalityField &field) final;
223 void VisitArrayField(const ROOT::RArrayField &field) final;
224 void VisitArrayAsRVecField(const ROOT::RArrayAsRVecField &field) final;
225 void VisitArrayAsVectorField(const ROOT::RArrayAsVectorField &field) final;
226 void VisitClassField(const ROOT::RClassField &field) final;
227 void VisitTObjectField(const ROOT::RField<TObject> &field) final;
228 void VisitStreamerField(const ROOT::RStreamerField &field) final;
229 void VisitRecordField(const ROOT::RRecordField &field) final;
231 void VisitVectorField(const ROOT::RVectorField &field) final;
232 void VisitVectorBoolField(const ROOT::RField<std::vector<bool>> &field) final;
233 void VisitRVecField(const ROOT::RRVecField &field) final;
234 void VisitBitsetField(const ROOT::RBitsetField &field) final;
235 void VisitNullableField(const ROOT::RNullableField &field) final;
236 void VisitEnumField(const ROOT::REnumField &field) final;
237 void VisitAtomicField(const ROOT::RAtomicField &field) final;
238};
239
240// clang-format off
241/**
242\class ROOT::Internal::RNTupleFormatter
243\ingroup NTuple
244\brief Contains helper functions for RNTupleReader::PrintInfo() and RPrintSchemaVisitor::VisitField()
245
246The functions in this class format strings which are displayed by RNTupleReader::PrintInfo() and RNTupleReader::Show().
247*/
248// clang-format on
250public:
251 // Can abbreviate long strings, e.g. ("ExampleString" , space= 8) => "Examp..."
252 static std::string FitString(const std::string &str, int availableSpace);
253};
254
255} // namespace Internal
256} // namespace ROOT
257
258#endif
#define d(i)
Definition RSha256.hxx:102
Abstract base class for classes implementing the visitor design pattern.
virtual void VisitBitsetField(const ROOT::RBitsetField &field)
virtual void VisitByteField(const ROOT::RField< std::byte > &field)
virtual void VisitVectorField(const ROOT::RVectorField &field)
virtual void VisitInt64Field(const ROOT::RIntegralField< std::int64_t > &field)
virtual void VisitInt8Field(const ROOT::RIntegralField< std::int8_t > &field)
virtual void VisitVectorBoolField(const ROOT::RField< std::vector< bool > > &field)
virtual void VisitCharField(const ROOT::RField< char > &field)
virtual void VisitRVecField(const ROOT::RRVecField &field)
virtual void VisitDoubleField(const ROOT::RField< double > &field)
virtual void VisitUInt32Field(const ROOT::RIntegralField< std::uint32_t > &field)
virtual void VisitProxiedCollectionField(const ROOT::RProxiedCollectionField &field)
virtual void VisitArrayAsRVecField(const ROOT::RArrayAsRVecField &field)
virtual void VisitCardinalityField(const ROOT::RCardinalityField &field)
virtual void VisitInt32Field(const ROOT::RIntegralField< std::int32_t > &field)
virtual void VisitTObjectField(const ROOT::RField< TObject > &field)
virtual void VisitUInt8Field(const ROOT::RIntegralField< std::uint8_t > &field)
virtual void VisitArrayAsVectorField(const ROOT::RArrayAsVectorField &field)
virtual void VisitFieldZero(const ROOT::RFieldZero &field)
virtual void VisitStreamerField(const ROOT::RStreamerField &field)
virtual void VisitField(const ROOT::RFieldBase &field)=0
virtual void VisitEnumField(const ROOT::REnumField &field)
virtual void VisitStringField(const ROOT::RField< std::string > &field)
virtual void VisitArrayField(const ROOT::RArrayField &field)
virtual void VisitUInt16Field(const ROOT::RIntegralField< std::uint16_t > &field)
virtual void VisitNullableField(const ROOT::RNullableField &field)
virtual void VisitInt16Field(const ROOT::RIntegralField< std::int16_t > &field)
virtual void VisitUInt64Field(const ROOT::RIntegralField< std::uint64_t > &field)
virtual void VisitClassField(const ROOT::RClassField &field)
virtual void VisitBoolField(const ROOT::RField< bool > &field)
virtual void VisitRecordField(const ROOT::RRecordField &field)
virtual void VisitAtomicField(const ROOT::RAtomicField &field)
virtual void VisitFloatField(const ROOT::RField< float > &field)
Contains helper functions for RNTupleReader::PrintInfo() and RPrintSchemaVisitor::VisitField().
static std::string FitString(const std::string &str, int availableSpace)
unsigned int GetDeepestLevel() const
unsigned int GetNumFields() const
void VisitFieldZero(const ROOT::RFieldZero &field) final
void VisitField(const ROOT::RFieldBase &field) final
void VisitFieldZero(const ROOT::RFieldZero &fieldZero) final
void SetAvailableSpaceForStrings()
Computes how many characters should be placed between the frame symbol and ':' for left and right sid...
void VisitField(const ROOT::RFieldBase &field) final
Prints summary of Field.
RPrintSchemaVisitor(std::ostream &out=std::cout, int deepestLevel=1, int numFields=1)
std::ostream & fOutput
Where to write the printout to.
void VisitVectorField(const ROOT::RVectorField &field) final
void VisitEnumField(const ROOT::REnumField &field) final
void VisitRVecField(const ROOT::RRVecField &field) final
void VisitUInt16Field(const ROOT::RIntegralField< std::uint16_t > &field) final
void VisitCardinalityField(const ROOT::RCardinalityField &field) final
void VisitCharField(const ROOT::RField< char > &field) final
void PrintRecord(const ROOT::RFieldBase &field)
void VisitAtomicField(const ROOT::RAtomicField &field) final
void VisitClassField(const ROOT::RClassField &field) final
void VisitTObjectField(const ROOT::RField< TObject > &field) final
void VisitInt64Field(const ROOT::RIntegralField< std::int64_t > &field) final
void VisitInt32Field(const ROOT::RIntegralField< std::int32_t > &field) final
void PrintName(const ROOT::RFieldBase &field)
void VisitByteField(const ROOT::RField< std::byte > &field) final
void VisitArrayAsVectorField(const ROOT::RArrayAsVectorField &field) final
void VisitStringField(const ROOT::RField< std::string > &field) final
void VisitArrayField(const ROOT::RArrayField &field) final
std::ostream & fOutput
The output is directed to fOutput which may differ from std::cout.
void VisitFloatField(const ROOT::RField< float > &field) final
void VisitRecordField(const ROOT::RRecordField &field) final
void VisitBitsetField(const ROOT::RBitsetField &field) final
void VisitUInt32Field(const ROOT::RIntegralField< std::uint32_t > &field) final
RPrintValueVisitor(ROOT::RFieldBase::RValue value, std::ostream &output, unsigned int level=0, RPrintOptions options=RPrintOptions())
void VisitBoolField(const ROOT::RField< bool > &field) final
void VisitVectorBoolField(const ROOT::RField< std::vector< bool > > &field) final
void VisitInt16Field(const ROOT::RIntegralField< std::int16_t > &field) final
void VisitNullableField(const ROOT::RNullableField &field) final
void VisitDoubleField(const ROOT::RField< double > &field) final
void VisitArrayAsRVecField(const ROOT::RArrayAsRVecField &field) final
void VisitField(const ROOT::RFieldBase &field) final
void VisitProxiedCollectionField(const ROOT::RProxiedCollectionField &field) final
void VisitStreamerField(const ROOT::RStreamerField &field) final
void PrintCollection(const ROOT::RFieldBase &field)
ROOT::RFieldBase::RValue fValue
void VisitInt8Field(const ROOT::RIntegralField< std::int8_t > &field) final
void VisitUInt64Field(const ROOT::RIntegralField< std::uint64_t > &field) final
void VisitUInt8Field(const ROOT::RIntegralField< std::uint8_t > &field) final
Additional classes related to sequence containers.
A field for fixed-size arrays that are represented as std::vector in memory.
Template specializations for C++ std::array and C-style arrays.
Template specializations for C++ std::atomic.
Template specializations for C++ std::bitset.
An artificial field that transforms an RNTuple column that contains the offset of collections into co...
Definition RField.hxx:347
The field for a class with dictionary.
Definition RField.hxx:135
The field for an unscoped or scoped enum with dictionary.
Definition RField.hxx:290
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.
The container field for an ntuple model, which itself has no physical representation.
Definition RField.hxx:58
Classes with dictionaries that can be inspected by TClass.
Definition RField.hxx:320
Template specializations for C++ std::optional and std::unique_ptr.
The field for a class representing a collection of elements via TVirtualCollectionProxy.
Template specializations for ROOT's RVec.
The field for an untyped record.
The field for a class using ROOT standard streaming.
Definition RField.hxx:235
Template specializations for C++ std::vector.
const Int_t n
Definition legend1.C:16
Special implementation of ROOT::RRangeCast for TCollection, including a check that the cast target ty...
Definition TObject.h:395