Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
RFieldVisitor.cxx
Go to the documentation of this file.
1/// \file RFieldVisitor.cxx
2/// \author Simon Leisibach <simon.leisibach@gmail.com>
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#include <ROOT/RField.hxx>
15#include <ROOT/RNTupleTypes.hxx>
16#include <ROOT/RNTupleUtils.hxx>
17#include <ROOT/RNTupleView.hxx>
18
19#include <cassert>
20#include <cstddef>
21#include <iomanip>
22#include <iostream>
23#include <sstream>
24#include <string>
25#include <vector>
26
27
28//----------------------------- RPrepareVisitor --------------------------------
29
31{
32 auto subfields = field.GetConstSubfields();
33 for (auto f : subfields) {
34 RPrepareVisitor visitor;
35 f->AcceptVisitor(visitor);
36 fNumFields += visitor.fNumFields;
37 fDeepestLevel = std::max(fDeepestLevel, 1 + visitor.fDeepestLevel);
38 }
39}
40
47
48
49//---------------------------- RPrintSchemaVisitor -----------------------------
50
55
61
63{
64 std::string key = fTreePrefix;
65 key += "Field " + fFieldNoPrefix + std::to_string(fFieldNo);
67 fOutput << " : ";
68
69 std::string value = field.GetFieldName();
70 if (!field.GetTypeName().empty())
71 value += " (" + field.GetTypeName() + ")";
72 fOutput << value << '\n';
73
74 auto subfields = field.GetConstSubfields();
75 auto fieldNo = 1;
76 for (auto iField = subfields.begin(); iField != subfields.end();) {
77 RPrintSchemaVisitor visitor(*this);
78 visitor.fFieldNo = fieldNo++;
79 visitor.fFieldNoPrefix += std::to_string(fFieldNo) + ".";
80
81 auto f = *iField;
82 ++iField;
83 // TODO(jblomer): implement tree drawing
84 visitor.fTreePrefix += " ";
85 f->AcceptVisitor(visitor);
86 }
87}
88
90{
91 auto fieldNo = 1;
92 for (auto f : fieldZero.GetConstSubfields()) {
93 RPrintSchemaVisitor visitor(*this);
94 visitor.fFieldNo = fieldNo++;
95 f->AcceptVisitor(visitor);
96 }
97}
98
99
100//--------------------------- RPrintValueVisitor -------------------------------
101
103{
104 if (fPrintOptions.fPrintSingleLine)
105 return;
106
107 for (unsigned int i = 0; i < fLevel; ++i)
108 fOutput << " ";
109}
110
112{
113 if (fPrintOptions.fPrintName)
114 fOutput << "\"" << field.GetFieldName() << "\": ";
115}
116
118{
119 PrintIndent();
120 PrintName(field);
121 fOutput << "[";
122 auto elems = field.SplitValue(fValue);
123 for (auto iValue = elems.begin(); iValue != elems.end(); ) {
124 RPrintOptions options;
125 options.fPrintSingleLine = true;
126 options.fPrintName = false;
127 RPrintValueVisitor elemVisitor(*iValue, fOutput, 0 /* level */, options);
128 iValue->GetField().AcceptVisitor(elemVisitor);
129
130 if (++iValue == elems.end())
131 break;
132 else
133 fOutput << ", ";
134 }
135 fOutput << "]";
136}
137
139{
140 PrintIndent();
141 PrintName(field);
142 fOutput << "{";
143 auto elems = field.SplitValue(fValue);
144 for (auto iValue = elems.begin(); iValue != elems.end();) {
145 if (!fPrintOptions.fPrintSingleLine)
146 fOutput << std::endl;
147
148 RPrintOptions options;
149 options.fPrintSingleLine = fPrintOptions.fPrintSingleLine;
150 RPrintValueVisitor visitor(*iValue, fOutput, fLevel + 1, options);
151 iValue->GetField().AcceptVisitor(visitor);
152
153 if (++iValue == elems.end()) {
154 if (!fPrintOptions.fPrintSingleLine)
155 fOutput << std::endl;
156 break;
157 } else {
158 fOutput << ",";
159 if (fPrintOptions.fPrintSingleLine)
160 fOutput << " ";
161 }
162 }
163 PrintIndent();
164 fOutput << "}";
165}
166
168{
169 PrintIndent();
170 PrintName(field);
171 fOutput << "\"<unsupported type: " << field.GetTypeName() << ">\"";
172}
173
175{
176 PrintIndent();
177 PrintName(field);
178 if (fValue.GetRef<bool>())
179 fOutput << "true";
180 else
181 fOutput << "false";
182}
183
185{
186 PrintIndent();
187 PrintName(field);
188 fOutput << fValue.GetRef<double>();
189}
190
192{
193 PrintIndent();
194 PrintName(field);
195 fOutput << fValue.GetRef<float>();
196}
197
199{
200 PrintIndent();
201 PrintName(field);
202 char prev = std::cout.fill();
203 auto value = std::to_integer<unsigned int>(fValue.GetRef<std::byte>());
204 fOutput << "0x" << std::setw(2) << std::setfill('0') << std::hex << value;
205 fOutput << std::resetiosflags(std::ios_base::basefield);
206 std::cout.fill(prev);
207}
208
210{
211 PrintIndent();
212 PrintName(field);
213 fOutput << fValue.GetRef<char>();
214}
215
217{
218 PrintIndent();
219 PrintName(field);
220 fOutput << static_cast<int>(fValue.GetRef<std::int8_t>());
221}
222
224{
225 PrintIndent();
226 PrintName(field);
227 fOutput << fValue.GetRef<std::int16_t>();
228}
229
231{
232 PrintIndent();
233 PrintName(field);
234 fOutput << fValue.GetRef<std::int32_t>();
235}
236
238{
239 PrintIndent();
240 PrintName(field);
241 fOutput << fValue.GetRef<std::int64_t>();
242}
243
245{
246 PrintIndent();
247 PrintName(field);
248 // TODO(jblomer): escape double quotes
249 fOutput << "\"" << fValue.GetRef<std::string>() << "\"";
250}
251
253{
254 PrintIndent();
255 PrintName(field);
256 fOutput << static_cast<int>(fValue.GetRef<std::uint8_t>());
257}
258
260{
261 PrintIndent();
262 PrintName(field);
263 fOutput << fValue.GetRef<std::uint16_t>();
264}
265
267{
268 PrintIndent();
269 PrintName(field);
270 fOutput << fValue.GetRef<std::uint32_t>();
271}
272
274{
275 PrintIndent();
276 PrintName(field);
277 fOutput << fValue.GetRef<std::uint64_t>();
278}
279
281{
282 PrintIndent();
283 PrintName(field);
284 if (field.As32Bit()) {
285 fOutput << fValue.GetRef<std::uint32_t>();
286 return;
287 }
288 if (field.As64Bit()) {
289 fOutput << fValue.GetRef<std::uint64_t>();
290 return;
291 }
292 R__ASSERT(false && "unsupported cardinality size type");
293}
294
296{
297 constexpr auto nBitsULong = sizeof(unsigned long) * 8;
298 const auto *asULongArray = static_cast<unsigned long *>(fValue.GetPtr<void>().get());
299
300 PrintIndent();
301 PrintName(field);
302 fOutput << "\"";
303 std::size_t i = 0;
304 std::string str;
305 for (std::size_t word = 0; word < (field.GetN() + nBitsULong - 1) / nBitsULong; ++word) {
306 for (std::size_t mask = 0; (mask < nBitsULong) && (i < field.GetN()); ++mask, ++i) {
307 bool isSet = (asULongArray[word] & (static_cast<unsigned long>(1) << mask)) != 0;
308 str = std::to_string(isSet) + str;
309 }
310 }
311 fOutput << str << "\"";
312}
313
318
323
328
330{
331 PrintIndent();
332 PrintName(field);
333 fOutput << "<streamer mode>";
334}
335
340
345
350
352{
353 PrintIndent();
354 PrintName(field);
355 auto elems = field.SplitValue(fValue);
356 if (elems.empty()) {
357 fOutput << "null";
358 } else {
359 RPrintOptions options;
360 options.fPrintSingleLine = true;
361 options.fPrintName = false;
362 RPrintValueVisitor visitor(elems[0], fOutput, fLevel, options);
363 elems[0].GetField().AcceptVisitor(visitor);
364 }
365}
366
368{
369 PrintIndent();
370 PrintName(field);
371 auto intValue = field.SplitValue(fValue)[0];
372 RPrintOptions options;
373 options.fPrintSingleLine = true;
374 options.fPrintName = false;
375 RPrintValueVisitor visitor(intValue, fOutput, fLevel, options);
376 intValue.GetField().AcceptVisitor(visitor);
377}
378
380{
381 PrintIndent();
382 PrintName(field);
383 auto itemValue = field.SplitValue(fValue)[0];
384 RPrintOptions options;
385 options.fPrintSingleLine = true;
386 options.fPrintName = false;
387 RPrintValueVisitor visitor(itemValue, fOutput, fLevel, options);
388 itemValue.GetField().AcceptVisitor(visitor);
389}
390
395
400
402{
403 PrintCollection(field);
404}
405
410
411//---------------------------- RNTupleFormatter --------------------------------
412
413std::string ROOT::Internal::RNTupleFormatter::FitString(const std::string &str, int availableSpace)
414{
415 int strSize{static_cast<int>(str.size())};
416 if (strSize <= availableSpace)
417 return str + std::string(availableSpace - strSize, ' ');
418 else if (availableSpace < 3)
419 return std::string(availableSpace, '.');
420 return std::string(str, 0, availableSpace - 3) + "...";
421}
#define d(i)
Definition RSha256.hxx:102
#define f(i)
Definition RSha256.hxx:104
#define R__ASSERT(e)
Checks condition e and reports a fatal error if it's false.
Definition TError.h:125
static std::string FitString(const std::string &str, int availableSpace)
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.
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
Definition RField.cxx:1236
Template specializations for C++ std::bitset.
std::size_t GetN() const
Get the number of bits in the bitset, i.e. the N in std::bitset<N>.
An artificial field that transforms an RNTuple column that contains the offset of collections into co...
Definition RField.hxx:347
const RField< RNTupleCardinality< std::uint32_t > > * As32Bit() const
Definition RField.cxx:122
const RField< RNTupleCardinality< std::uint64_t > > * As64Bit() const
Definition RField.cxx:127
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
std::vector< RValue > SplitValue(const RValue &value) const final
Creates the list of direct child values given an existing value for this field.
A field translates read and write calls from/to underlying columns to/from tree values.
std::vector< const RFieldBase * > GetConstSubfields() const
virtual std::vector< RValue > SplitValue(const RValue &value) const
Creates the list of direct child values given an existing value for this field.
const std::string & GetFieldName() const
const std::string & GetTypeName() const
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