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&,
00234 bool ,
00235 bool ,
00236 DocFormatHelper&) { }
00237
00238 virtual bool hasNestedContent_() {
00239 return false;
00240 }
00241
00242 virtual void printNestedContent_(std::ostream&,
00243 bool ,
00244 DocFormatHelper&) { }
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 static ParameterDescriptionNode* clone(ParameterDescriptionNode const* p) { return p->clone(); }
00258 };
00259
00260
00261
00262 std::auto_ptr<ParameterDescriptionCases<bool> >
00263 operator>>(bool caseValue,
00264 ParameterDescriptionNode const& node);
00265
00266 std::auto_ptr<ParameterDescriptionCases<int> >
00267 operator>>(int caseValue,
00268 ParameterDescriptionNode const& node);
00269
00270 std::auto_ptr<ParameterDescriptionCases<std::string> >
00271 operator>>(std::string const& caseValue,
00272 ParameterDescriptionNode const& node);
00273
00274 std::auto_ptr<ParameterDescriptionCases<std::string> >
00275 operator>>(char const* caseValue,
00276 ParameterDescriptionNode const& node);
00277
00278 std::auto_ptr<ParameterDescriptionCases<bool> >
00279 operator>>(bool caseValue,
00280 std::auto_ptr<ParameterDescriptionNode> node);
00281
00282 std::auto_ptr<ParameterDescriptionCases<int> >
00283 operator>>(int caseValue,
00284 std::auto_ptr<ParameterDescriptionNode> node);
00285
00286 std::auto_ptr<ParameterDescriptionCases<std::string> >
00287 operator>>(std::string const& caseValue,
00288 std::auto_ptr<ParameterDescriptionNode> node);
00289
00290 std::auto_ptr<ParameterDescriptionCases<std::string> >
00291 operator>>(char const* caseValue,
00292 std::auto_ptr<ParameterDescriptionNode> node);
00293
00294
00295
00296 std::auto_ptr<ParameterDescriptionNode>
00297 operator&&(ParameterDescriptionNode const& node_left,
00298 ParameterDescriptionNode const& node_right);
00299
00300 std::auto_ptr<ParameterDescriptionNode>
00301 operator&&(std::auto_ptr<ParameterDescriptionNode> node_left,
00302 ParameterDescriptionNode const& node_right);
00303
00304 std::auto_ptr<ParameterDescriptionNode>
00305 operator&&(ParameterDescriptionNode const& node_left,
00306 std::auto_ptr<ParameterDescriptionNode> node_right);
00307
00308 std::auto_ptr<ParameterDescriptionNode>
00309 operator&&(std::auto_ptr<ParameterDescriptionNode> node_left,
00310 std::auto_ptr<ParameterDescriptionNode> node_right);
00311
00312
00313
00314 std::auto_ptr<ParameterDescriptionNode>
00315 operator||(ParameterDescriptionNode const& node_left,
00316 ParameterDescriptionNode const& node_right);
00317
00318 std::auto_ptr<ParameterDescriptionNode>
00319 operator||(std::auto_ptr<ParameterDescriptionNode> node_left,
00320 ParameterDescriptionNode const& node_right);
00321
00322 std::auto_ptr<ParameterDescriptionNode>
00323 operator||(ParameterDescriptionNode const& node_left,
00324 std::auto_ptr<ParameterDescriptionNode> node_right);
00325
00326 std::auto_ptr<ParameterDescriptionNode>
00327 operator||(std::auto_ptr<ParameterDescriptionNode> node_left,
00328 std::auto_ptr<ParameterDescriptionNode> node_right);
00329
00330
00331
00332 std::auto_ptr<ParameterDescriptionNode>
00333 operator^(ParameterDescriptionNode const& node_left,
00334 ParameterDescriptionNode const& node_right);
00335
00336 std::auto_ptr<ParameterDescriptionNode>
00337 operator^(std::auto_ptr<ParameterDescriptionNode> node_left,
00338 ParameterDescriptionNode const& node_right);
00339
00340 std::auto_ptr<ParameterDescriptionNode>
00341 operator^(ParameterDescriptionNode const& node_left,
00342 std::auto_ptr<ParameterDescriptionNode> node_right);
00343
00344 std::auto_ptr<ParameterDescriptionNode>
00345 operator^(std::auto_ptr<ParameterDescriptionNode> node_left,
00346 std::auto_ptr<ParameterDescriptionNode> node_right);
00347 }
00348 #endif