aGrUM  0.21.0
a C++ library for (probabilistic) graphical models
errors.cpp
Go to the documentation of this file.
1 /**
2  *
3  * Copyright (c) 2005-2021 by Pierre-Henri WUILLEMIN(@LIP6) & Christophe GONZALES(@AMU)
4  * info_at_agrum_dot_org
5  *
6  * This library is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this library. If not, see <http://www.gnu.org/licenses/>.
18  *
19  */
20 
21 
22 /**
23  * @file
24  * @brief Macros for error messages.
25  *
26  * @author Christophe GONZALES(@AMU) and Pierre-Henri WUILLEMIN(@LIP6)
27  * @author Lionel TORTI
28  */
29 
30 #include <agrum/PRM/o3prm/errors.h>
31 
32 #ifndef DOXYGEN_SHOULD_SKIP_THIS
33 
34 namespace gum {
35  namespace prm {
36  namespace o3prm {
37 
38  void O3PRM_TYPE_NOT_FOUND(const O3Label& val, ErrorsContainer& errors) {
39  auto pos = val.position();
40  std::stringstream msg;
41  msg << "Error : "
42  << "Unknown type " << val.label();
43  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
44  }
45 
46  void O3PRM_TYPE_AMBIGUOUS(const O3Label& val,
47  const std::vector< std::string >& matches,
48  ErrorsContainer& errors) {
49  const auto& pos = val.position();
50  std::stringstream msg;
51  msg << "Error : "
52  << "Ambiguous name " << val.label() << ", found more than one elligible types: ";
53  for (std::size_t i = 0; i < matches.size() - 1; ++i) {
54  msg << matches[i] << ", ";
55  }
56  msg << matches.back();
57  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
58  }
59 
60  void O3PRM_TYPE_RESERVED(const O3Label& val, ErrorsContainer& errors) {
61  const auto& pos = val.position();
62  std::stringstream msg;
63  msg << "Error : "
64  << "Type name " << val.label() << " is reserved";
65  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
66  }
67 
68  void O3PRM_TYPE_DUPPLICATE(const O3Label& val, ErrorsContainer& errors) {
69  const auto& pos = val.position();
70  std::stringstream msg;
71  msg << "Error : "
72  << "Type " << val.label() << " exists already";
73  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
74  }
75 
76  void O3PRM_TYPE_CYCLIC_INHERITANCE(const O3Label& sub_type,
77  const O3Label& super_type,
78  ErrorsContainer& errors) {
79  const auto& pos = sub_type.position();
80  std::stringstream msg;
81  msg << "Error : "
82  << "Cyclic inheritance between type " << sub_type.label() << " and type "
83  << super_type.label();
84  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
85  }
86 
87  void
88  O3PRM_TYPE_UNKNOWN_LABEL(const O3Label& type, const O3Label& l, ErrorsContainer& errors) {
89  const auto& pos = l.position();
90  std::stringstream msg;
91  msg << "Error : "
92  << "Unknown label " << l.label() << " in " << type.label();
93  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
94  }
95 
96  void O3PRM_TYPE_INVALID_RANGE(const O3IntType& val, ErrorsContainer& errors) {
97  const auto& pos = val.position();
98  std::stringstream msg;
99  msg << "Error : "
100  << "Invalid range " << val.start().value() << " -> " << val.end().value();
101  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
102  }
103 
104  void O3PRM_TYPE_INVALID_RANGE(const O3RealType& val, ErrorsContainer& errors) {
105  const auto& pos = val.position();
106  std::stringstream msg;
107  msg << "Error : "
108  << "Found " << val.values().size() << " values in range expected at least 3";
109  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
110  }
111 
112  void O3PRM_CLASS_NOT_FOUND(const O3Label& val, ErrorsContainer& errors) {
113  const auto& pos = val.position();
114  std::stringstream msg;
115  msg << "Error : "
116  << "Unknown class " << val.label();
117  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
118  GUM_ERROR(FatalError, msg.str())
119  }
120 
121  void O3PRM_CLASS_AMBIGUOUS(const O3Label& val,
122  const std::vector< std::string >& matches,
123  ErrorsContainer& errors) {
124  const auto& pos = val.position();
125  std::stringstream msg;
126  msg << "Error : "
127  << "Name " << val.label() << " is ambiguous: ";
128  for (std::size_t i = 0; i < matches.size() - 1; ++i) {
129  msg << matches[i] << ", ";
130  }
131  msg << matches.back();
132  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
133  }
134 
135  void O3PRM_CLASS_DUPLICATE(const O3Label& val, ErrorsContainer& errors) {
136  // Raised if duplicate type names
137  const auto& pos = val.position();
138  std::stringstream msg;
139  msg << "Error : "
140  << "Class name " << val.label() << " exists already";
141  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
142  }
143 
144  void O3PRM_CLASS_CYLIC_INHERITANCE(const O3Label& sub,
145  const O3Label& super,
146  ErrorsContainer& errors) {
147  // Cyclic inheritance
148  const auto& pos = sub.position();
149  std::stringstream msg;
150  msg << "Error : "
151  << "Cyclic inheritance between class " << sub.label() << " and class " << super.label();
152  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
153  }
154 
155 
156  void O3PRM_CLASS_ATTR_IMPLEMENTATION(const O3Label& c,
157  const O3Label& i,
158  const O3Label& attr,
159  ErrorsContainer& errors) {
160  const auto& pos = attr.position();
161  std::stringstream msg;
162  msg << "Error : "
163  << "Class " << c.label() << " attribute " << attr.label()
164  << " does not respect interface " << i.label();
165  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
166  }
167 
168  void O3PRM_CLASS_AGG_IMPLEMENTATION(const O3Label& c,
169  const O3Label& i,
170  const O3Label& attr,
171  ErrorsContainer& errors) {
172  const auto& pos = attr.position();
173  std::stringstream msg;
174  msg << "Error : "
175  << "Class " << c.label() << " aggregate " << attr.label()
176  << " does not respect interface " << i.label();
177  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
178  }
179 
180  void O3PRM_CLASS_REF_IMPLEMENTATION(const O3Label& c,
181  const O3Label& i,
182  const O3Label& ref,
183  ErrorsContainer& errors) {
184  const auto& pos = ref.position();
185  std::stringstream msg;
186  msg << "Error : "
187  << "Class " << c.label() << " reference " << ref.label()
188  << " does not respect interface " << i.label();
189  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
190  }
191 
192 
193  void O3PRM_CLASS_MISSING_ATTRIBUTES(const O3Label& c,
194  const O3Label& i,
195  ErrorsContainer& errors) {
196  const auto& pos = c.position();
197  std::stringstream msg;
198  msg << "Error : "
199  << "Class " << c.label() << " does not implement all of interface " << i.label()
200  << " attributes";
201  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
202  }
203 
204  void O3PRM_CLASS_DUPLICATE_REFERENCE(const O3Label& ref, ErrorsContainer& errors) {
205  const auto& pos = ref.position();
206  std::stringstream msg;
207  msg << "Error : "
208  << "Reference Slot name " << ref.label() << " exists already";
209  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
210  }
211 
212  void
213  O3PRM_CLASS_SELF_REFERENCE(const O3Label& c, const O3Label& ref, ErrorsContainer& errors) {
214  const auto& pos = ref.position();
215  std::stringstream msg;
216  msg << "Error : "
217  << "Class " << c.label() << " cannot reference itself";
218  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
219  }
220 
221  void O3PRM_CLASS_ILLEGAL_SUB_REFERENCE(const O3Label& c,
222  const O3Label& sub,
223  ErrorsContainer& errors) {
224  const auto& pos = sub.position();
225  std::stringstream msg;
226  msg << "Error : "
227  << "Class " << c.label() << " cannot reference subclass " << sub.label();
228  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
229  }
230 
231  void O3PRM_CLASS_PARENT_NOT_FOUND(const O3Label& parent, ErrorsContainer& errors) {
232  const auto& pos = parent.position();
233  std::stringstream msg;
234  msg << "Error : "
235  << "Parent " << parent.label() << " not found";
236  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
237  }
238 
239  void O3PRM_CLASS_ILLEGAL_PARENT(const O3Label& parent, ErrorsContainer& errors) {
240  const auto& pos = parent.position();
241  std::stringstream msg;
242  msg << "Error : "
243  << "Illegal parent " << parent.label();
244  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
245  }
246 
247  void O3PRM_CLASS_LINK_NOT_FOUND(const O3Label& chain,
248  const std::string& s,
249  ErrorsContainer& errors) {
250  const auto& pos = chain.position();
251  std::stringstream msg;
252  msg << "Error : "
253  << "Link " << s << " in chain " << chain.label() << " not found";
254  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
255  }
256 
257  void O3PRM_CLASS_ILLEGAL_CPT_SIZE(const std::string& c,
258  const O3Label& attr,
259  Size found,
260  Size expected,
261  ErrorsContainer& errors) {
262  const auto& pos = attr.position();
263  std::stringstream msg;
264  msg << "Error : "
265  << "Illegal CPT size, expected " << expected << " found " << found << " for attribute "
266  << c << "." << attr.label();
267  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
268  }
269 
270  void O3PRM_CLASS_ILLEGAL_CPT_VALUE(const std::string& c,
271  const O3Label& attr,
272  const O3Formula& f,
273  ErrorsContainer& errors) {
274  const auto& pos = f.position();
275  std::stringstream msg;
276  msg << "Error : "
277  << "Illegal CPT value \"" << f.formula().formula() << "\" in attribute " << c << "."
278  << attr.label();
279  try {
280  auto result = f.formula().result();
281  msg << ", formula resolve to " << result;
282  } catch (...) {
283  msg << ", could not resolve the following formula: "
284  << "\"" << f.formula().formula() << "\"";
285  }
286  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
287  }
288 
289  void O3PRM_CLASS_CPT_DOES_NOT_SUM_TO_1(const std::string& c,
290  const O3Label& attr,
291  float f,
292  ErrorsContainer& errors) {
293  const auto& pos = attr.position();
294  std::stringstream msg;
295  msg << "Error : "
296  << "PRMAttribute " << c << "." << attr.label() << " CPT does not sum to 1, found " << f;
297  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
298  }
299 
300  void O3PRM_CLASS_CPT_DOES_NOT_SUM_TO_1_WARNING(const std::string& c,
301  const O3Label& attr,
302  float f,
303  ErrorsContainer& errors) {
304  const auto& pos = attr.position();
305  std::stringstream msg;
306  msg << "Warning : "
307  << "PRMAttribute " << c << "." << attr.label() << " CPT does not sum to 1, found " << f;
308  errors.addWarning(msg.str(), pos.file(), pos.line(), pos.column());
309  }
310 
311  void O3PRM_CLASS_ILLEGAL_RULE_SIZE(const O3RuleCPT::O3Rule& rule,
312  size_t found,
313  size_t expected,
314  ErrorsContainer& errors) {
315  const auto& pos = rule.first.front().position();
316  std::stringstream msg;
317  msg << "Error : "
318  << "Expected " << expected << " value(s), found " << found;
319  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
320  }
321 
322  void O3PRM_CLASS_ILLEGAL_RULE_LABEL(const O3RuleCPT::O3Rule& rule,
323  const O3Label& label,
324  const O3Label& parent,
325  ErrorsContainer& errors) {
326  const auto& pos = label.position();
327  std::stringstream msg;
328  msg << "Error : "
329  << "Label " << label << " is not part of " << parent << " domain";
330  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
331  }
332 
333  void O3PRM_CLASS_WRONG_PARENT(const O3Label& prnt, ErrorsContainer& errors) {
334  const auto& pos = prnt.position();
335  std::stringstream msg;
336  msg << "Error : "
337  << "Illegal parent " << prnt;
338  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
339  }
340 
341  void O3PRM_CLASS_WRONG_PARENT_TYPE(const O3Label& prnt,
342  const std::string& expected,
343  const std::string& found,
344  ErrorsContainer& errors) {
345  const auto& pos = prnt.position();
346  std::stringstream msg;
347  msg << "Error : "
348  << "Expected type " << expected << " for parent " << prnt.label() << ", found "
349  << found;
350  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
351  }
352 
353  void O3PRM_CLASS_ILLEGAL_OVERLOAD(const O3Label& elt,
354  const O3Label& c,
355  ErrorsContainer& errors) {
356  const auto& pos = elt.position();
357  std::stringstream msg;
358  msg << "Error : "
359  << "Illegal overload of element " << elt.label() << " from class " << c.label();
360  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
361  }
362 
363  void O3PRM_CLASS_AGG_PARAMETERS(const O3Label& agg,
364  Size expected,
365  Size found,
366  ErrorsContainer& errors) {
367  const auto& pos = agg.position();
368  std::stringstream msg;
369  msg << "Error : "
370  << "Expected " << expected << " parameters "
371  << ", found " << found;
372  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
373  }
374 
375  void O3PRM_CLASS_AGG_PARAMETER_NOT_FOUND(const O3Label& agg,
376  const O3Label& param,
377  ErrorsContainer& errors) {
378  const auto& pos = param.position();
379  std::stringstream msg;
380  msg << "Error : "
381  << "Parameter " << param.label() << " in aggregate " << agg.label()
382  << " does not match any expected values";
383  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
384  }
385 
386  void O3PRM_INTERFACE_ILLEGAL_ARRAY(const O3Label& val, ErrorsContainer& errors) {
387  const auto& pos = val.position();
388  std::stringstream msg;
389  msg << "Error : "
390  << "PRMAttribute " << val.label() << " can not be an array";
391  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
392  }
393 
394  void O3PRM_INTERFACE_NOT_FOUND(const O3Label& val, ErrorsContainer& errors) {
395  const auto& pos = val.position();
396  std::stringstream msg;
397  msg << "Error : "
398  << "Interface " << val.label() << " not found";
399  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
400  }
401 
402  void O3PRM_INTERFACE_AMBIGUOUS(const O3Label& val,
403  const std::vector< std::string >& matches,
404  ErrorsContainer& errors) {
405  const auto& pos = val.position();
406  std::stringstream msg;
407  msg << "Error : "
408  << "Name " << val.label() << " is ambiguous: ";
409  for (std::size_t i = 0; i < matches.size() - 1; ++i) {
410  msg << matches[i] << ", ";
411  }
412  msg << matches.back();
413  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
414  }
415 
416  void O3PRM_INTERFACE_DUPLICATE(const O3Label& val, ErrorsContainer& errors) {
417  const auto& pos = val.position();
418  std::stringstream msg;
419  msg << "Error : "
420  << "Interface name " << val.label() << " exists already";
421  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
422  }
423 
424  void O3PRM_INTERFACE_DUPLICATE_ELEMENT(const O3InterfaceElement& elt,
425  ErrorsContainer& errors) {
426  const auto& pos = elt.type().position();
427  std::stringstream msg;
428  msg << "Error : "
429  << "Element " << elt.name().label() << " already exists";
430  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
431  }
432 
433  void O3PRM_INTERFACE_CYCLIC_INHERITANCE(const O3Label& sub,
434  const O3Label& super,
435  ErrorsContainer& errors) {
436  const auto& pos = super.position();
437  std::stringstream msg;
438  msg << "Error : "
439  << "Cyclic inheritance between interface " << sub.label() << " and interface "
440  << super.label();
441  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
442  }
443 
444  void O3PRM_INTERFACE_SELF_REFERENCE(const O3Interface& i,
445  const O3InterfaceElement& r,
446  ErrorsContainer& errors) {
447  const auto& pos = r.type().position();
448  std::stringstream msg;
449  msg << "Error : "
450  << "Interface " << i.name().label() << " cannot reference itself";
451  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
452  }
453 
454  void O3PRM_INTERFACE_ILLEGAL_SUB_REFERENCE(const O3Interface& i,
455  const O3InterfaceElement& ref,
456  ErrorsContainer& errors) {
457  const auto& pos = ref.type().position();
458  std::stringstream msg;
459  msg << "Error : "
460  << "Interface " << i.name().label() << " cannot reference subinterface "
461  << ref.type().label();
462  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
463  }
464 
465  void O3PRM_INTERFACE_ILLEGAL_OVERLOAD(const O3InterfaceElement& elt,
466  ErrorsContainer& errors) {
467  const auto& pos = elt.type().position();
468  std::stringstream msg;
469  msg << "Error : "
470  << "Illegal overload of element " << elt.name().label();
471  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
472  }
473 
474  void O3PRM_REFERENCE_NOT_FOUND(const O3Label& val, ErrorsContainer& errors) {
475  const auto& pos = val.position();
476  std::stringstream msg;
477  msg << "Error : "
478  << "Reference Slot type " << val.label() << " not found";
479  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
480  }
481 
482  void O3PRM_REFERENCE_AMBIGUOUS(const O3Label& val,
483  const std::vector< std::string >& matches,
484  ErrorsContainer& errors) {
485  const auto& pos = val.position();
486  std::stringstream msg;
487  msg << "Error : "
488  << "Name " << val.label() << " is ambiguous: ";
489  for (std::size_t i = 0; i < matches.size() - 1; ++i) {
490  msg << matches[i] << ", ";
491  }
492  msg << matches.back();
493  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
494  }
495 
496  void O3PRM_SYSTEM_INSTANTIATION_FAILED(const O3System& sys, ErrorsContainer& errors) {
497  const auto& pos = sys.name().position();
498  std::stringstream msg;
499  msg << "Error : "
500  << "Could not instantiate the system, some reference slots must be "
501  "unassigned";
502  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
503  }
504 
505  void O3PRM_SYSTEM_NOT_A_CLASS(const O3Instance& i, ErrorsContainer& errors) {
506  const auto& pos = i.type().position();
507  std::stringstream msg;
508  msg << "Error : " << i.type().label() << " is not a class";
509  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
510  }
511 
512  void O3PRM_SYSTEM_DUPLICATE_INSTANCE(const O3Instance& i, ErrorsContainer& errors) {
513  const auto& pos = i.type().position();
514  std::stringstream msg;
515  msg << "Error : "
516  << "Instance " << i.name().label() << " already exists";
517  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
518  }
519 
520  void O3PRM_SYSTEM_NOT_A_PARAMETER(const O3InstanceParameter& param, ErrorsContainer& errors) {
521  const auto& pos = param.name().position();
522  std::stringstream msg;
523  msg << "Instance error : " << param.name().label() << " is not a parameter";
524  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
525  }
526 
527  void O3PRM_SYSTEM_PARAMETER_NOT_FOUND(const O3InstanceParameter& param,
528  ErrorsContainer& errors) {
529  const auto& pos = param.name().position();
530  std::stringstream msg;
531  msg << "Error : "
532  << "Parameter " << param.name().label() << " not found";
533  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
534  }
535 
536  void O3PRM_SYSTEM_PARAMETER_NOT_INT(const O3InstanceParameter& param,
537  ErrorsContainer& errors) {
538  const auto& pos = param.value().position();
539  std::stringstream msg;
540  msg << "Error : "
541  << "Parameter " << param.name().label() << " is an integer";
542  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
543  }
544 
545  void O3PRM_SYSTEM_PARAMETER_NOT_FLOAT(const O3InstanceParameter& param,
546  ErrorsContainer& errors) {
547  const auto& pos = param.value().position();
548  std::stringstream msg;
549  msg << "Error : "
550  << "Parameter " << param.name().label() << " is a float";
551  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
552  }
553 
554  void O3PRM_SYSTEM_INVALID_LEFT_VALUE(const O3Label& val, ErrorsContainer& errors) {
555  const auto& pos = val.position();
556  std::stringstream msg;
557  msg << "Error : "
558  << "Invalid left expression " << val.label();
559  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
560  }
561 
562  void O3PRM_SYSTEM_INSTANCE_NOT_FOUND(const O3Label& i, ErrorsContainer& errors) {
563  const auto& pos = i.position();
564  std::stringstream msg;
565  msg << "Error : "
566  << "Instance " << i.label() << " not found";
567  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
568  }
569 
570  void O3PRM_SYSTEM_REFERENCE_NOT_FOUND(const O3Label& ref,
571  const std::string& type,
572  ErrorsContainer& errors) {
573  const auto& pos = ref.position();
574  std::stringstream msg;
575  msg << "Error : "
576  << "Reference " << ref.label() << " not found in class " << type;
577  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
578  }
579 
580  void O3PRM_SYSTEM_NOT_AN_ARRAY(const O3Label& val, ErrorsContainer& errors) {
581  const auto& pos = val.position();
582  std::stringstream msg;
583  msg << "Error : " << val.label() << " is not an array";
584  errors.addError(msg.str(), pos.file(), pos.line(), pos.column());
585  }
586 
587  void O3PRM_DEPRECATED_TYPE_WARNING(const O3Label& val, ErrorsContainer& errors) {
588  const auto& pos = val.position();
589  std::stringstream msg;
590  msg << "Warning : " << val.label() << " is declared using a deprecated syntax.";
591  errors.addWarning(msg.str(), pos.file(), pos.line(), pos.column());
592  }
593 
594 
595  } // namespace o3prm
596  } // namespace prm
597 } // namespace gum
598 
599 #endif // DOXYGEN_SHOULD_SKIP_THIS
INLINE void emplace(Args &&... args)
Definition: set_tpl.h:643
ParamScopeData(const std::string &s, const PRMReferenceSlot< GUM_SCALAR > &ref, Idx d)