00001 #ifndef FWCore_ParameterSet_ParameterDescriptionNode_h
00002 #define FWCore_ParameterSet_ParameterDescriptionNode_h
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "FWCore/Utilities/interface/value_ptr.h"
00012
00013 #include <string>
00014 #include <set>
00015 #include <iosfwd>
00016 #include <memory>
00017
00018 namespace edm {
00019
00020 class ParameterSet;
00021 template <typename T> class ParameterDescriptionCases;
00022 class DocFormatHelper;
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 enum ParameterTypes {
00033 k_int32 = 'I',
00034 k_vint32 = 'i',
00035 k_uint32 = 'U',
00036 k_vuint32 = 'u',
00037 k_int64 = 'L',
00038 k_vint64 = 'l',
00039 k_uint64 = 'X',
00040 k_vuint64 = 'x',
00041 k_double = 'D',
00042 k_vdouble = 'd',
00043 k_bool = 'B',
00044 k_string = 'S',
00045 k_vstring = 's',
00046 k_EventID = 'E',
00047 k_VEventID = 'e',
00048 k_LuminosityBlockID = 'M',
00049 k_VLuminosityBlockID = 'm',
00050 k_InputTag = 't',
00051 k_VInputTag = 'v',
00052 k_FileInPath = 'F',
00053 k_LuminosityBlockRange = 'A',
00054 k_VLuminosityBlockRange = 'a',
00055 k_EventRange = 'R',
00056 k_VEventRange = 'r',
00057 k_PSet = 'Q',
00058 k_VPSet = 'q'
00059 };
00060
00061 std::string parameterTypeEnumToString(ParameterTypes iType);
00062
00063 struct ParameterTypeToEnum {
00064 template <class T>
00065 static ParameterTypes toEnum();
00066 };
00067
00068
00069 class ParameterDescriptionNode {
00070
00071 public:
00072
00073 virtual ~ParameterDescriptionNode();
00074
00075 virtual ParameterDescriptionNode* clone() const = 0;
00076
00077 std::string const& comment() const { return comment_; }
00078 void setComment(std::string const & value);
00079 void setComment(char const* value);
00080
00081
00082
00083
00084
00085
00086
00087 void validate(ParameterSet & pset,
00088 std::set<std::string> & validatedLabels,
00089 bool optional) const {
00090 validate_(pset, validatedLabels, optional);
00091 }
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 void writeCfi(std::ostream & os,
00104 bool & startWithComma,
00105 int indentation,
00106 bool & wroteSomething) const {
00107 writeCfi_(os, startWithComma, indentation, wroteSomething);
00108 }
00109
00110
00111 void print(std::ostream & os,
00112 bool optional,
00113 bool writeToCfi,
00114 DocFormatHelper & dfh);
00115
00116 bool hasNestedContent() {
00117 return hasNestedContent_();
00118 }
00119
00120 void printNestedContent(std::ostream & os,
00121 bool optional,
00122 DocFormatHelper & dfh);
00123
00124
00125
00126
00127
00128
00129
00130
00131 bool exists(ParameterSet const& pset) const {
00132 return exists_(pset);
00133 }
00134
00135
00136
00137
00138
00139 bool partiallyExists(ParameterSet const& pset) const {
00140 return partiallyExists_(pset);
00141 }
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154 int howManyXORSubNodesExist(ParameterSet const& pset) const {
00155 return howManyXORSubNodesExist_(pset);
00156 }
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210 void checkAndGetLabelsAndTypes(std::set<std::string> & usedLabels,
00211 std::set<ParameterTypes> & parameterTypes,
00212 std::set<ParameterTypes> & wildcardTypes) const {
00213 checkAndGetLabelsAndTypes_(usedLabels, parameterTypes, wildcardTypes);
00214 }
00215
00216 static void printSpaces(std::ostream & os, int n);
00217
00218 protected:
00219
00220 virtual void checkAndGetLabelsAndTypes_(std::set<std::string> & usedLabels,
00221 std::set<ParameterTypes> & parameterTypes,
00222 std::set<ParameterTypes> & wildcardTypes) const = 0;
00223
00224 virtual void validate_(ParameterSet & pset,
00225 std::set<std::string> & validatedLabels,
00226 bool optional) const = 0;
00227
00228 virtual void writeCfi_(std::ostream & os,
00229 bool & startWithComma,
00230 int indentation,
00231 bool & wroteSomething) const = 0;
00232
00233 virtual void print_(std::ostream & os,
00234 bool optional,
00235 bool writeToCfi,
00236 DocFormatHelper & dfh) { }
00237
00238 virtual bool hasNestedContent_() {
00239 return false;
00240 }
00241
00242 virtual void printNestedContent_(std::ostream & os,
00243 bool optional,
00244 DocFormatHelper & dfh) { }
00245
00246 virtual bool exists_(ParameterSet const& pset) const = 0;
00247
00248 virtual bool partiallyExists_(ParameterSet const& pset) const = 0;
00249
00250 virtual int howManyXORSubNodesExist_(ParameterSet const& pset) const = 0;
00251
00252 std::string comment_;
00253 };
00254
00255 template <>
00256 struct value_ptr_traits<ParameterDescriptionNode>
00257 {
00258 static ParameterDescriptionNode * clone( ParameterDescriptionNode const * p ) { return p->clone(); }
00259 };
00260
00261
00262
00263 std::auto_ptr<ParameterDescriptionCases<bool> >
00264 operator>>(bool caseValue,
00265 ParameterDescriptionNode const& node);
00266
00267 std::auto_ptr<ParameterDescriptionCases<int> >
00268 operator>>(int caseValue,
00269 ParameterDescriptionNode const& node);
00270
00271 std::auto_ptr<ParameterDescriptionCases<std::string> >
00272 operator>>(std::string const& caseValue,
00273 ParameterDescriptionNode const& node);
00274
00275 std::auto_ptr<ParameterDescriptionCases<std::string> >
00276 operator>>(char const* caseValue,
00277 ParameterDescriptionNode const& node);
00278
00279 std::auto_ptr<ParameterDescriptionCases<bool> >
00280 operator>>(bool caseValue,
00281 std::auto_ptr<ParameterDescriptionNode> node);
00282
00283 std::auto_ptr<ParameterDescriptionCases<int> >
00284 operator>>(int caseValue,
00285 std::auto_ptr<ParameterDescriptionNode> node);
00286
00287 std::auto_ptr<ParameterDescriptionCases<std::string> >
00288 operator>>(std::string const& caseValue,
00289 std::auto_ptr<ParameterDescriptionNode> node);
00290
00291 std::auto_ptr<ParameterDescriptionCases<std::string> >
00292 operator>>(char const* caseValue,
00293 std::auto_ptr<ParameterDescriptionNode> node);
00294
00295
00296
00297 std::auto_ptr<ParameterDescriptionNode>
00298 operator&&(ParameterDescriptionNode const& node_left,
00299 ParameterDescriptionNode const& node_right);
00300
00301 std::auto_ptr<ParameterDescriptionNode>
00302 operator&&(std::auto_ptr<ParameterDescriptionNode> node_left,
00303 ParameterDescriptionNode const& node_right);
00304
00305 std::auto_ptr<ParameterDescriptionNode>
00306 operator&&(ParameterDescriptionNode const& node_left,
00307 std::auto_ptr<ParameterDescriptionNode> node_right);
00308
00309 std::auto_ptr<ParameterDescriptionNode>
00310 operator&&(std::auto_ptr<ParameterDescriptionNode> node_left,
00311 std::auto_ptr<ParameterDescriptionNode> node_right);
00312
00313
00314
00315 std::auto_ptr<ParameterDescriptionNode>
00316 operator||(ParameterDescriptionNode const& node_left,
00317 ParameterDescriptionNode const& node_right);
00318
00319 std::auto_ptr<ParameterDescriptionNode>
00320 operator||(std::auto_ptr<ParameterDescriptionNode> node_left,
00321 ParameterDescriptionNode const& node_right);
00322
00323 std::auto_ptr<ParameterDescriptionNode>
00324 operator||(ParameterDescriptionNode const& node_left,
00325 std::auto_ptr<ParameterDescriptionNode> node_right);
00326
00327 std::auto_ptr<ParameterDescriptionNode>
00328 operator||(std::auto_ptr<ParameterDescriptionNode> node_left,
00329 std::auto_ptr<ParameterDescriptionNode> node_right);
00330
00331
00332
00333 std::auto_ptr<ParameterDescriptionNode>
00334 operator^(ParameterDescriptionNode const& node_left,
00335 ParameterDescriptionNode const& node_right);
00336
00337 std::auto_ptr<ParameterDescriptionNode>
00338 operator^(std::auto_ptr<ParameterDescriptionNode> node_left,
00339 ParameterDescriptionNode const& node_right);
00340
00341 std::auto_ptr<ParameterDescriptionNode>
00342 operator^(ParameterDescriptionNode const& node_left,
00343 std::auto_ptr<ParameterDescriptionNode> node_right);
00344
00345 std::auto_ptr<ParameterDescriptionNode>
00346 operator^(std::auto_ptr<ParameterDescriptionNode> node_left,
00347 std::auto_ptr<ParameterDescriptionNode> node_right);
00348 }
00349 #endif