File indexing completed on 2021-02-14 13:28:51
0001 #ifndef FWCore_ParameterSet_ParameterDescriptionNode_h
0002 #define FWCore_ParameterSet_ParameterDescriptionNode_h
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include "FWCore/Utilities/interface/value_ptr.h"
0012
0013 #include <string>
0014 #include <set>
0015 #include <iosfwd>
0016 #include <memory>
0017
0018 namespace edm {
0019
0020 class ParameterSet;
0021 template <typename T>
0022 class ParameterDescriptionCases;
0023 class DocFormatHelper;
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 enum ParameterTypes {
0034 k_int32 = 'I',
0035 k_vint32 = 'i',
0036 k_uint32 = 'U',
0037 k_vuint32 = 'u',
0038 k_int64 = 'L',
0039 k_vint64 = 'l',
0040 k_uint64 = 'X',
0041 k_vuint64 = 'x',
0042 k_double = 'D',
0043 k_vdouble = 'd',
0044 k_bool = 'B',
0045 k_string = 'S',
0046 k_vstring = 's',
0047 k_EventID = 'E',
0048 k_VEventID = 'e',
0049 k_LuminosityBlockID = 'M',
0050 k_VLuminosityBlockID = 'm',
0051 k_InputTag = 't',
0052 k_VInputTag = 'v',
0053 k_ESInputTag = 'g',
0054 k_VESInputTag = 'G',
0055 k_FileInPath = 'F',
0056 k_LuminosityBlockRange = 'A',
0057 k_VLuminosityBlockRange = 'a',
0058 k_EventRange = 'R',
0059 k_VEventRange = 'r',
0060 k_PSet = 'Q',
0061 k_VPSet = 'q'
0062 };
0063
0064 std::string parameterTypeEnumToString(ParameterTypes iType);
0065
0066 struct ParameterTypeToEnum {
0067 template <class T>
0068 static ParameterTypes toEnum();
0069 };
0070
0071 class Comment {
0072 public:
0073 Comment();
0074 explicit Comment(std::string const& iComment);
0075 explicit Comment(char const* iComment);
0076 std::string const& comment() const { return comment_; }
0077
0078 private:
0079 std::string comment_;
0080 };
0081
0082 class ParameterDescriptionNode {
0083 public:
0084 ParameterDescriptionNode() {}
0085
0086 explicit ParameterDescriptionNode(Comment const& iComment) : comment_(iComment.comment()) {}
0087
0088 virtual ~ParameterDescriptionNode();
0089
0090 virtual ParameterDescriptionNode* clone() const = 0;
0091
0092 std::string const& comment() const { return comment_; }
0093 void setComment(std::string const& value);
0094 void setComment(char const* value);
0095
0096
0097
0098
0099
0100
0101
0102 void validate(ParameterSet& pset, std::set<std::string>& validatedLabels, bool optional) const {
0103 validate_(pset, validatedLabels, optional);
0104 }
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116 void writeCfi(std::ostream& os, bool optional, bool& startWithComma, int indentation, bool& wroteSomething) const {
0117 writeCfi_(os, optional, startWithComma, indentation, wroteSomething);
0118 }
0119
0120
0121 void print(std::ostream& os, bool optional, bool writeToCfi, DocFormatHelper& dfh) const;
0122
0123 bool hasNestedContent() const { return hasNestedContent_(); }
0124
0125 void printNestedContent(std::ostream& os, bool optional, DocFormatHelper& dfh) const;
0126
0127
0128
0129
0130
0131
0132
0133
0134 bool exists(ParameterSet const& pset) const { return exists_(pset); }
0135
0136
0137
0138
0139
0140 bool partiallyExists(ParameterSet const& pset) const { return partiallyExists_(pset); }
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153 int howManyXORSubNodesExist(ParameterSet const& pset) const { return howManyXORSubNodesExist_(pset); }
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207 void checkAndGetLabelsAndTypes(std::set<std::string>& usedLabels,
0208 std::set<ParameterTypes>& parameterTypes,
0209 std::set<ParameterTypes>& wildcardTypes) const {
0210 checkAndGetLabelsAndTypes_(usedLabels, parameterTypes, wildcardTypes);
0211 }
0212
0213 static void printSpaces(std::ostream& os, int n);
0214
0215 protected:
0216 virtual void checkAndGetLabelsAndTypes_(std::set<std::string>& usedLabels,
0217 std::set<ParameterTypes>& parameterTypes,
0218 std::set<ParameterTypes>& wildcardTypes) const = 0;
0219
0220 virtual void validate_(ParameterSet& pset, std::set<std::string>& validatedLabels, bool optional) const = 0;
0221
0222 virtual void writeCfi_(
0223 std::ostream& os, bool optional, bool& startWithComma, int indentation, bool& wroteSomething) const = 0;
0224
0225 virtual void print_(std::ostream&, bool , bool , DocFormatHelper&) const {}
0226
0227 virtual bool hasNestedContent_() const { return false; }
0228
0229 virtual void printNestedContent_(std::ostream&, bool , DocFormatHelper&) const {}
0230
0231 virtual bool exists_(ParameterSet const& pset) const = 0;
0232
0233 virtual bool partiallyExists_(ParameterSet const& pset) const = 0;
0234
0235 virtual int howManyXORSubNodesExist_(ParameterSet const& pset) const = 0;
0236
0237 std::string comment_;
0238 };
0239
0240 template <>
0241 struct value_ptr_traits<ParameterDescriptionNode> {
0242 static ParameterDescriptionNode* clone(ParameterDescriptionNode const* p) { return p->clone(); }
0243 static void destroy(ParameterDescriptionNode* p) { delete p; }
0244 };
0245
0246
0247
0248 std::unique_ptr<ParameterDescriptionCases<bool> > operator>>(bool caseValue, ParameterDescriptionNode const& node);
0249
0250 std::unique_ptr<ParameterDescriptionCases<int> > operator>>(int caseValue, ParameterDescriptionNode const& node);
0251
0252 std::unique_ptr<ParameterDescriptionCases<std::string> > operator>>(std::string const& caseValue,
0253 ParameterDescriptionNode const& node);
0254
0255 std::unique_ptr<ParameterDescriptionCases<std::string> > operator>>(char const* caseValue,
0256 ParameterDescriptionNode const& node);
0257
0258 std::unique_ptr<ParameterDescriptionCases<bool> > operator>>(bool caseValue,
0259 std::unique_ptr<ParameterDescriptionNode> node);
0260
0261 std::unique_ptr<ParameterDescriptionCases<int> > operator>>(int caseValue,
0262 std::unique_ptr<ParameterDescriptionNode> node);
0263
0264 std::unique_ptr<ParameterDescriptionCases<std::string> > operator>>(std::string const& caseValue,
0265 std::unique_ptr<ParameterDescriptionNode> node);
0266
0267 std::unique_ptr<ParameterDescriptionCases<std::string> > operator>>(char const* caseValue,
0268 std::unique_ptr<ParameterDescriptionNode> node);
0269
0270
0271
0272 std::unique_ptr<ParameterDescriptionNode> operator&&(ParameterDescriptionNode const& node_left,
0273 ParameterDescriptionNode const& node_right);
0274
0275 std::unique_ptr<ParameterDescriptionNode> operator&&(std::unique_ptr<ParameterDescriptionNode> node_left,
0276 ParameterDescriptionNode const& node_right);
0277
0278 std::unique_ptr<ParameterDescriptionNode> operator&&(ParameterDescriptionNode const& node_left,
0279 std::unique_ptr<ParameterDescriptionNode> node_right);
0280
0281 std::unique_ptr<ParameterDescriptionNode> operator&&(std::unique_ptr<ParameterDescriptionNode> node_left,
0282 std::unique_ptr<ParameterDescriptionNode> node_right);
0283
0284
0285
0286 std::unique_ptr<ParameterDescriptionNode> operator||(ParameterDescriptionNode const& node_left,
0287 ParameterDescriptionNode const& node_right);
0288
0289 std::unique_ptr<ParameterDescriptionNode> operator||(std::unique_ptr<ParameterDescriptionNode> node_left,
0290 ParameterDescriptionNode const& node_right);
0291
0292 std::unique_ptr<ParameterDescriptionNode> operator||(ParameterDescriptionNode const& node_left,
0293 std::unique_ptr<ParameterDescriptionNode> node_right);
0294
0295 std::unique_ptr<ParameterDescriptionNode> operator||(std::unique_ptr<ParameterDescriptionNode> node_left,
0296 std::unique_ptr<ParameterDescriptionNode> node_right);
0297
0298
0299
0300 std::unique_ptr<ParameterDescriptionNode> operator^(ParameterDescriptionNode const& node_left,
0301 ParameterDescriptionNode const& node_right);
0302
0303 std::unique_ptr<ParameterDescriptionNode> operator^(std::unique_ptr<ParameterDescriptionNode> node_left,
0304 ParameterDescriptionNode const& node_right);
0305
0306 std::unique_ptr<ParameterDescriptionNode> operator^(ParameterDescriptionNode const& node_left,
0307 std::unique_ptr<ParameterDescriptionNode> node_right);
0308
0309 std::unique_ptr<ParameterDescriptionNode> operator^(std::unique_ptr<ParameterDescriptionNode> node_left,
0310 std::unique_ptr<ParameterDescriptionNode> node_right);
0311 }
0312 #endif