Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
RFieldVisitor.hxx
Go to the documentation of this file.
1/// \file ROOT/RFieldVisitor.hxx
2/// \ingroup NTuple ROOT7
3/// \author Simon Leisibach <simon.satoshi.rene.leisibach@cern.ch>
4/// \date 2019-06-11
5/// \warning This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback
6/// is welcome!
7
8/*************************************************************************
9 * Copyright (C) 1995-2019, Rene Brun and Fons Rademakers. *
10 * All rights reserved. *
11 * *
12 * For the licensing terms see $ROOTSYS/LICENSE. *
13 * For the list of contributors see $ROOTSYS/README/CREDITS. *
14 *************************************************************************/
15
16#ifndef ROOT7_RFieldVisitor
17#define ROOT7_RFieldVisitor
18
19#include <ROOT/RField.hxx>
20#include <ROOT/RFieldValue.hxx>
21#include <ROOT/RNTupleUtil.hxx>
22
23#include <algorithm>
24#include <iostream>
25#include <sstream>
26#include <string>
27#include <vector>
28
29namespace ROOT {
30namespace Experimental {
31namespace Detail {
32
33
34// clang-format off
35/**
36\class ROOT::Experimental::Detail::RFieldVisitor
37\ingroup NTuple
38\brief Abstract base class for classes implementing the visitor design pattern.
39
40RFieldVisitor::VisitField() is invoked by RFieldBase::AcceptVisitor(). VisitField() is inherited for instance
41by the RPrintSchemaVisitor class. The RFieldBase class and classes which inherit from it will be visited.
42*/
43// clang-format on
45public:
46 virtual void VisitField(const Detail::RFieldBase &field) = 0;
47 virtual void VisitFieldZero(const RFieldZero &field) { VisitField(field); }
48 virtual void VisitArrayField(const RArrayField &field) { VisitField(field); }
49 virtual void VisitBoolField(const RField<bool> &field) { VisitField(field); }
50 virtual void VisitClassField(const RClassField &field) { VisitField(field); }
51 virtual void VisitClusterSizeField(const RField<ClusterSize_t> &field) { VisitField(field); }
52 virtual void VisitDoubleField(const RField<double> &field) { VisitField(field); }
53 virtual void VisitFloatField(const RField<float> &field) { VisitField(field); }
54 virtual void VisitIntField(const RField<int> &field) { VisitField(field); }
55 virtual void VisitStringField(const RField<std::string> &field) { VisitField(field); }
56 virtual void VisitUInt32Field(const RField<std::uint32_t> &field) { VisitField(field); }
57 virtual void VisitUInt64Field(const RField<std::uint64_t> &field) { VisitField(field); }
58 virtual void VisitUInt8Field(const RField<std::uint8_t> &field) { VisitField(field); }
59 virtual void VisitVectorField(const RVectorField &field) { VisitField(field); }
60 virtual void VisitVectorBoolField(const RField<std::vector<bool>> &field) { VisitField(field); }
61}; // class RFieldVisitor
62
63} // namespace Detail
64
65
66// clang-format off
67/**
68\class ROOT::Experimental::RPrepareVisitor
69\ingroup NTuple
70\brief Visitor used for a pre-processing run to collect information needed by another visitor class.
71
72 Currently used for RPrintSchemaVisitor in RNTupleReader::Print() to collect information about levels, max depth etc.
73*/
74// clang-format on
76private:
77 unsigned int fDeepestLevel = 1;
78 unsigned int fNumFields = 1;
79
80public:
81 RPrepareVisitor() = default;
82 void VisitField(const Detail::RFieldBase &field) final;
83 void VisitFieldZero(const RFieldZero &field) final;
84
85 unsigned int GetDeepestLevel() const { return fDeepestLevel; }
86 unsigned int GetNumFields() const { return fNumFields; }
87};
88
89
90// clang-format off
91/**
92\class ROOT::Experimental::RPrintSchemaVisitor
93\ingroup NTuple
94\brief Contains settings for printing and prints a summary of an RField instance.
95
96This visitor is used by RNTupleReader::Print()
97*/
98// clang-format on
100private:
101 /// Where to write the printout to
102 std::ostream &fOutput;
103 /// To render the output, use an asterix (*) by default to draw table lines and boundaries
105 /// Indicates maximal number of allowed characters per line
111 int fFieldNo = 1;
112 std::string fTreePrefix;
113 std::string fFieldNoPrefix;
114
115public:
116 RPrintSchemaVisitor(std::ostream &out = std::cout, char frameSymbol = '*', int width = 80, int deepestLevel = 1,
117 int numFields = 1)
118 : fOutput{out}, fFrameSymbol{frameSymbol}, fWidth{width}, fDeepestLevel{deepestLevel}, fNumFields{numFields}
119 {
121 }
122 /// Prints summary of Field
123 void VisitField(const Detail::RFieldBase &field) final;
124 void VisitFieldZero(const RFieldZero &fieldZero) final;
125 void SetFrameSymbol(char s) { fFrameSymbol = s; }
126 void SetWidth(int w) { fWidth = w; }
127 void SetDeepestLevel(int d);
128 void SetNumFields(int n);
129 /// Computes how many characters should be placed between the frame symbol and ':' for left and right side of ':' for
130 /// visually pleasing output.
131 // E.g.
132 // * Field 1 : vpx (std::vector<float>) *
133 // * |__Field 1.1 : vpx/vpx (float) *
134 // int fAvailableSpaceKeyString (num characters on left side between "* " and " : ")
135 // deepestlevel here is 2 (1.1 is deepest and has 2 numbers).
136 // For every additional level an additional "|_" and ".1" (4 characters) is added, so the number of required
137 // additional characters is 4 * fDeepestLevel. For level 1, 8 characters are required ("Field 1 "), so an
138 // additional + 4 is added. To account for cases where the total number of fields is not a single digit number and
139 // more space is required to output big numbers, fNumFields is incorporated into the calculation. To make sure
140 // that there is still enough space for the right side of " : ", an std::min comparision with fWidth - 15 is done.
141 // int fAvailableSpaceValueString(num characters on right side between " : " and '*')
142 // The 6 subtracted characters are "* " (2) in the beginning, " : " (3) and '*' (1) on the far right.
144 {
146 std::min(4 * fDeepestLevel + 4 + static_cast<int>(std::to_string(fNumFields).size()), fWidth - 15);
148 }
149};
150
151
152// clang-format off
153/**
154\class ROOT::Experimental::RPrintValueVisitor
155\ingroup NTuple
156\brief Renders a JSON value corresponding to the field.
157*/
158// clang-format on
160public:
164
166 };
167
168private:
170 /// The output is directed to fOutput which may differ from std::cout.
171 std::ostream &fOutput;
172 unsigned int fLevel;
174
175 void PrintIndent();
176 void PrintName(const Detail::RFieldBase &field);
177 void PrintCollection(const Detail::RFieldBase &field);
178
179public:
181 std::ostream &output,
182 unsigned int level = 0,
183 RPrintOptions options = RPrintOptions())
184 : fValue(value), fOutput{output}, fLevel(level), fPrintOptions(options) {}
185
186 void VisitField(const Detail::RFieldBase &field) final;
187
188 void VisitBoolField(const RField<bool> &field) final;
189 void VisitDoubleField(const RField<double> &field) final;
190 void VisitFloatField(const RField<float> &field) final;
191 void VisitIntField(const RField<int> &field) final;
192 void VisitStringField(const RField<std::string> &field) final;
193 void VisitUInt8Field(const RField<std::uint8_t> &field) final;
194 void VisitUInt32Field(const RField<std::uint32_t> &field) final;
195 void VisitUInt64Field(const RField<std::uint64_t> &field) final;
196
197 void VisitArrayField(const RArrayField &field) final;
198 void VisitClassField(const RClassField &field) final;
199 void VisitVectorField(const RVectorField &field) final;
200 void VisitVectorBoolField(const RField<std::vector<bool>> &field) final;
201};
202
203
204// clang-format off
205/**
206\class ROOT::Experimental::RNTupleFormatter
207\ingroup NTuple
208\brief Contains helper functions for RNTupleReader::PrintInfo() and RPrintSchemaVisitor::VisitField()
209
210The functions in this class format strings which are displayed by RNTupleReader::PrintInfo() and RNTupleReader::Show().
211*/
212// clang-format on
214public:
215 // Can abbreviate long strings, e.g. ("ExampleString" , space= 8) => "Examp..."
216 static std::string FitString(const std::string &str, int availableSpace);
217};
218
219} // namespace Experimental
220} // namespace ROOT
221
222#endif
#define d(i)
Definition RSha256.hxx:102
include TDocParser_001 C image html pict1_TDocParser_001 png width
Abstract base class for classes implementing the visitor design pattern.
virtual void VisitBoolField(const RField< bool > &field)
virtual void VisitVectorBoolField(const RField< std::vector< bool > > &field)
virtual void VisitFieldZero(const RFieldZero &field)
virtual void VisitClusterSizeField(const RField< ClusterSize_t > &field)
virtual void VisitField(const Detail::RFieldBase &field)=0
virtual void VisitDoubleField(const RField< double > &field)
virtual void VisitStringField(const RField< std::string > &field)
virtual void VisitUInt32Field(const RField< std::uint32_t > &field)
virtual void VisitUInt64Field(const RField< std::uint64_t > &field)
virtual void VisitArrayField(const RArrayField &field)
virtual void VisitClassField(const RClassField &field)
virtual void VisitIntField(const RField< int > &field)
virtual void VisitUInt8Field(const RField< std::uint8_t > &field)
virtual void VisitVectorField(const RVectorField &field)
virtual void VisitFloatField(const RField< float > &field)
The generic field for fixed size arrays, which do not need an offset column.
Definition RField.hxx:342
The field for a class with dictionary.
Definition RField.hxx:277
The container field for an ntuple model, which itself has no physical representation.
Definition RField.hxx:260
Classes with dictionaries that can be inspected by TClass.
Definition RField.hxx:412
Contains helper functions for RNTupleReader::PrintInfo() and RPrintSchemaVisitor::VisitField()
static std::string FitString(const std::string &str, int availableSpace)
Visitor used for a pre-processing run to collect information needed by another visitor class.
void VisitField(const Detail::RFieldBase &field) final
void VisitFieldZero(const RFieldZero &field) final
Contains settings for printing and prints a summary of an RField instance.
std::ostream & fOutput
Where to write the printout to.
int fWidth
Indicates maximal number of allowed characters per line.
RPrintSchemaVisitor(std::ostream &out=std::cout, char frameSymbol=' *', int width=80, int deepestLevel=1, int numFields=1)
void VisitField(const Detail::RFieldBase &field) final
Prints summary of Field.
void SetAvailableSpaceForStrings()
Computes how many characters should be placed between the frame symbol and ':' for left and right sid...
char fFrameSymbol
To render the output, use an asterix (*) by default to draw table lines and boundaries.
void VisitFieldZero(const RFieldZero &fieldZero) final
Renders a JSON value corresponding to the field.
void VisitVectorBoolField(const RField< std::vector< bool > > &field) final
void VisitDoubleField(const RField< double > &field) final
std::ostream & fOutput
The output is directed to fOutput which may differ from std::cout.
void VisitArrayField(const RArrayField &field) final
void VisitFloatField(const RField< float > &field) final
void VisitStringField(const RField< std::string > &field) final
void PrintName(const Detail::RFieldBase &field)
void VisitUInt8Field(const RField< std::uint8_t > &field) final
void VisitField(const Detail::RFieldBase &field) final
void PrintCollection(const Detail::RFieldBase &field)
RPrintValueVisitor(const Detail::RFieldValue &value, std::ostream &output, unsigned int level=0, RPrintOptions options=RPrintOptions())
void VisitUInt64Field(const RField< std::uint64_t > &field) final
void VisitBoolField(const RField< bool > &field) final
void VisitVectorField(const RVectorField &field) final
void VisitClassField(const RClassField &field) final
void VisitIntField(const RField< int > &field) final
void VisitUInt32Field(const RField< std::uint32_t > &field) final
The generic field for a (nested) std::vector<Type> except for std::vector<bool>
Definition RField.hxx:306
const Int_t n
Definition legend1.C:16
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
static void output(int code)
Definition gifencode.c:226