16 #ifndef ROOT7_RFieldVisitor
17 #define ROOT7_RFieldVisitor
26 namespace Experimental {
41 class RNTupleVisitor {
43 virtual void VisitField(
const Detail::RFieldBase &field,
int level) = 0;
44 virtual void VisitRootField(
const RFieldRoot &field,
int level) = 0;
56 class RPrepareVisitor:
public Detail::RNTupleVisitor {
61 RPrepareVisitor(
int deepestLevel=0,
int numFields=0): fDeepestLevel{deepestLevel}, fNumFields{numFields} { }
62 void VisitField(
const Detail::RFieldBase &field,
int level)
final;
63 void VisitRootField(
const RFieldRoot &,
int ) final { }
64 int GetDeepestLevel()
const {
return fDeepestLevel;}
65 int GetNumFields()
const {
return fNumFields;}
77 class RPrintVisitor :
public Detail::RNTupleVisitor {
80 std::ostream &fOutput;
86 int fAvailableSpaceKeyString;
87 int fAvailableSpaceValueString;
96 std::vector<bool> fFlagForVerticalLines;
98 std::string MakeKeyString(
const Detail::RFieldBase &field,
int level);
100 std::string MakeValueString(
const Detail::RFieldBase &field);
102 RPrintVisitor(std::ostream &out = std::cout,
char fillSymbol =
'*',
int width = 80,
int deepestLevel = 1,
int numFields = 1)
103 : fOutput{out}, fFrameSymbol{fillSymbol}, fWidth{width}, fDeepestLevel{deepestLevel}, fNumFields{numFields}
104 {SetAvailableSpaceForStrings();}
106 void VisitField(
const Detail::RFieldBase &field,
int level)
final;
107 void VisitRootField(
const RFieldRoot &,
int ) final { };
108 void SetFrameSymbol(
char s) {fFrameSymbol = s;}
109 void SetWidth(
int w) {fWidth = w;}
110 void SetDeepestLevel(
int d);
111 void SetNumFields(
int n);
124 void SetAvailableSpaceForStrings() {
125 fAvailableSpaceKeyString = std::min(4 * fDeepestLevel + 4 + static_cast<int>(std::to_string(fNumFields).size()), fWidth - 15);
126 fAvailableSpaceValueString = fWidth - 6 - fAvailableSpaceKeyString;
140 class RNTupleFormatter {
142 static std::string FitString(
const std::string &str,
int availableSpace);
143 static std::string HierarchialFieldOrder(
const Detail::RFieldBase &field);