00001
00002 #include "FWCore/ParameterSet/interface/ParameterDescriptionNode.h"
00003 #include "FWCore/ParameterSet/interface/ParameterDescriptionCases.h"
00004 #include "FWCore/ParameterSet/interface/ANDGroupDescription.h"
00005 #include "FWCore/ParameterSet/interface/ORGroupDescription.h"
00006 #include "FWCore/ParameterSet/interface/XORGroupDescription.h"
00007 #include "FWCore/ParameterSet/interface/DocFormatHelper.h"
00008
00009 #include <vector>
00010 #include <cassert>
00011 #include <ostream>
00012
00013 #define TYPE_TO_ENUM(type,e_val) template<> ParameterTypes ParameterTypeToEnum::toEnum<type >(){ return e_val; }
00014 #define TYPE_TO_NAME(type) case k_ ## type: return #type
00015
00016 namespace edm {
00017
00018 class EventID;
00019 class LuminosityBlockID;
00020 class LuminosityBlockRange;
00021 class EventRange;
00022 class InputTag;
00023 class FileInPath;
00024
00025 TYPE_TO_ENUM(int,k_int32)
00026 TYPE_TO_ENUM(std::vector<int>,k_vint32)
00027 TYPE_TO_ENUM(unsigned,k_uint32)
00028 TYPE_TO_ENUM(std::vector<unsigned>,k_vuint32)
00029 TYPE_TO_ENUM(long long,k_int64)
00030 TYPE_TO_ENUM(std::vector<long long>,k_vint64)
00031 TYPE_TO_ENUM(unsigned long long,k_uint64)
00032 TYPE_TO_ENUM(std::vector<unsigned long long>,k_vuint64)
00033 TYPE_TO_ENUM(double,k_double)
00034 TYPE_TO_ENUM(std::vector<double>,k_vdouble)
00035 TYPE_TO_ENUM(bool,k_bool)
00036 TYPE_TO_ENUM(std::string,k_string)
00037 TYPE_TO_ENUM(std::vector<std::string>,k_vstring)
00038 TYPE_TO_ENUM(EventID,k_EventID)
00039 TYPE_TO_ENUM(std::vector<EventID>,k_VEventID)
00040 TYPE_TO_ENUM(LuminosityBlockID,k_LuminosityBlockID)
00041 TYPE_TO_ENUM(std::vector<LuminosityBlockID>,k_VLuminosityBlockID)
00042 TYPE_TO_ENUM(InputTag,k_InputTag)
00043 TYPE_TO_ENUM(std::vector<InputTag>,k_VInputTag)
00044 TYPE_TO_ENUM(FileInPath,k_FileInPath)
00045 TYPE_TO_ENUM(LuminosityBlockRange,k_LuminosityBlockRange)
00046 TYPE_TO_ENUM(std::vector<LuminosityBlockRange>,k_VLuminosityBlockRange)
00047 TYPE_TO_ENUM(EventRange,k_EventRange)
00048 TYPE_TO_ENUM(std::vector<EventRange>,k_VEventRange)
00049
00050
00051
00052
00053
00054
00055 std::string parameterTypeEnumToString(ParameterTypes iType) {
00056 switch(iType) {
00057 TYPE_TO_NAME(int32);
00058 TYPE_TO_NAME(vint32);
00059 TYPE_TO_NAME(uint32);
00060 TYPE_TO_NAME(vuint32);
00061 TYPE_TO_NAME(int64);
00062 TYPE_TO_NAME(vint64);
00063 TYPE_TO_NAME(uint64);
00064 TYPE_TO_NAME(vuint64);
00065 TYPE_TO_NAME(double);
00066 TYPE_TO_NAME(vdouble);
00067 TYPE_TO_NAME(bool);
00068 TYPE_TO_NAME(string);
00069 TYPE_TO_NAME(vstring);
00070 TYPE_TO_NAME(EventID);
00071 TYPE_TO_NAME(VEventID);
00072 TYPE_TO_NAME(LuminosityBlockID);
00073 TYPE_TO_NAME(VLuminosityBlockID);
00074 TYPE_TO_NAME(InputTag);
00075 TYPE_TO_NAME(VInputTag);
00076 TYPE_TO_NAME(FileInPath);
00077 TYPE_TO_NAME(PSet);
00078 TYPE_TO_NAME(VPSet);
00079 TYPE_TO_NAME(LuminosityBlockRange);
00080 TYPE_TO_NAME(VLuminosityBlockRange);
00081 TYPE_TO_NAME(EventRange);
00082 TYPE_TO_NAME(VEventRange);
00083 default:
00084 assert(false);
00085 }
00086 return "";
00087 }
00088
00089 ParameterDescriptionNode::~ParameterDescriptionNode() {
00090 }
00091
00092 void
00093 ParameterDescriptionNode::setComment(std::string const& value) {
00094 comment_ = value;
00095 }
00096
00097 void
00098 ParameterDescriptionNode::setComment(char const* value) {
00099 comment_ = value;
00100 }
00101
00102 void
00103 ParameterDescriptionNode::print(std::ostream& os,
00104 bool optional,
00105 bool writeToCfi,
00106 DocFormatHelper& dfh) {
00107 if (hasNestedContent()) {
00108 dfh.incrementCounter();
00109 }
00110 print_(os, optional, writeToCfi, dfh);
00111 }
00112
00113 void
00114 ParameterDescriptionNode::printNestedContent(std::ostream& os,
00115 bool optional,
00116 DocFormatHelper& dfh) {
00117 if (hasNestedContent()) {
00118 dfh.incrementCounter();
00119 printNestedContent_(os, optional, dfh);
00120 }
00121 }
00122
00123 void
00124 ParameterDescriptionNode::printSpaces(std::ostream& os, int n) {
00125 char oldFill = os.fill(' ');
00126 os.width(n);
00127 os << "";
00128 os.fill(oldFill);
00129 }
00130
00131
00132
00133 std::auto_ptr<ParameterDescriptionCases<bool> >
00134 operator>>(bool caseValue,
00135 ParameterDescriptionNode const& node) {
00136 std::auto_ptr<ParameterDescriptionNode> clonedNode(node.clone());
00137 return caseValue >> clonedNode;
00138 }
00139
00140 std::auto_ptr<ParameterDescriptionCases<int> >
00141 operator>>(int caseValue,
00142 ParameterDescriptionNode const& node) {
00143 std::auto_ptr<ParameterDescriptionNode> clonedNode(node.clone());
00144 return caseValue >> clonedNode;
00145 }
00146
00147 std::auto_ptr<ParameterDescriptionCases<std::string> >
00148 operator>>(std::string const& caseValue,
00149 ParameterDescriptionNode const& node) {
00150 std::auto_ptr<ParameterDescriptionNode> clonedNode(node.clone());
00151 return caseValue >> clonedNode;
00152 }
00153
00154 std::auto_ptr<ParameterDescriptionCases<std::string> >
00155 operator>>(char const* caseValue,
00156 ParameterDescriptionNode const& node) {
00157 std::auto_ptr<ParameterDescriptionNode> clonedNode(node.clone());
00158 return caseValue >> clonedNode;
00159 }
00160
00161 std::auto_ptr<ParameterDescriptionCases<bool> >
00162 operator>>(bool caseValue,
00163 std::auto_ptr<ParameterDescriptionNode> node) {
00164 return std::auto_ptr<ParameterDescriptionCases<bool> >(
00165 new ParameterDescriptionCases<bool>(caseValue, node));
00166 }
00167
00168 std::auto_ptr<ParameterDescriptionCases<int> >
00169 operator>>(int caseValue,
00170 std::auto_ptr<ParameterDescriptionNode> node) {
00171 return std::auto_ptr<ParameterDescriptionCases<int> >(
00172 new ParameterDescriptionCases<int>(caseValue, node));
00173 }
00174
00175 std::auto_ptr<ParameterDescriptionCases<std::string> >
00176 operator>>(std::string const& caseValue,
00177 std::auto_ptr<ParameterDescriptionNode> node) {
00178 return std::auto_ptr<ParameterDescriptionCases<std::string> >(
00179 new ParameterDescriptionCases<std::string>(caseValue, node));
00180 }
00181
00182 std::auto_ptr<ParameterDescriptionCases<std::string> >
00183 operator>>(char const* caseValue,
00184 std::auto_ptr<ParameterDescriptionNode> node) {
00185 std::string caseValueString(caseValue);
00186 return std::auto_ptr<ParameterDescriptionCases<std::string> >(
00187 new ParameterDescriptionCases<std::string>(caseValue, node));
00188 }
00189
00190
00191
00192 std::auto_ptr<ParameterDescriptionNode>
00193 operator&&(ParameterDescriptionNode const& node_left,
00194 ParameterDescriptionNode const& node_right) {
00195 return std::auto_ptr<ParameterDescriptionNode>(new ANDGroupDescription(node_left, node_right));
00196 }
00197
00198 std::auto_ptr<ParameterDescriptionNode>
00199 operator&&(std::auto_ptr<ParameterDescriptionNode> node_left,
00200 ParameterDescriptionNode const& node_right) {
00201 return std::auto_ptr<ParameterDescriptionNode>(new ANDGroupDescription(node_left, node_right));
00202 }
00203
00204 std::auto_ptr<ParameterDescriptionNode>
00205 operator&&(ParameterDescriptionNode const& node_left,
00206 std::auto_ptr<ParameterDescriptionNode> node_right) {
00207 return std::auto_ptr<ParameterDescriptionNode>(new ANDGroupDescription(node_left, node_right));
00208 }
00209
00210 std::auto_ptr<ParameterDescriptionNode>
00211 operator&&(std::auto_ptr<ParameterDescriptionNode> node_left,
00212 std::auto_ptr<ParameterDescriptionNode> node_right) {
00213 return std::auto_ptr<ParameterDescriptionNode>(new ANDGroupDescription(node_left, node_right));
00214 }
00215
00216
00217
00218 std::auto_ptr<ParameterDescriptionNode>
00219 operator||(ParameterDescriptionNode const& node_left,
00220 ParameterDescriptionNode const& node_right) {
00221 return std::auto_ptr<ParameterDescriptionNode>(new ORGroupDescription(node_left, node_right));
00222 }
00223
00224 std::auto_ptr<ParameterDescriptionNode>
00225 operator||(std::auto_ptr<ParameterDescriptionNode> node_left,
00226 ParameterDescriptionNode const& node_right) {
00227 return std::auto_ptr<ParameterDescriptionNode>(new ORGroupDescription(node_left, node_right));
00228 }
00229
00230 std::auto_ptr<ParameterDescriptionNode>
00231 operator||(ParameterDescriptionNode const& node_left,
00232 std::auto_ptr<ParameterDescriptionNode> node_right) {
00233 return std::auto_ptr<ParameterDescriptionNode>(new ORGroupDescription(node_left, node_right));
00234 }
00235
00236 std::auto_ptr<ParameterDescriptionNode>
00237 operator||(std::auto_ptr<ParameterDescriptionNode> node_left,
00238 std::auto_ptr<ParameterDescriptionNode> node_right) {
00239 return std::auto_ptr<ParameterDescriptionNode>(new ORGroupDescription(node_left, node_right));
00240 }
00241
00242
00243
00244 std::auto_ptr<ParameterDescriptionNode>
00245 operator^(ParameterDescriptionNode const& node_left,
00246 ParameterDescriptionNode const& node_right) {
00247 return std::auto_ptr<ParameterDescriptionNode>(new XORGroupDescription(node_left, node_right));
00248 }
00249
00250 std::auto_ptr<ParameterDescriptionNode>
00251 operator^(std::auto_ptr<ParameterDescriptionNode> node_left,
00252 ParameterDescriptionNode const& node_right) {
00253 return std::auto_ptr<ParameterDescriptionNode>(new XORGroupDescription(node_left, node_right));
00254 }
00255
00256 std::auto_ptr<ParameterDescriptionNode>
00257 operator^(ParameterDescriptionNode const& node_left,
00258 std::auto_ptr<ParameterDescriptionNode> node_right) {
00259 return std::auto_ptr<ParameterDescriptionNode>(new XORGroupDescription(node_left, node_right));
00260 }
00261
00262 std::auto_ptr<ParameterDescriptionNode>
00263 operator^(std::auto_ptr<ParameterDescriptionNode> node_left,
00264 std::auto_ptr<ParameterDescriptionNode> node_right) {
00265 return std::auto_ptr<ParameterDescriptionNode>(new XORGroupDescription(node_left, node_right));
00266 }
00267 }