Logo ROOT  
Reference Guide
 
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Loading...
Searching...
No Matches
RFieldVisitor.cxx
Go to the documentation of this file.
1/// \file RFieldVisitor.cxx
2/// \ingroup NTuple
3/// \author Simon Leisibach <simon.leisibach@gmail.com>
4/// \date 2019-06-11
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#include <ROOT/RField.hxx>
16#include <ROOT/RNTupleUtil.hxx>
17#include <ROOT/RNTupleView.hxx>
18
19#include <cassert>
20#include <iomanip>
21#include <iostream>
22#include <sstream>
23#include <string>
24#include <vector>
25
26
27//----------------------------- RPrepareVisitor --------------------------------
28
30{
31 auto subfields = field.GetConstSubfields();
32 for (auto f : subfields) {
34 f->AcceptVisitor(visitor);
35 fNumFields += visitor.fNumFields;
36 fDeepestLevel = std::max(fDeepestLevel, 1 + visitor.fDeepestLevel);
37 }
38}
39
41{
42 VisitField(field);
43 fNumFields--;
44 fDeepestLevel--;
45}
46
47
48//---------------------------- RPrintSchemaVisitor -----------------------------
49
51{
52 fDeepestLevel = d;
53}
54
56{
57 fNumFields = n;
58 SetAvailableSpaceForStrings();
59}
60
62{
63 fOutput << fFrameSymbol << ' ';
64
65 std::string key = fTreePrefix;
66 key += "Field " + fFieldNoPrefix + std::to_string(fFieldNo);
67 fOutput << RNTupleFormatter::FitString(key, fAvailableSpaceKeyString);
68 fOutput << " : ";
69
70 std::string value = field.GetFieldName();
71 if (!field.GetTypeName().empty())
72 value += " (" + field.GetTypeName() + ")";
73 fOutput << RNTupleFormatter::FitString(value, fAvailableSpaceValueString);
74 fOutput << fFrameSymbol << std::endl;
75
76 auto subfields = field.GetConstSubfields();
77 auto fieldNo = 1;
78 for (auto iField = subfields.begin(); iField != subfields.end();) {
80 visitor.fFieldNo = fieldNo++;
81 visitor.fFieldNoPrefix += std::to_string(fFieldNo) + ".";
82
83 auto f = *iField;
84 ++iField;
85 // TODO(jblomer): implement tree drawing
86 visitor.fTreePrefix += " ";
87 f->AcceptVisitor(visitor);
88 }
89}
90
92{
93 auto fieldNo = 1;
94 for (auto f : fieldZero.GetConstSubfields()) {
96 visitor.fFieldNo = fieldNo++;
97 f->AcceptVisitor(visitor);
98 }
99}
100
101
102//--------------------------- RPrintValueVisitor -------------------------------
103
105{
106 if (fPrintOptions.fPrintSingleLine)
107 return;
108
109 for (unsigned int i = 0; i < fLevel; ++i)
110 fOutput << " ";
111}
112
114{
115 if (fPrintOptions.fPrintName)
116 fOutput << "\"" << field.GetFieldName() << "\": ";
117}
118
120{
121 PrintIndent();
122 PrintName(field);
123 fOutput << "[";
124 auto elems = field.SplitValue(fValue);
125 for (auto iValue = elems.begin(); iValue != elems.end(); ) {
126 RPrintOptions options;
127 options.fPrintSingleLine = true;
128 options.fPrintName = false;
129 RPrintValueVisitor elemVisitor(*iValue, fOutput, 0 /* level */, options);
130 iValue->GetField().AcceptVisitor(elemVisitor);
131
132 if (++iValue == elems.end())
133 break;
134 else
135 fOutput << ", ";
136 }
137 fOutput << "]";
138}
139
141{
142 PrintIndent();
143 PrintName(field);
144 fOutput << "{";
145 auto elems = field.SplitValue(fValue);
146 for (auto iValue = elems.begin(); iValue != elems.end();) {
147 if (!fPrintOptions.fPrintSingleLine)
148 fOutput << std::endl;
149
150 RPrintOptions options;
151 options.fPrintSingleLine = fPrintOptions.fPrintSingleLine;
152 RPrintValueVisitor visitor(*iValue, fOutput, fLevel + 1, options);
153 iValue->GetField().AcceptVisitor(visitor);
154
155 if (++iValue == elems.end()) {
156 if (!fPrintOptions.fPrintSingleLine)
157 fOutput << std::endl;
158 break;
159 } else {
160 fOutput << ",";
161 if (fPrintOptions.fPrintSingleLine)
162 fOutput << " ";
163 }
164 }
165 PrintIndent();
166 fOutput << "}";
167}
168
170{
171 PrintIndent();
172 PrintName(field);
173 fOutput << "\"<unsupported type: " << field.GetTypeName() << ">\"";
174}
175
177{
178 PrintIndent();
179 PrintName(field);
180 if (fValue.GetRef<bool>())
181 fOutput << "true";
182 else
183 fOutput << "false";
184}
185
187{
188 PrintIndent();
189 PrintName(field);
190 fOutput << fValue.GetRef<double>();
191}
192
194{
195 PrintIndent();
196 PrintName(field);
197 fOutput << fValue.GetRef<float>();
198}
199
201{
202 PrintIndent();
203 PrintName(field);
204 char prev = std::cout.fill();
205 fOutput << "0x" << std::setw(2) << std::setfill('0') << std::hex << (fValue.GetRef<unsigned char>() & 0xff);
206 fOutput << std::resetiosflags(std::ios_base::basefield);
207 std::cout.fill(prev);
208}
209
211{
212 PrintIndent();
213 PrintName(field);
214 fOutput << fValue.GetRef<char>();
215}
216
218{
219 PrintIndent();
220 PrintName(field);
221 fOutput << static_cast<int>(fValue.GetRef<std::int8_t>());
222}
223
225{
226 PrintIndent();
227 PrintName(field);
228 fOutput << fValue.GetRef<std::int16_t>();
229}
230
232{
233 PrintIndent();
234 PrintName(field);
235 fOutput << fValue.GetRef<std::int32_t>();
236}
237
239{
240 PrintIndent();
241 PrintName(field);
242 fOutput << fValue.GetRef<std::int64_t>();
243}
244
246{
247 PrintIndent();
248 PrintName(field);
249 // TODO(jblomer): escape double quotes
250 fOutput << "\"" << fValue.GetRef<std::string>() << "\"";
251}
252
254{
255 PrintIndent();
256 PrintName(field);
257 fOutput << static_cast<int>(fValue.GetRef<std::uint8_t>());
258}
259
261{
262 PrintIndent();
263 PrintName(field);
264 fOutput << fValue.GetRef<std::uint16_t>();
265}
266
268{
269 PrintIndent();
270 PrintName(field);
271 fOutput << fValue.GetRef<std::uint32_t>();
272}
273
275{
276 PrintIndent();
277 PrintName(field);
278 fOutput << fValue.GetRef<std::uint64_t>();
279}
280
282{
283 PrintIndent();
284 PrintName(field);
285 if (field.As32Bit()) {
286 fOutput << fValue.GetRef<std::uint32_t>();
287 return;
288 }
289 if (field.As64Bit()) {
290 fOutput << fValue.GetRef<std::uint64_t>();
291 return;
292 }
293 R__ASSERT(false && "unsupported cardinality size type");
294}
295
297{
298 constexpr auto nBitsULong = sizeof(unsigned long) * 8;
299 const auto *asULongArray = fValue.GetPtr<unsigned long>().get();
300
301 PrintIndent();
302 PrintName(field);
303 fOutput << "\"";
304 std::size_t i = 0;
305 std::string str;
306 for (std::size_t word = 0; word < (field.GetN() + nBitsULong - 1) / nBitsULong; ++word) {
307 for (std::size_t mask = 0; (mask < nBitsULong) && (i < field.GetN()); ++mask, ++i) {
308 bool isSet = (asULongArray[word] & (static_cast<unsigned long>(1) << mask)) != 0;
309 str = std::to_string(isSet) + str;
310 }
311 }
312 fOutput << str << "\"";
313}
314
319
324
326{
327 PrintIndent();
328 PrintName(field);
329 fOutput << "<streamer mode>";
330}
331
336
341
346
348{
349 PrintIndent();
350 PrintName(field);
351 auto elems = field.SplitValue(fValue);
352 if (elems.empty()) {
353 fOutput << "null";
354 } else {
355 RPrintOptions options;
356 options.fPrintSingleLine = true;
357 options.fPrintName = false;
358 RPrintValueVisitor visitor(elems[0], fOutput, fLevel, options);
359 elems[0].GetField().AcceptVisitor(visitor);
360 }
361}
362
364{
365 PrintIndent();
366 PrintName(field);
367 auto intValue = field.SplitValue(fValue)[0];
368 RPrintOptions options;
369 options.fPrintSingleLine = true;
370 options.fPrintName = false;
371 RPrintValueVisitor visitor(intValue, fOutput, fLevel, options);
372 intValue.GetField().AcceptVisitor(visitor);
373}
374
376{
377 PrintIndent();
378 PrintName(field);
379 auto itemValue = field.SplitValue(fValue)[0];
380 RPrintOptions options;
381 options.fPrintSingleLine = true;
382 options.fPrintName = false;
383 RPrintValueVisitor visitor(itemValue, fOutput, fLevel, options);
384 itemValue.GetField().AcceptVisitor(visitor);
385}
386
391
396
398{
399 PrintCollection(field);
400}
401
406
407//---------------------------- RNTupleFormatter --------------------------------
408
409std::string ROOT::Internal::RNTupleFormatter::FitString(const std::string &str, int availableSpace)
410{
411 int strSize{static_cast<int>(str.size())};
412 if (strSize <= availableSpace)
413 return str + std::string(availableSpace - strSize, ' ');
414 else if (availableSpace < 3)
415 return std::string(availableSpace, '.');
416 return std::string(str, 0, availableSpace - 3) + "...";
417}
#define d(i)
Definition RSha256.hxx:102
#define f(i)
Definition RSha256.hxx:104
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
Definition TError.h:125
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 mask
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
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 VisitFieldZero(const ROOT::RFieldZero &field) final
void VisitField(const ROOT::RFieldBase &field) final
Contains settings for printing and prints a summary of an RField instance.
void VisitFieldZero(const ROOT::RFieldZero &fieldZero) final
void VisitField(const ROOT::RFieldBase &field) final
Prints summary of Field.
Renders a JSON value corresponding to the field.
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 VisitStringField(const ROOT::RField< std::string > &field) final
void VisitArrayField(const ROOT::RArrayField &field) final
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
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)
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
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:310
The field for a class with dictionary.
Definition RField.hxx:111
The field for an unscoped or scoped enum with dictionary.
Definition RField.hxx:255
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:54
Classes with dictionaries that can be inspected by TClass.
Definition RField.hxx:283
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.
const_iterator begin() const
const_iterator end() const
The field for an untyped record.
The field for a class using ROOT standard streaming.
Definition RField.hxx:204
Template specializations for C++ std::vector.
const Int_t n
Definition legend1.C:16