CMS 3D CMS Logo

ParameterDescriptionBase.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: ParameterSet
4 // Class : ParameterDescriptionBase
5 //
6 // Implementation:
7 // <Notes on implementation>
8 //
9 // Original Author: Chris Jones
10 // Created: Thu Aug 2 15:35:43 EDT 2007
11 //
12 
14 
18 
19 #include <iomanip>
20 #include <iostream>
21 
22 namespace edm {
23 
25  std::string const& iLabel, ParameterTypes iType, bool isTracked, bool hasDefault, Comment const& iComment)
26  : ParameterDescriptionNode(iComment),
27  label_(iLabel),
28  type_(iType),
29  isTracked_(isTracked),
30  hasDefault_(hasDefault) {
31  if (label_.empty()) {
32  throw Exception(errors::LogicError) << "Empty string used as a label for a parameter. This is\n"
33  "not allowed.\n";
34  }
35  }
36 
38  char const* iLabel, ParameterTypes iType, bool isTracked, bool hasDefault, Comment const& iComment)
39  : ParameterDescriptionNode(iComment),
40  label_(iLabel),
41  type_(iType),
42  isTracked_(isTracked),
43  hasDefault_(hasDefault) {
44  if (label_.empty()) {
45  throw Exception(errors::LogicError) << "Empty string used as a label for a parameter. This is\n"
46  "not allowed.\n";
47  }
48  }
49 
51 
53  std::string tr("a tracked");
54  std::string shouldBe("untracked");
55  if (isTracked()) {
56  tr = "an untracked";
57  shouldBe = "tracked";
58  }
59 
60  throw Exception(errors::Configuration) << "In the configuration, parameter \"" << label()
61  << "\" is defined "
62  "as "
63  << tr << " " << parameterTypeEnumToString(type()) << ".\n"
64  << "It should be " << shouldBe << ".\n";
65  }
66 
68  std::string tr("an untracked");
69  if (isTracked())
70  tr = "a tracked";
71 
72  throw Exception(errors::Configuration) << "Parameter \"" << label()
73  << "\" should be defined "
74  "as "
75  << tr << " " << parameterTypeEnumToString(type()) << ".\n"
76  << "The type in the configuration is incorrect.\n";
77  }
78 
80  std::string tr("untracked");
81  if (isTracked())
82  tr = "tracked";
83 
85  << "Missing required parameter. It should have label \"" << label() << "\" and have type \"" << tr << " "
86  << parameterTypeEnumToString(type()) << "\".\n"
87  << "The description has no default. The parameter must be defined "
88  "in the configuration\n";
89  }
90 
91  void ParameterDescriptionBase::checkAndGetLabelsAndTypes_(std::set<std::string>& usedLabels,
92  std::set<ParameterTypes>& parameterTypes,
93  std::set<ParameterTypes>& /*wildcardTypes*/) const {
94  usedLabels.insert(label());
95  parameterTypes.insert(type());
96  }
97 
99  std::set<std::string>& validatedLabels,
100  bool optional) const {
101  bool exists = exists_(pset, isTracked());
102 
103  if (exists) {
104  validatedLabels.insert(label());
105  } else if (exists_(pset, !isTracked())) {
107  } else if (pset.exists(label())) {
109  }
110 
111  if (!exists && !optional) {
112  if (hasDefault()) {
114  validatedLabels.insert(label());
115  } else {
117  }
118  }
119  }
120 
122  bool optional,
123  bool& startWithComma,
124  int indentation,
126  bool& wroteSomething) const {
127  if (label().empty() or label()[0] == '@') {
128  return;
129  }
130 
132  if (check.first) {
133  CfiOptions fullOp = cfi::Typed{};
134  writeFullCfi(os, optional, startWithComma, indentation, fullOp, wroteSomething);
135  } else if (shouldWriteUntyped(options)) {
136  writeLabelValueCfi(os, optional, startWithComma, indentation, options, wroteSomething);
137  } else {
138  writeFullCfi(os, optional, startWithComma, indentation, options, wroteSomething);
139  }
140  }
141 
143  bool optional,
144  bool& startWithComma,
145  int indentation,
147  bool& wroteSomething) const {
148  constexpr std::string_view k_endList = "]";
149  constexpr std::string_view k_endParenthesis = ")";
150  constexpr std::string_view k_endBasicType = "";
151  if (not hasDefault()) {
152  return;
153  }
154  wroteSomething = true;
155  if (startWithComma)
156  os << ",";
157  startWithComma = true;
158  os << "\n";
160 
161  os << label() << " = ";
162  std::string_view endDelimiter = k_endBasicType;
163  switch (type()) {
164  case k_vdouble:
165  case k_vint32:
166  case k_vint64:
167  case k_vstringRaw:
168  case k_vuint32:
169  case k_vuint64:
170  case k_VESInputTag:
171  case k_VEventID:
172  case k_VEventRange:
173  case k_VInputTag:
176  case k_VPSet:
177  os << "[";
178  endDelimiter = k_endList;
179  break;
180  case k_PSet:
181  os << "dict(";
182  endDelimiter = k_endParenthesis;
183  break;
184  case k_EventID:
185  case k_EventRange:
186  case k_ESInputTag:
187  case k_InputTag:
188  case k_LuminosityBlockID:
190  os << "(";
191  endDelimiter = k_endParenthesis;
192  break;
193  default:
194  break;
195  }
197  os << endDelimiter;
198  return;
199  }
200 
202  bool optional,
203  bool& startWithComma,
204  int indentation,
206  bool& wroteSomething) const {
207  wroteSomething = true;
208  if (startWithComma)
209  os << ",";
210  startWithComma = true;
211 
212  os << "\n";
214 
215  os << label() << " = cms.";
216 
217  if (!hasDefault()) {
218  if (optional) {
219  os << "optional.";
220  } else {
221  os << "required.";
222  }
223  if (!isTracked())
224  os << "untracked.";
226  } else {
227  if (!isTracked())
228  os << "untracked.";
229  os << parameterTypeEnumToString(type()) << "(";
231  os << ")";
232  }
233  }
234  void ParameterDescriptionBase::print_(std::ostream& os, bool optional, bool writeToCfi, DocFormatHelper& dfh) const {
235  if (dfh.pass() == 0) {
236  dfh.setAtLeast1(label().size());
237  if (isTracked()) {
239  } else {
240  dfh.setAtLeast2(parameterTypeEnumToString(type()).size() + 10U);
241  }
242  if (optional) {
243  dfh.setAtLeast3(8U);
244  }
245  } else {
246  if (dfh.brief()) {
247  std::ios::fmtflags oldFlags = os.flags();
248 
249  dfh.indent(os);
250  os << std::left << std::setw(dfh.column1()) << label() << " ";
251 
252  if (isTracked()) {
253  os << std::setw(dfh.column2()) << parameterTypeEnumToString(type());
254  } else {
255  std::stringstream ss;
256  ss << "untracked ";
258  os << std::setw(dfh.column2()) << ss.str();
259  }
260  os << " ";
261 
262  os << std::setw(dfh.column3());
263  if (optional) {
264  os << "optional";
265  } else {
266  os << "";
267  }
268  os << " ";
269  os.flags(oldFlags);
270  printDefault_(os, writeToCfi, dfh);
271  } else {
272  // not brief
273  dfh.indent(os);
274  os << label() << "\n";
275 
276  dfh.indent2(os);
277  os << "type: ";
278  if (!isTracked())
279  os << "untracked ";
280 
281  os << parameterTypeEnumToString(type()) << " ";
282 
283  if (optional)
284  os << "optional";
285  os << "\n";
286 
287  dfh.indent2(os);
288  printDefault_(os, writeToCfi, dfh);
289 
290  if (!comment().empty()) {
292  }
293  os << "\n";
294  }
295  }
296  }
297 
298  void ParameterDescriptionBase::printDefault_(std::ostream& os, bool writeToCfi, DocFormatHelper& dfh) const {
299  if (!dfh.brief())
300  os << "default: ";
301  if (writeToCfi && hasDefault()) {
302  if (hasNestedContent()) {
303  os << "see Section " << dfh.section() << "." << dfh.counter();
304  } else {
305  if (dfh.brief()) {
306  writeDoc_(os, dfh.indentation());
307  } else {
308  writeDoc_(os, dfh.startColumn2());
309  }
310  }
311  } else if (!writeToCfi) {
312  os << "none (do not write to cfi)";
313  } else {
314  os << "none";
315  }
316  os << "\n";
317  }
318 
319  void ParameterDescriptionBase::printNestedContent_(std::ostream& os, bool /*optional*/, DocFormatHelper& dfh) const {
320  int indentation = dfh.indentation();
321  if (dfh.parent() != DocFormatHelper::TOP) {
323  }
324 
326  os << "Section " << dfh.section() << "." << dfh.counter() << " " << label() << " default contents: ";
327  writeDoc_(os, indentation + 2);
328  os << "\n";
329  if (!dfh.brief())
330  os << "\n";
331  }
332 
334 
336  return exists(pset) ? 1 : 0;
337  }
338 } // namespace edm
bool shouldWriteUntyped(CfiOptions const &iOps) noexcept
std::string const & label() const
int startColumn2() const
bool partiallyExists_(ParameterSet const &pset) const override
int howManyXORSubNodesExist_(ParameterSet const &pset) const override
static void wrapAndPrintText(std::ostream &os, std::string const &text, size_t indent, size_t suggestedWidth)
void validate_(ParameterSet &pset, std::set< std::string > &validatedLabels, bool optional) const override
void writeLabelValueCfi(std::ostream &os, bool optional, bool &startWithComma, int indentation, CfiOptions &, bool &wroteSomething) const
void writeFullCfi(std::ostream &os, bool optional, bool &startWithComma, int indentation, CfiOptions &, bool &wroteSomething) const
std::string parameterTypeEnumToString(ParameterTypes iType)
size_t commentWidth() const
void indent2(std::ostream &os) const
void writeCfi_(std::ostream &os, bool optional, bool &startWithComma, int indentation, CfiOptions &, bool &wroteSomething) const override
size_t column1() const
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e< void, edm::EventID const &, edm::Timestamp const & > We also list in braces which AR_WATCH_USING_METHOD_ is used for those or
Definition: Activities.doc:12
void setAtLeast2(size_t width)
static int offsetSectionContent()
optional
Definition: Types.py:245
size_t column3() const
size_t column2() const
std::string const & section() const
static void printSpaces(std::ostream &os, int n)
void print_(std::ostream &os, bool optional, bool writeToCfi, DocFormatHelper &dfh) const override
std::string const & comment() const
static void check(T const &p, std::string const &id, SelectedProducts const &iProducts, bool iVerbose)
bool exists(ParameterSet const &pset) const
virtual bool exists_(ParameterSet const &pset, bool isTracked) const =0
HLT enums.
virtual void insertDefault_(ParameterSet &pset) const =0
ParameterDescriptionBase(std::string const &iLabel, ParameterTypes iType, bool isTracked, bool hasDefault, Comment const &iComment)
virtual void writeDoc_(std::ostream &os, int indentation) const =0
virtual void printDefault_(std::ostream &os, bool writeToCfi, DocFormatHelper &dfh) const
void setAtLeast1(size_t width)
void setAtLeast3(size_t width)
void indent(std::ostream &os) const
std::pair< bool, NodeGuard > needToSwitchToTyped(std::string_view iNode, CfiOptions &iOpt) noexcept
void printNestedContent_(std::ostream &os, bool optional, DocFormatHelper &dfh) const override
cfi::CfiOptions CfiOptions
DescriptionParent parent() const
void checkAndGetLabelsAndTypes_(std::set< std::string > &usedLabels, std::set< ParameterTypes > &parameterTypes, std::set< ParameterTypes > &wildcardTypes) const override