File indexing completed on 2025-01-18 10:10:43
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #ifndef ROOT7_RFieldVisitor
0017 #define ROOT7_RFieldVisitor
0018
0019 #include <ROOT/RField.hxx>
0020 #include <ROOT/RNTupleUtil.hxx>
0021
0022 #include <algorithm>
0023 #include <iostream>
0024 #include <sstream>
0025 #include <string>
0026 #include <vector>
0027
0028 namespace ROOT {
0029 namespace Experimental {
0030 namespace Detail {
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043 class RFieldVisitor {
0044 public:
0045 virtual void VisitField(const RFieldBase &field) = 0;
0046 virtual void VisitFieldZero(const RFieldZero &field) { VisitField(field); }
0047 virtual void VisitArrayField(const RArrayField &field) { VisitField(field); }
0048 virtual void VisitArrayAsRVecField(const RArrayAsRVecField &field) { VisitField(field); }
0049 virtual void VisitAtomicField(const RAtomicField &field) { VisitField(field); }
0050 virtual void VisitBitsetField(const RBitsetField &field) { VisitField(field); }
0051 virtual void VisitBoolField(const RField<bool> &field) { VisitField(field); }
0052 virtual void VisitClassField(const RClassField &field) { VisitField(field); }
0053 virtual void VisitProxiedCollectionField(const RProxiedCollectionField &field) { VisitField(field); }
0054 virtual void VisitRecordField(const RRecordField &field) { VisitField(field); }
0055 virtual void VisitClusterSizeField(const RField<ClusterSize_t> &field) { VisitField(field); }
0056 virtual void VisitCardinalityField(const RCardinalityField &field) { VisitField(field); }
0057 virtual void VisitDoubleField(const RField<double> &field) { VisitField(field); }
0058 virtual void VisitEnumField(const REnumField &field) { VisitField(field); }
0059 virtual void VisitFloatField(const RField<float> &field) { VisitField(field); }
0060 virtual void VisitByteField(const RField<std::byte> &field) { VisitField(field); }
0061 virtual void VisitCharField(const RField<char> &field) { VisitField(field); }
0062 virtual void VisitInt8Field(const RField<std::int8_t> &field) { VisitField(field); }
0063 virtual void VisitInt16Field(const RField<std::int16_t> &field) { VisitField(field); }
0064 virtual void VisitIntField(const RField<int> &field) { VisitField(field); }
0065 virtual void VisitInt64Field(const RField<std::int64_t> &field) { VisitField(field); }
0066 virtual void VisitNullableField(const RNullableField &field) { VisitField(field); }
0067 virtual void VisitStringField(const RField<std::string> &field) { VisitField(field); }
0068 virtual void VisitUInt16Field(const RField<std::uint16_t> &field) { VisitField(field); }
0069 virtual void VisitUInt32Field(const RField<std::uint32_t> &field) { VisitField(field); }
0070 virtual void VisitUInt64Field(const RField<std::uint64_t> &field) { VisitField(field); }
0071 virtual void VisitUInt8Field(const RField<std::uint8_t> &field) { VisitField(field); }
0072 virtual void VisitVectorField(const RVectorField &field) { VisitField(field); }
0073 virtual void VisitVectorBoolField(const RField<std::vector<bool>> &field) { VisitField(field); }
0074 virtual void VisitRVecField(const RRVecField &field) { VisitField(field); }
0075 };
0076
0077 }
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089 class RPrepareVisitor : public Detail::RFieldVisitor {
0090 private:
0091 unsigned int fDeepestLevel = 1;
0092 unsigned int fNumFields = 1;
0093
0094 public:
0095 RPrepareVisitor() = default;
0096 void VisitField(const RFieldBase &field) final;
0097 void VisitFieldZero(const RFieldZero &field) final;
0098
0099 unsigned int GetDeepestLevel() const { return fDeepestLevel; }
0100 unsigned int GetNumFields() const { return fNumFields; }
0101 };
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113 class RPrintSchemaVisitor : public Detail::RFieldVisitor {
0114 private:
0115
0116 std::ostream &fOutput;
0117
0118 char fFrameSymbol;
0119
0120 int fWidth;
0121 int fDeepestLevel;
0122 int fNumFields;
0123 int fAvailableSpaceKeyString;
0124 int fAvailableSpaceValueString;
0125 int fFieldNo = 1;
0126 std::string fTreePrefix;
0127 std::string fFieldNoPrefix;
0128
0129 public:
0130 RPrintSchemaVisitor(std::ostream &out = std::cout, char frameSymbol = '*', int width = 80, int deepestLevel = 1,
0131 int numFields = 1)
0132 : fOutput{out}, fFrameSymbol{frameSymbol}, fWidth{width}, fDeepestLevel{deepestLevel}, fNumFields{numFields}
0133 {
0134 SetAvailableSpaceForStrings();
0135 }
0136
0137 void VisitField(const RFieldBase &field) final;
0138 void VisitFieldZero(const RFieldZero &fieldZero) final;
0139 void SetFrameSymbol(char s) { fFrameSymbol = s; }
0140 void SetWidth(int w) { fWidth = w; }
0141 void SetDeepestLevel(int d);
0142 void SetNumFields(int n);
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157 void SetAvailableSpaceForStrings()
0158 {
0159 fAvailableSpaceKeyString =
0160 std::min(4 * fDeepestLevel + 4 + static_cast<int>(std::to_string(fNumFields).size()), fWidth - 15);
0161 fAvailableSpaceValueString = fWidth - 6 - fAvailableSpaceKeyString;
0162 }
0163 };
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173 class RPrintValueVisitor : public Detail::RFieldVisitor {
0174 public:
0175 struct RPrintOptions {
0176 bool fPrintSingleLine;
0177 bool fPrintName;
0178
0179 RPrintOptions() : fPrintSingleLine(false), fPrintName(true) {}
0180 };
0181
0182 private:
0183 RFieldBase::RValue fValue;
0184
0185 std::ostream &fOutput;
0186 unsigned int fLevel;
0187 RPrintOptions fPrintOptions;
0188
0189 void PrintIndent();
0190 void PrintName(const RFieldBase &field);
0191 void PrintCollection(const RFieldBase &field);
0192
0193 public:
0194 RPrintValueVisitor(RFieldBase::RValue value, std::ostream &output, unsigned int level = 0,
0195 RPrintOptions options = RPrintOptions())
0196 : fValue(value), fOutput{output}, fLevel(level), fPrintOptions(options)
0197 {
0198 }
0199
0200 void VisitField(const RFieldBase &field) final;
0201
0202 void VisitBoolField(const RField<bool> &field) final;
0203 void VisitDoubleField(const RField<double> &field) final;
0204 void VisitFloatField(const RField<float> &field) final;
0205 void VisitByteField(const RField<std::byte> &field) final;
0206 void VisitCharField(const RField<char> &field) final;
0207 void VisitInt8Field(const RField<std::int8_t> &field) final;
0208 void VisitInt16Field(const RField<std::int16_t> &field) final;
0209 void VisitIntField(const RField<int> &field) final;
0210 void VisitInt64Field(const RField<std::int64_t> &field) final;
0211 void VisitStringField(const RField<std::string> &field) final;
0212 void VisitUInt8Field(const RField<std::uint8_t> &field) final;
0213 void VisitUInt16Field(const RField<std::uint16_t> &field) final;
0214 void VisitUInt32Field(const RField<std::uint32_t> &field) final;
0215 void VisitUInt64Field(const RField<std::uint64_t> &field) final;
0216
0217 void VisitCardinalityField(const RCardinalityField &field) final;
0218 void VisitArrayField(const RArrayField &field) final;
0219 void VisitArrayAsRVecField(const RArrayAsRVecField &field) final;
0220 void VisitClassField(const RClassField &field) final;
0221 void VisitRecordField(const RRecordField &field) final;
0222 void VisitProxiedCollectionField(const RProxiedCollectionField &field) final;
0223 void VisitVectorField(const RVectorField &field) final;
0224 void VisitVectorBoolField(const RField<std::vector<bool>> &field) final;
0225 void VisitRVecField(const RRVecField &field) final;
0226 void VisitBitsetField(const RBitsetField &field) final;
0227 void VisitNullableField(const RNullableField &field) final;
0228 void VisitEnumField(const REnumField &field) final;
0229 void VisitAtomicField(const RAtomicField &field) final;
0230 };
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241
0242 class RNTupleFormatter {
0243 public:
0244
0245 static std::string FitString(const std::string &str, int availableSpace);
0246 };
0247
0248 }
0249 }
0250
0251 #endif