Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-03-26 01:51:13

0001 
0002 #include "FWCore/ParameterSet/interface/ParameterDescriptionNode.h"
0003 #include "FWCore/ParameterSet/interface/ParameterDescriptionCases.h"
0004 #include "FWCore/ParameterSet/src/ANDGroupDescription.h"
0005 #include "FWCore/ParameterSet/src/ORGroupDescription.h"
0006 #include "FWCore/ParameterSet/src/XORGroupDescription.h"
0007 #include "FWCore/ParameterSet/interface/DocFormatHelper.h"
0008 
0009 #include <vector>
0010 #include <cassert>
0011 #include <ostream>
0012 
0013 #define TYPE_TO_ENUM(type, e_val)                      \
0014   template <>                                          \
0015   ParameterTypes ParameterTypeToEnum::toEnum<type>() { \
0016     return e_val;                                      \
0017   }
0018 #define TYPE_TO_NAME(type) \
0019   case k_##type:           \
0020     return #type
0021 #define TYPE_TO_NAME2(e_val, type) \
0022   case e_val:                      \
0023     return #type
0024 
0025 namespace edm {
0026 
0027   class EventID;
0028   class LuminosityBlockID;
0029   class LuminosityBlockRange;
0030   class EventRange;
0031   class InputTag;
0032   class ESInputTag;
0033   class FileInPath;
0034 
0035   TYPE_TO_ENUM(int, k_int32)
0036   TYPE_TO_ENUM(std::vector<int>, k_vint32)
0037   TYPE_TO_ENUM(unsigned, k_uint32)
0038   TYPE_TO_ENUM(std::vector<unsigned>, k_vuint32)
0039   TYPE_TO_ENUM(long long, k_int64)
0040   TYPE_TO_ENUM(std::vector<long long>, k_vint64)
0041   TYPE_TO_ENUM(unsigned long long, k_uint64)
0042   TYPE_TO_ENUM(std::vector<unsigned long long>, k_vuint64)
0043   TYPE_TO_ENUM(double, k_double)
0044   TYPE_TO_ENUM(std::vector<double>, k_vdouble)
0045   TYPE_TO_ENUM(bool, k_bool)
0046   TYPE_TO_ENUM(std::string, k_stringRaw)
0047   TYPE_TO_ENUM(std::vector<std::string>, k_vstringRaw)
0048   TYPE_TO_ENUM(EventID, k_EventID)
0049   TYPE_TO_ENUM(std::vector<EventID>, k_VEventID)
0050   TYPE_TO_ENUM(LuminosityBlockID, k_LuminosityBlockID)
0051   TYPE_TO_ENUM(std::vector<LuminosityBlockID>, k_VLuminosityBlockID)
0052   TYPE_TO_ENUM(InputTag, k_InputTag)
0053   TYPE_TO_ENUM(std::vector<InputTag>, k_VInputTag)
0054   TYPE_TO_ENUM(ESInputTag, k_ESInputTag)
0055   TYPE_TO_ENUM(std::vector<ESInputTag>, k_VESInputTag)
0056   TYPE_TO_ENUM(FileInPath, k_FileInPath)
0057   TYPE_TO_ENUM(LuminosityBlockRange, k_LuminosityBlockRange)
0058   TYPE_TO_ENUM(std::vector<LuminosityBlockRange>, k_VLuminosityBlockRange)
0059   TYPE_TO_ENUM(EventRange, k_EventRange)
0060   TYPE_TO_ENUM(std::vector<EventRange>, k_VEventRange)
0061   // These are intentionally not implemented to prevent one
0062   // from calling add<ParameterSet>.  One should call
0063   // add<ParameterSetDescription> instead.
0064   // TYPE_TO_ENUM(ParameterSet,k_PSet)
0065   // TYPE_TO_ENUM(std::vector<ParameterSet>,k_VPSet)
0066 
0067   std::string parameterTypeEnumToString(ParameterTypes iType) {
0068     switch (iType) {
0069       TYPE_TO_NAME(int32);
0070       TYPE_TO_NAME(vint32);
0071       TYPE_TO_NAME(uint32);
0072       TYPE_TO_NAME(vuint32);
0073       TYPE_TO_NAME(int64);
0074       TYPE_TO_NAME(vint64);
0075       TYPE_TO_NAME(uint64);
0076       TYPE_TO_NAME(vuint64);
0077       TYPE_TO_NAME(double);
0078       TYPE_TO_NAME(vdouble);
0079       TYPE_TO_NAME(bool);
0080       TYPE_TO_NAME2(k_stringRaw, string);
0081       TYPE_TO_NAME2(k_vstringRaw, vstring);
0082       TYPE_TO_NAME(EventID);
0083       TYPE_TO_NAME(VEventID);
0084       TYPE_TO_NAME(LuminosityBlockID);
0085       TYPE_TO_NAME(VLuminosityBlockID);
0086       TYPE_TO_NAME(InputTag);
0087       TYPE_TO_NAME(VInputTag);
0088       TYPE_TO_NAME(ESInputTag);
0089       TYPE_TO_NAME(VESInputTag);
0090       TYPE_TO_NAME(FileInPath);
0091       TYPE_TO_NAME(PSet);
0092       TYPE_TO_NAME(VPSet);
0093       TYPE_TO_NAME(LuminosityBlockRange);
0094       TYPE_TO_NAME(VLuminosityBlockRange);
0095       TYPE_TO_NAME(EventRange);
0096       TYPE_TO_NAME(VEventRange);
0097       default:
0098         assert(false);
0099     }
0100     return "";
0101   }
0102 
0103   Comment::Comment() {}
0104   Comment::Comment(std::string const& iComment) : comment_(iComment) {}
0105   Comment::Comment(char const* iComment) : comment_(iComment) {}
0106 
0107   ParameterDescriptionNode::~ParameterDescriptionNode() {}
0108 
0109   void ParameterDescriptionNode::setComment(std::string const& value) { comment_ = value; }
0110 
0111   void ParameterDescriptionNode::setComment(char const* value) { comment_ = value; }
0112 
0113   void ParameterDescriptionNode::print(std::ostream& os,
0114                                        Modifier modifier,
0115                                        bool writeToCfi,
0116                                        DocFormatHelper& dfh) const {
0117     if (hasNestedContent()) {
0118       dfh.incrementCounter();
0119     }
0120     print_(os, modifier, writeToCfi, dfh);
0121   }
0122 
0123   void ParameterDescriptionNode::printNestedContent(std::ostream& os, bool optional, DocFormatHelper& dfh) const {
0124     if (hasNestedContent()) {
0125       dfh.incrementCounter();
0126       printNestedContent_(os, optional, dfh);
0127     }
0128   }
0129 
0130   void ParameterDescriptionNode::printSpaces(std::ostream& os, int n) {
0131     char oldFill = os.fill(' ');
0132     os.width(n);
0133     os << "";
0134     os.fill(oldFill);
0135   }
0136 
0137   // operator>> ---------------------------------------------
0138 
0139   std::unique_ptr<ParameterDescriptionCases<bool>> operator>>(bool caseValue, ParameterDescriptionNode const& node) {
0140     std::unique_ptr<ParameterDescriptionNode> clonedNode(node.clone());
0141     return caseValue >> std::move(clonedNode);
0142   }
0143 
0144   std::unique_ptr<ParameterDescriptionCases<int>> operator>>(int caseValue, ParameterDescriptionNode const& node) {
0145     std::unique_ptr<ParameterDescriptionNode> clonedNode(node.clone());
0146     return caseValue >> std::move(clonedNode);
0147   }
0148 
0149   std::unique_ptr<ParameterDescriptionCases<std::string>> operator>>(std::string const& caseValue,
0150                                                                      ParameterDescriptionNode const& node) {
0151     std::unique_ptr<ParameterDescriptionNode> clonedNode(node.clone());
0152     return caseValue >> std::move(clonedNode);
0153   }
0154 
0155   std::unique_ptr<ParameterDescriptionCases<std::string>> operator>>(char const* caseValue,
0156                                                                      ParameterDescriptionNode const& node) {
0157     std::unique_ptr<ParameterDescriptionNode> clonedNode(node.clone());
0158     return caseValue >> std::move(clonedNode);
0159   }
0160 
0161   std::unique_ptr<ParameterDescriptionCases<bool>> operator>>(bool caseValue,
0162                                                               std::unique_ptr<ParameterDescriptionNode> node) {
0163     return std::unique_ptr<ParameterDescriptionCases<bool>>(
0164         new ParameterDescriptionCases<bool>(caseValue, std::move(node)));
0165   }
0166 
0167   std::unique_ptr<ParameterDescriptionCases<int>> operator>>(int caseValue,
0168                                                              std::unique_ptr<ParameterDescriptionNode> node) {
0169     return std::unique_ptr<ParameterDescriptionCases<int>>(
0170         new ParameterDescriptionCases<int>(caseValue, std::move(node)));
0171   }
0172 
0173   std::unique_ptr<ParameterDescriptionCases<std::string>> operator>>(std::string const& caseValue,
0174                                                                      std::unique_ptr<ParameterDescriptionNode> node) {
0175     return std::unique_ptr<ParameterDescriptionCases<std::string>>(
0176         new ParameterDescriptionCases<std::string>(caseValue, std::move(node)));
0177   }
0178 
0179   std::unique_ptr<ParameterDescriptionCases<std::string>> operator>>(char const* caseValue,
0180                                                                      std::unique_ptr<ParameterDescriptionNode> node) {
0181     std::string caseValueString(caseValue);
0182     return std::unique_ptr<ParameterDescriptionCases<std::string>>(
0183         new ParameterDescriptionCases<std::string>(caseValue, std::move(node)));
0184   }
0185 
0186   // operator&& ---------------------------------------------
0187 
0188   std::unique_ptr<ParameterDescriptionNode> operator&&(ParameterDescriptionNode const& node_left,
0189                                                        ParameterDescriptionNode const& node_right) {
0190     return std::make_unique<ANDGroupDescription>(node_left, node_right);
0191   }
0192 
0193   std::unique_ptr<ParameterDescriptionNode> operator&&(std::unique_ptr<ParameterDescriptionNode> node_left,
0194                                                        ParameterDescriptionNode const& node_right) {
0195     return std::make_unique<ANDGroupDescription>(std::move(node_left), node_right);
0196   }
0197 
0198   std::unique_ptr<ParameterDescriptionNode> operator&&(ParameterDescriptionNode const& node_left,
0199                                                        std::unique_ptr<ParameterDescriptionNode> node_right) {
0200     return std::make_unique<ANDGroupDescription>(node_left, std::move(node_right));
0201   }
0202 
0203   std::unique_ptr<ParameterDescriptionNode> operator&&(std::unique_ptr<ParameterDescriptionNode> node_left,
0204                                                        std::unique_ptr<ParameterDescriptionNode> node_right) {
0205     return std::make_unique<ANDGroupDescription>(std::move(node_left), std::move(node_right));
0206   }
0207 
0208   // operator|| ---------------------------------------------
0209 
0210   std::unique_ptr<ParameterDescriptionNode> operator||(ParameterDescriptionNode const& node_left,
0211                                                        ParameterDescriptionNode const& node_right) {
0212     return std::make_unique<ORGroupDescription>(node_left, node_right);
0213   }
0214 
0215   std::unique_ptr<ParameterDescriptionNode> operator||(std::unique_ptr<ParameterDescriptionNode> node_left,
0216                                                        ParameterDescriptionNode const& node_right) {
0217     return std::make_unique<ORGroupDescription>(std::move(node_left), node_right);
0218   }
0219 
0220   std::unique_ptr<ParameterDescriptionNode> operator||(ParameterDescriptionNode const& node_left,
0221                                                        std::unique_ptr<ParameterDescriptionNode> node_right) {
0222     return std::make_unique<ORGroupDescription>(node_left, std::move(node_right));
0223   }
0224 
0225   std::unique_ptr<ParameterDescriptionNode> operator||(std::unique_ptr<ParameterDescriptionNode> node_left,
0226                                                        std::unique_ptr<ParameterDescriptionNode> node_right) {
0227     return std::make_unique<ORGroupDescription>(std::move(node_left), std::move(node_right));
0228   }
0229 
0230   // operator^  ---------------------------------------------
0231 
0232   std::unique_ptr<ParameterDescriptionNode> operator^(ParameterDescriptionNode const& node_left,
0233                                                       ParameterDescriptionNode const& node_right) {
0234     return std::make_unique<XORGroupDescription>(node_left, node_right);
0235   }
0236 
0237   std::unique_ptr<ParameterDescriptionNode> operator^(std::unique_ptr<ParameterDescriptionNode> node_left,
0238                                                       ParameterDescriptionNode const& node_right) {
0239     return std::make_unique<XORGroupDescription>(std::move(node_left), node_right);
0240   }
0241 
0242   std::unique_ptr<ParameterDescriptionNode> operator^(ParameterDescriptionNode const& node_left,
0243                                                       std::unique_ptr<ParameterDescriptionNode> node_right) {
0244     return std::make_unique<XORGroupDescription>(node_left, std::move(node_right));
0245   }
0246 
0247   std::unique_ptr<ParameterDescriptionNode> operator^(std::unique_ptr<ParameterDescriptionNode> node_left,
0248                                                       std::unique_ptr<ParameterDescriptionNode> node_right) {
0249     return std::make_unique<XORGroupDescription>(std::move(node_left), std::move(node_right));
0250   }
0251 }  // namespace edm