parameter.h
Go to the documentation of this file.
1 
9 #ifndef PARAMETER_H
10 #define PARAMETER_H
11 
12 #include <string>
13 #include <unordered_map>
14 #include <yaml-cpp/yaml.h>
15 #include <utility>
16 #include <boost/algorithm/string.hpp>
17 
23 namespace Parameter
24 {
25 
35 class Parameter
36 {
37 public:
48  Parameter(const std::string& name, const std::string& type)
49  : name(name), type(type)
50  {
51  isParamValid = true;
52  }
56  virtual ~Parameter() {}
61  const std::string& getName() const { return name; }
66  const std::string& getType() const { return type; }
71  virtual const int getTypeByteSize() const = 0;
76  virtual const bool isTypeSigned() const = 0;
82  virtual const bool isTypeArithmetic() const = 0;
87  void setValid(const bool isParamValid) { this->isParamValid = isParamValid; }
92  const bool isValid() const { return isParamValid; }
93 
94 private:
95  std::string name;
96  std::string type;
97  bool isParamValid;
98 };
99 
109 template <typename T> class GenericParameter : public Parameter
110 {
111 public:
122  GenericParameter(const std::string& name, const std::string& type)
123  : Parameter(name, type)
124  {
125  }
130  const int getTypeByteSize() const { return sizeof(m_data); }
135  const bool isTypeSigned() const { return std::is_signed<T>(); }
141  const bool isTypeArithmetic() const { return std::is_arithmetic<T>(); }
146  void setData(const T& m_data) { this->m_data = m_data; }
151  const T& getData() const { return m_data; }
152 
153 private:
154  T m_data;
155 };
156 
164 {
165 public:
170  {
171  parameters = std::unordered_map<std::string, std::shared_ptr<Parameter>>();
172  }
178  const bool isParamInMap(const std::string& name) const
179  {
180  return parameters.find(name) != parameters.end();
181  }
186  const int size() const { return parameters.size(); }
192  std::string toString() const
193  {
194  std::stringstream ss = std::stringstream();
195  for (auto item : parameters)
196  {
197  ss << "Name: " << item.first << ", Type: " << item.second->getType()
198  << "\n";
199  }
200  ss << "List size: " << size();
201  return ss.str();
202  }
203 
218  template <typename T>
219  void insertParameter(const std::string& name, const std::string& type,
220  const T& value, const bool isValid = true)
221  {
222  std::shared_ptr<Parameter> param =
223  std::shared_ptr<Parameter>(new GenericParameter<T>(name, type));
224  param->setValid(isValid);
225  std::dynamic_pointer_cast<GenericParameter<T>>(param)->setData(value);
226  parameters.insert(std::make_pair(name, param));
227  }
234  template <typename T>
235  void getParameterValue(const std::string& name, T& value) const
236  {
237  if (parameters.find(name) == parameters.end())
238  throw std::out_of_range("Key: \"" + name + "\" not in Map!");
239  if (sizeof(value) > parameters.at(name)->getTypeByteSize())
240  throw std::invalid_argument("Key: \"" + name + "\" with Type: \"" +
241  parameters.at(name)->getType() +
242  "\" doesn't match given variable type.");
243  value = std::dynamic_pointer_cast<GenericParameter<T>>(parameters.at(name))
244  ->getData();
245  }
251  template <typename T>
252  const std::shared_ptr<GenericParameter<T>>&
253  getDynamicParameter(const std::string& name) const
254  {
255  if (parameters.find(name) == parameters.end())
256  throw std::out_of_range("Key: \"" + name + "\" not in Map!");
257  return std::dynamic_pointer_cast<GenericParameter<T>>(parameters.at(name));
258  }
259  const std::shared_ptr<Parameter>& getParameter(const std::string& name) const
260  {
261  if (parameters.find(name) == parameters.end())
262  throw std::out_of_range("Key: \"" + name + "\" not in Map!");
263  return parameters.at(name);
264  }
271  void getParameterValueAsString(const std::string& name,
272  std::string& out) const
273  {
274  if (parameters.find(name) == parameters.end())
275  throw std::out_of_range("Key: \"" + name + "\" not in Map!");
276  const std::string& type = parameters.at(name)->getType();
277  int size = getParameter(name)->getTypeByteSize();
278  bool isSigned = getParameter(name)->isTypeSigned();
279  bool isArithmetic = getParameter(name)->isTypeArithmetic();
280  if (type.compare("int8_t") == 0)
281  {
282  if (size > 1 || !isSigned || !isArithmetic)
283  throw std::invalid_argument("Parameter typename \"" + type +
284  "\" doesn't match given variable type!");
285  char value;
286  getParameterValue(name, value);
287  out = std::to_string(static_cast<int>(value));
288  }
289  else if (type.compare("uint8_t") == 0)
290  {
291  if (size > 1 || isSigned || !isArithmetic)
292  throw std::invalid_argument("Parameter typename \"" + type +
293  "\" doesn't match given variable type!");
294  unsigned char value;
295  getParameterValue(name, value);
296  out = std::to_string(static_cast<unsigned int>(value));
297  }
298  else if (type.compare("int16_t") == 0)
299  {
300  if (size > 2 || !isSigned || !isArithmetic)
301  throw std::invalid_argument("Parameter typename \"" + type +
302  "\" doesn't match given variable type!");
303  short value;
304  getParameterValue(name, value);
305  out = std::to_string(static_cast<int>(value));
306  }
307  else if (type.compare("uint16_t") == 0)
308  {
309  if (size > 2 || isSigned || !isArithmetic)
310  throw std::invalid_argument("Parameter typename \"" + type +
311  "\" doesn't match given variable type!");
312  unsigned short value;
313  getParameterValue(name, value);
314  out = std::to_string(static_cast<unsigned int>(value));
315  }
316  else if (type.compare("int32_t") == 0)
317  {
318  if (size > 4 || !isSigned || !isArithmetic)
319  throw std::invalid_argument("Parameter typename \"" + type +
320  "\" doesn't match given variable type!");
321  int value;
322  getParameterValue(name, value);
323  out = std::to_string(value);
324  }
325  else if (type.compare("uint32_t") == 0)
326  {
327  if (size > 4 || isSigned || !isArithmetic)
328  throw std::invalid_argument("Parameter typename \"" + type +
329  "\" doesn't match given variable type!");
330  unsigned int value;
331  getParameterValue(name, value);
332  out = std::to_string(value);
333  }
334  else if (type.compare("int64_t") == 0)
335  {
336  if (size > 8 || !isSigned || !isArithmetic)
337  throw std::invalid_argument("Parameter typename \"" + type +
338  "\" doesn't match given variable type!");
339  long value;
340  getParameterValue(name, value);
341  out = std::to_string(value);
342  }
343  else if (type.compare("uint64_t") == 0)
344  {
345  if (size > 8 || isSigned || !isArithmetic)
346  throw std::invalid_argument("Parameter typename \"" + type +
347  "\" doesn't match given variable type!");
348  unsigned long value;
349  getParameterValue(name, value);
350  out = std::to_string(value);
351  }
352  else if (type.compare("float32_t") == 0)
353  {
354  if (size > 4 || !isArithmetic)
355  throw std::invalid_argument("Parameter typename \"" + type +
356  "\" doesn't match given variable type!");
357  float value;
358  getParameterValue(name, value);
359  out = std::to_string(value);
360  }
361  else if (type.compare("float64_t") == 0)
362  {
363  if (size > 8 || !isArithmetic)
364  throw std::invalid_argument("Parameter typename \"" + type +
365  "\" doesn't match given variable type!");
366  double value;
367  getParameterValue(name, value);
368  out = std::to_string(value);
369  }
370  else if (type.compare("string_t") == 0)
371  {
372  // wie string type mismatch bestimmen ?
373  if (isArithmetic)
374  throw std::invalid_argument("Parameter typename \"" + type +
375  "\" doesn't match given variable type!");
376  getParameterValue(name, out);
377  }
378  else if (type.compare("string_t[]") == 0)
379  {
380  if (isArithmetic)
381  throw std::invalid_argument("Parameter typename \"" + type +
382  "\" doesn't match given variable type!");
383  // wie string type mismatch bestimmen ?
384  std::vector<std::string> sArray;
385  getParameterValue(name, sArray);
386  std::stringstream ss = std::stringstream();
387  for (std::string s : sArray)
388  {
389  ss << " " << s;
390  }
391  out = ss.str().substr(1, std::string::npos);
392  }
393  else
394  {
395  throw std::invalid_argument("Parameter typename \"" + type +
396  "\" is an unsupported type!");
397  }
398  }
406  void setParameterValueAsString(const std::string& name,
407  const std::string& input,
408  const bool isValid = true)
409  {
410  if (parameters.find(name) == parameters.end())
411  throw std::out_of_range("Key: \"" + name + "\" not in Map!");
412  parameters[name]->setValid(isValid);
413  if (!isValid)
414  {
415  return;
416  }
417  const std::string& type = parameters.at(name)->getType();
418  int size = getParameter(name)->getTypeByteSize();
419  bool isSigned = getParameter(name)->isTypeSigned();
420  bool isArithmetic = getParameter(name)->isTypeArithmetic();
421  if (type.compare("int8_t") == 0)
422  {
423  if (size > 1 || !isSigned || !isArithmetic)
424  throw std::invalid_argument("Parameter typename \"" + type +
425  "\" doesn't match stored variable type!");
426  int value = std::stoi(input);
427  std::dynamic_pointer_cast<GenericParameter<char>>(parameters[name])
428  ->setData(static_cast<char>(value));
429  }
430  else if (type.compare("uint8_t") == 0)
431  {
432  if (size > 1 || isSigned || !isArithmetic)
433  throw std::invalid_argument("Parameter typename \"" + type +
434  "\" doesn't match stored variable type!");
435  unsigned long value = std::stoul(input);
436  std::dynamic_pointer_cast<GenericParameter<unsigned char>>(
437  parameters[name])->setData(static_cast<unsigned char>(value));
438  }
439  else if (type.compare("int16_t") == 0)
440  {
441  if (size > 2 || !isSigned || !isArithmetic)
442  throw std::invalid_argument("Parameter typename \"" + type +
443  "\" doesn't match stored variable type!");
444  int value = std::stoi(input);
445  std::dynamic_pointer_cast<GenericParameter<short>>(parameters[name])
446  ->setData(static_cast<short>(value));
447  }
448  else if (type.compare("uint16_t") == 0)
449  {
450  if (size > 2 || isSigned || !isArithmetic)
451  throw std::invalid_argument("Parameter typename \"" + type +
452  "\" doesn't match stored variable type!");
453  unsigned long value = std::stoul(input);
454  std::dynamic_pointer_cast<GenericParameter<unsigned short>>(
455  parameters[name])->setData(static_cast<unsigned short>(value));
456  }
457  else if (type.compare("int32_t") == 0)
458  {
459  if (size > 4 || !isSigned || !isArithmetic)
460  throw std::invalid_argument("Parameter typename \"" + type +
461  "\" doesn't match stored variable type!");
462  int value = std::stoi(input);
463  std::dynamic_pointer_cast<GenericParameter<int>>(parameters[name])
464  ->setData(value);
465  }
466  else if (type.compare("uint32_t") == 0)
467  {
468  if (size > 4 || isSigned || !isArithmetic)
469  throw std::invalid_argument("Parameter typename \"" + type +
470  "\" doesn't match stored variable type!");
471  unsigned long value = std::stoul(input);
472  std::dynamic_pointer_cast<GenericParameter<unsigned int>>(
473  parameters[name])->setData(value);
474  }
475  else if (type.compare("int64_t") == 0)
476  {
477  if (size > 8 || !isSigned || !isArithmetic)
478  throw std::invalid_argument("Parameter typename \"" + type +
479  "\" doesn't match stored variable type!");
480  long value = std::stol(input);
481  std::dynamic_pointer_cast<GenericParameter<long long>>(parameters[name])
482  ->setData(value);
483  }
484  else if (type.compare("uint64_t") == 0)
485  {
486  if (size > 8 || isSigned || !isArithmetic)
487  throw std::invalid_argument("Parameter typename \"" + type +
488  "\" doesn't match stored variable type!");
489  unsigned long value = std::stoul(input);
490  std::dynamic_pointer_cast<GenericParameter<unsigned long long>>(
491  parameters[name])->setData(value);
492  }
493  else if (type.compare("float32_t") == 0)
494  {
495  if (size > 4 || !isArithmetic)
496  throw std::invalid_argument("Parameter typename \"" + type +
497  "\" doesn't match stored variable type!");
498  float value = std::stof(input);
499  std::dynamic_pointer_cast<GenericParameter<float>>(parameters[name])
500  ->setData(value);
501  }
502  else if (type.compare("float64_t") == 0)
503  {
504  if (size > 8 || !isArithmetic)
505  throw std::invalid_argument("Parameter typename \"" + type +
506  "\" doesn't match stored variable type!");
507  double value = std::stod(input);
508  std::dynamic_pointer_cast<GenericParameter<double>>(parameters[name])
509  ->setData(value);
510  }
511  else if (type.compare("string_t") == 0)
512  {
513  if (isArithmetic)
514  throw std::invalid_argument("Parameter typename \"" + type +
515  "\" doesn't match stored variable type!");
516  std::dynamic_pointer_cast<GenericParameter<std::string>>(parameters[name])
517  ->setData(input);
518  }
519  else if (type.compare("string_t[]") == 0)
520  {
521  if (isArithmetic)
522  throw std::invalid_argument("Parameter typename \"" + type +
523  "\" doesn't match stored variable type!");
524  std::vector<std::string> split;
525  boost::split(split, input, boost::is_any_of(" "));
526 
527  std::dynamic_pointer_cast<GenericParameter<std::vector<std::string>>>(
528  parameters[name])->setData(split);
529  }
530  else
531  {
532  throw std::invalid_argument("Parameter typename \"" + type +
533  "\" is an unsupported type!");
534  }
535  }
552  void insertParameter(const std::string& name, const std::string& type,
553  const bool isValid = true)
554  {
555  std::shared_ptr<Parameter> param;
556 
557  if (type.compare("int8_t") == 0)
558  {
559  char value = 0;
560  param =
561  std::shared_ptr<Parameter>(new GenericParameter<char>(name, type));
562  std::dynamic_pointer_cast<GenericParameter<char>>(param)->setData(value);
563  }
564  else if (type.compare("uint8_t") == 0)
565  {
566  unsigned char value = 0;
567  param = std::shared_ptr<Parameter>(
569  std::dynamic_pointer_cast<GenericParameter<unsigned char>>(param)
570  ->setData(value);
571  }
572  else if (type.compare("int16_t") == 0)
573  {
574  short value = 0;
575  param =
576  std::shared_ptr<Parameter>(new GenericParameter<short>(name, type));
577  std::dynamic_pointer_cast<GenericParameter<short>>(param)->setData(value);
578  }
579  else if (type.compare("uint16_t") == 0)
580  {
581  unsigned short value = 0;
582  param = std::shared_ptr<Parameter>(
584  std::dynamic_pointer_cast<GenericParameter<unsigned short>>(param)
585  ->setData(value);
586  }
587  else if (type.compare("int32_t") == 0)
588  {
589  int value = 0;
590  param = std::shared_ptr<Parameter>(new GenericParameter<int>(name, type));
591  std::dynamic_pointer_cast<GenericParameter<int>>(param)->setData(value);
592  }
593  else if (type.compare("uint32_t") == 0)
594  {
595  unsigned int value = 0;
596  param = std::shared_ptr<Parameter>(
598  std::dynamic_pointer_cast<GenericParameter<unsigned int>>(param)
599  ->setData(value);
600  }
601  else if (type.compare("int64_t") == 0)
602  {
603  long value = 0;
604  param =
605  std::shared_ptr<Parameter>(new GenericParameter<long>(name, type));
606  std::dynamic_pointer_cast<GenericParameter<long>>(param)->setData(value);
607  }
608  else if (type.compare("uint64_t") == 0)
609  {
610  unsigned long value = 0;
611  param = std::shared_ptr<Parameter>(
613  std::dynamic_pointer_cast<GenericParameter<unsigned long>>(param)
614  ->setData(value);
615  }
616  else if (type.compare("float32_t") == 0)
617  {
618  float value = 0.0;
619  param =
620  std::shared_ptr<Parameter>(new GenericParameter<float>(name, type));
621  std::dynamic_pointer_cast<GenericParameter<float>>(param)->setData(value);
622  }
623  else if (type.compare("float64_t") == 0)
624  {
625  double value = 0.0;
626  param =
627  std::shared_ptr<Parameter>(new GenericParameter<double>(name, type));
628  std::dynamic_pointer_cast<GenericParameter<double>>(param)
629  ->setData(value);
630  }
631  else if (type.compare("string_t") == 0)
632  {
633  param = std::shared_ptr<Parameter>(
635  std::dynamic_pointer_cast<GenericParameter<std::string>>(param)
636  ->setData("no value");
637  }
638  else if (type.compare("string_t[]") == 0)
639  {
640  std::vector<std::string> value;
641  param = std::shared_ptr<Parameter>(
643  std::dynamic_pointer_cast<GenericParameter<std::vector<std::string>>>(
644  param)->setData(value);
645  }
646  else
647  {
648  throw std::invalid_argument("Parameter typename \"" + type +
649  "\" is an unsupported type!");
650  }
651  param->setValid(isValid);
652 
653  parameters.insert(std::make_pair(name, param));
654  }
655 
656 private:
657  std::unordered_map<std::string, std::shared_ptr<Parameter>> parameters;
659 };
660 }
661 #endif // PARAMETER_H
ParameterMap()
Parameter::ParameterMap constructor.
Definition: parameter.h:169
const std::shared_ptr< GenericParameter< T > > & getDynamicParameter(const std::string &name) const
Get the dynamic typed parameter contained in this map with the given name.
Definition: parameter.h:253
const std::string & getName() const
Get the name of this parameter.
Definition: parameter.h:61
Classes in this Namespace implement dynamic type functionality.
std::string toString() const
Get the string representation of all parameters contained within this map.
Definition: parameter.h:192
void setData(const T &m_data)
Set the value this paramter contains.
Definition: parameter.h:146
void setValid(const bool isParamValid)
Defines whether this paramters value is NaN/invalid or not.
Definition: parameter.h:87
const bool isTypeArithmetic() const
Is this parameter an arithmetic type?
Definition: parameter.h:141
void getParameterValueAsString(const std::string &name, std::string &out) const
Get the string representation of a value from a parameter in this map with the given name...
Definition: parameter.h:271
virtual ~Parameter()
Parameter::Parameter destructor.
Definition: parameter.h:56
The Parameter::ParameterMap class provides a map functionality for Parameter::Parameter objects conta...
Definition: parameter.h:163
const T & getData() const
Get the value this paramter contains.
Definition: parameter.h:151
std::string type
Definition: parameter.h:96
const bool isValid() const
Is this parameters value NaN/invalid?
Definition: parameter.h:92
The Parameter::GenericParameter class is a sub class of the Parameter::Parameter class.
Definition: parameter.h:109
const bool isParamInMap(const std::string &name) const
Is a parameter with the given name contained within this map?.
Definition: parameter.h:178
const std::string & getType() const
Get the type of this parameter.
Definition: parameter.h:66
Parameter(const std::string &name, const std::string &type)
Parameter::Parameter constructor.
Definition: parameter.h:48
void insertParameter(const std::string &name, const std::string &type, const bool isValid=true)
Insert a new parameter in this map, with the given name and type.
Definition: parameter.h:552
void insertParameter(const std::string &name, const std::string &type, const T &value, const bool isValid=true)
Insert a new parameter in this map, with the given name, type and value.
Definition: parameter.h:219
std::string name
Definition: parameter.h:95
const std::shared_ptr< Parameter > & getParameter(const std::string &name) const
Definition: parameter.h:259
const int size() const
Get the amount of parameters contained within this map.
Definition: parameter.h:186
void setParameterValueAsString(const std::string &name, const std::string &input, const bool isValid=true)
Set the value of a parameter in this map with the given name from a string.
Definition: parameter.h:406
const bool isTypeSigned() const
Get the sign of this parameter.
Definition: parameter.h:135
const int getTypeByteSize() const
Get the byte size of this parameter.
Definition: parameter.h:130
void getParameterValue(const std::string &name, T &value) const
Get the value of a parameter in this map with the given name.
Definition: parameter.h:235
GenericParameter(const std::string &name, const std::string &type)
Parameter::GenericParameter constructor.
Definition: parameter.h:122
std::unordered_map< std::string, std::shared_ptr< Parameter > > parameters
Definition: parameter.h:657


pses_ucbridge
Author(s): Sebastian Ehmes
autogenerated on Sat Oct 28 2017 19:16:13