18#ifndef SDFORMAT_PARAM_HH_
19#define SDFORMAT_PARAM_HH_
36#include <gz/math/Angle.hh>
37#include <gz/math/Color.hh>
38#include <gz/math/Pose3.hh>
39#include <gz/math/Quaternion.hh>
40#include <gz/math/Vector2.hh>
41#include <gz/math/Vector3.hh>
53#pragma warning(disable: 4251)
59 inline namespace SDF_VERSION_NAMESPACE {
91 if (s.
precision == std::numeric_limits<int>::max())
93 if constexpr (std::is_same_v<T, double>
94 || std::is_same_v<T, gz::math::Angle>
95 || std::is_same_v<T, gz::math::Vector2d>
96 || std::is_same_v<T, gz::math::Vector3d>
97 || std::is_same_v<T, gz::math::Quaterniond>
98 || std::is_same_v<T, gz::math::Pose3d>)
100 os << std::setprecision(std::numeric_limits<double>::max_digits10);
102 else if constexpr (std::is_same_v<T, float>
103 || std::is_same_v<T, gz::math::Color>)
105 os << std::setprecision(std::numeric_limits<float>::max_digits10);
117 template<
class... Ts>
121 std::visit([&os, &sv](
auto const &v)
140 public:
Param(
const std::string &_key,
const std::string &_typeName,
141 const std::string &_default,
bool _required,
142 const std::string &_description =
"");
152 public:
Param(
const std::string &_key,
const std::string &_typeName,
153 const std::string &_default,
bool _required,
155 const std::string &_description =
"");
167 public:
Param(
const std::string &_key,
const std::string &_typeName,
168 const std::string &_default,
bool _required,
169 const std::string &_minValue,
const std::string &_maxValue,
170 const std::string &_description =
"");
182 public:
Param(
const std::string &_key,
const std::string &_typeName,
183 const std::string &_default,
bool _required,
184 const std::string &_minValue,
const std::string &_maxValue,
186 const std::string &_description =
"");
281 bool _ignoreParentAttributes);
290 bool _ignoreParentAttributes,
356 public:
const std::string &
GetKey()
const;
361 public:
template<
typename Type>
389 public:
template<
typename T>
390 void SetUpdateFunc(T _updateFunc);
406 public:
template<
typename T>
407 bool Set(
const T &_value);
415 public:
template<
typename T>
416 bool Set(
const T &_value,
422 public:
bool GetAny(std::any &_anyVal)
const;
434 public:
template<
typename T>
435 bool Get(T &_value)
const;
442 public:
template<
typename T>
450 public:
template<
typename T>
451 bool GetDefault(T &_value)
const;
458 public:
template<
typename T>
459 bool GetDefault(T &_value,
491 private: std::unique_ptr<ParamPrivate> dataPtr;
524 public:
typedef std::variant<bool, char, std::string, int, std::uint64_t,
531 gz::math::Quaterniond,
565 public:
void Init(
const std::string &_key,
const std::string &_typeName,
566 const std::string &_default,
bool _required,
568 const std::string &_description);
580 public:
void Init(
const std::string &_key,
const std::string &_typeName,
581 const std::string &_default,
bool _required,
582 const std::string &_minValue,
const std::string &_maxValue,
584 const std::string &_description);
593 const std::string &_typeName,
594 const std::string &_valueStr,
608 const std::string &_typeName,
610 std::string &_valueStr,
615 public:
template<
typename T>
624 if constexpr (std::is_same_v<T, bool>)
626 else if constexpr (std::is_same_v<T, char>)
628 else if constexpr (std::is_same_v<T, std::string>)
630 else if constexpr (std::is_same_v<T, int>)
632 else if constexpr (std::is_same_v<T, std::uint64_t>)
634 else if constexpr (std::is_same_v<T, unsigned int>)
635 return "unsigned int";
636 else if constexpr (std::is_same_v<T, double>)
638 else if constexpr (std::is_same_v<T, float>)
640 else if constexpr (std::is_same_v<T, sdf::Time>)
642 else if constexpr (std::is_same_v<T, gz::math::Angle>)
644 else if constexpr (std::is_same_v<T, gz::math::Color>)
646 else if constexpr (std::is_same_v<T, gz::math::Vector2i>)
648 else if constexpr (std::is_same_v<T, gz::math::Vector2d>)
650 else if constexpr (std::is_same_v<T, gz::math::Vector3d>)
652 else if constexpr (std::is_same_v<T, gz::math::Quaterniond>)
654 else if constexpr (std::is_same_v<T, gz::math::Pose3d>)
664 this->dataPtr->updateFunc = _updateFunc;
672 bool result = this->Set<T>(_value, errors);
684 std::stringstream ss;
685 ss << ParamStreamer<T>{_value, std::numeric_limits<int>::max()};
691 "Unable to set parameter["
692 + this->dataPtr->key +
"]."
693 +
"Type used must have a stream input and output operator,"
694 +
"which allows proper functioning of Param."});
704 bool result = this->Get<T>(_value, errors);
714 T *value = std::get_if<T>(&this->dataPtr->value);
721 std::string typeStr = this->dataPtr->TypeToString<T>();
725 "Unknown parameter type[" + std::string(
typeid(T).name()) +
"]"});
731 bool success = this->dataPtr->ValueFromStringImpl(
732 typeStr, valueStr, pv, _errors);
736 _value = std::get<T>(pv);
738 else if (typeStr ==
"bool" && this->dataPtr->typeName ==
"string")
745 std::stringstream tmp;
746 if (valueStr ==
"true" || valueStr ==
"1")
766 bool result =
this>GetDefault<T>(_value, errors);
776 std::stringstream ss;
781 std::numeric_limits<int>::max()};
787 "Unable to convert parameter["
788 + this->dataPtr->key +
"] "
790 + this->dataPtr->typeName +
"], to "
791 +
"type[" +
typeid(T).name() +
"]"});
799 template<
typename Type>
802 return std::holds_alternative<Type>(this->dataPtr->value);
std::variant< bool, char, std::string, int, std::uint64_t, unsigned int, double, float, sdf::Time, gz::math::Angle, gz::math::Color, gz::math::Vector2i, gz::math::Vector2d, gz::math::Vector3d, gz::math::Quaterniond, gz::math::Pose3d > ParamVariant
Definition: Param.hh:532
void Init(const std::string &_key, const std::string &_typeName, const std::string &_default, bool _required, sdf::Errors &_errors, const std::string &_description)
Initializer function to help Param constructors.
static std::string TypeToString()
Data type to string mapping.
Definition: Param.hh:621
bool set
True if the parameter is set.
Definition: Param.hh:505
bool required
True if the parameter is required.
Definition: Param.hh:502
bool GZ_SDFORMAT_VISIBLE ValueFromStringImpl(const std::string &_typeName, const std::string &_valueStr, ParamVariant &_valueToSet, sdf::Errors &_errors) const
Method used to set the Param from a passed-in string.
ParamVariant defaultValue
This parameter's default value.
Definition: Param.hh:549
ElementWeakPtr parentElement
Parent element.
Definition: Param.hh:514
std::function< std::any()> updateFunc
Update function pointer.
Definition: Param.hh:517
std::string defaultStrValue
This parameter's default value that was provided as a string.
Definition: Param.hh:546
std::string typeName
Definition: Param.hh:508
void Init(const std::string &_key, const std::string &_typeName, const std::string &_default, bool _required, const std::string &_minValue, const std::string &_maxValue, sdf::Errors &_errors, const std::string &_description)
Initializer function to help Param constructors.
bool StringFromValueImpl(const PrintConfig &_config, const std::string &_typeName, const ParamVariant &_value, std::string &_valueStr, sdf::Errors &_errors) const
Method used to get the string representation from a ParamVariant, or the string that was used to set ...
bool ignoreParentAttributes
True if the value has been parsed while ignoring its parent element's attributes, and will continue t...
Definition: Param.hh:540
ParamVariant value
This parameter's value.
Definition: Param.hh:535
std::string key
Key value.
Definition: Param.hh:499
std::optional< ParamVariant > maxValue
This parameter's maximum allowed value.
Definition: Param.hh:555
std::optional< ParamVariant > minValue
This parameter's minimum allowed value.
Definition: Param.hh:552
std::optional< std::string > strValue
This parameter's value that was provided as a string.
Definition: Param.hh:543
std::string description
Description of the parameter.
Definition: Param.hh:511
A parameter class.
Definition: Param.hh:131
Param(Param &&_param) noexcept=default
Move constructor.
bool SetFromString(const std::string &_value, bool _ignoreParentAttributes)
Set the parameter value from a string.
ElementPtr GetParentElement() const
Get the parent Element of this Param.
Param & operator=(Param &&_param) noexcept=default
Move assignment operator.
std::string GetAsString(const PrintConfig &_config=PrintConfig()) const
Get the value as a string.
void SetDescription(const std::string &_desc)
Set the description of the parameter.
virtual ~Param()
Destructor.
std::optional< std::string > GetMaxValueAsString(sdf::Errors &_errors, const PrintConfig &_config=PrintConfig()) const
Get the maximum allowed value as a string.
Param(const std::string &_key, const std::string &_typeName, const std::string &_default, bool _required, const std::string &_minValue, const std::string &_maxValue, const std::string &_description="")
Constructor with min and max values.
void Update()
Set the parameter's value using the updateFunc.
Param(const std::string &_key, const std::string &_typeName, const std::string &_default, bool _required, const std::string &_minValue, const std::string &_maxValue, sdf::Errors &_errors, const std::string &_description="")
Constructor with min and max values.
std::string GetAsString(sdf::Errors &_errors, const PrintConfig &_config=PrintConfig()) const
Get the value as a string.
bool Set(const T &_value)
Set the parameter's value.
Definition: Param.hh:669
bool Reparse(sdf::Errors &_errors)
Reparse the parameter value.
void SetUpdateFunc(T _updateFunc)
Set the update function.
Definition: Param.hh:662
std::string GetDefaultAsString(const PrintConfig &_config=PrintConfig()) const
Get the default value as a string.
bool SetFromString(const std::string &_value, bool _ignoreParentAttributes, sdf::Errors &_errors)
Set the parameter value from a string.
bool SetParentElement(ElementPtr _parentElement, sdf::Errors &_errors)
Set the parent Element of this Param.
ParamPtr Clone() const
Clone the parameter.
Param(const Param &_param)
Copy constructor Note that the updateFunc member does not get copied.
Param & operator=(const Param &_param)
Copy assignment operator Note that the updateFunc member will not get copied.
friend std::ostream & operator<<(std::ostream &_out, const Param &_p)
Ostream operator.
Definition: Param.hh:483
const std::string & GetTypeName() const
Get the type name value.
bool SetFromString(const std::string &_value, sdf::Errors &_errors)
Set the parameter value from a string.
bool GetAny(std::any &_anyVal, sdf::Errors &_errors) const
Get the value of the parameter as a std::any.
Param(const std::string &_key, const std::string &_typeName, const std::string &_default, bool _required, const std::string &_description="")
Constructor.
std::optional< std::string > GetMinValueAsString(sdf::Errors &_errors, const PrintConfig &_config=PrintConfig()) const
Get the minimum allowed value as a string.
std::string GetDescription() const
Get the description of the parameter.
std::string GetDefaultAsString(sdf::Errors &_errors, const PrintConfig &_config=PrintConfig()) const
Get the default value as a string.
bool GetSet() const
Return true if the parameter has been set.
bool SetParentElement(ElementPtr _parentElement)
Set the parent Element of this Param.
Param(const std::string &_key, const std::string &_typeName, const std::string &_default, bool _required, sdf::Errors &_errors, const std::string &_description="")
Constructor.
void Update(sdf::Errors &_errors)
Set the parameter's value using the updateFunc.
std::optional< std::string > GetMinValueAsString(const PrintConfig &_config=PrintConfig()) const
Get the minimum allowed value as a string.
const std::string & GetKey() const
Get the key value.
bool ValidateValue() const
Validate the value against minimum and maximum allowed values.
bool Get(T &_value) const
Get the value of the parameter.
Definition: Param.hh:701
bool Reparse()
Reparse the parameter value.
bool IsType() const
Return true if the param is a particular type.
Definition: Param.hh:800
bool GetAny(std::any &_anyVal) const
Get the value of the parameter as a std::any.
bool IgnoresParentElementAttribute() const
Return true if the parameter ignores the parent element's attributes, or if the parameter has no pare...
void Reset()
Reset the parameter to the default value.
bool GetDefault(T &_value) const
Get the default value of the parameter.
Definition: Param.hh:763
std::optional< std::string > GetMaxValueAsString(const PrintConfig &_config=PrintConfig()) const
Get the maximum allowed value as a string.
bool GetRequired() const
Return whether the parameter is required.
bool SetFromString(const std::string &_value)
Set the parameter value from a string.
bool ValidateValue(sdf::Errors &_errors) const
Validate the value against minimum and maximum allowed values.
This class contains configuration options for printing elements.
Definition: PrintConfig.hh:33
A Time class, can be used to hold wall- or sim-time.
Definition: Types.hh:107
#define sdferr
Output an error message.
Definition: Console.hh:57
class GZ_SDFORMAT_VISIBLE Element
Definition: Element.hh:51
std::shared_ptr< Param > ParamPtr
Definition: Param.hh:70
std::vector< ParamPtr > Param_V
Definition: Param.hh:74
std::ostream & operator<<(std::ostream &os, ParamStreamer< T > s)
Definition: Param.hh:89
std::string GZ_SDFORMAT_VISIBLE lowercase(const std::string &_in)
Transforms a string to its lowercase equivalent.
@ PARAMETER_ERROR
Generic error type for parameters (values of SDFormat elements or attributes).
@ UNKNOWN_PARAMETER_TYPE
The specified parameter (values of SDFormat elements or attributes) type is unknown.
std::vector< Error > Errors
A vector of Error.
Definition: Types.hh:95
std::weak_ptr< Element > ElementWeakPtr
Definition: Element.hh:63
std::shared_ptr< Element > ElementPtr
Definition: Element.hh:55
namespace for Simulation Description Format parser
Definition: Actor.hh:35
const int precision
Definition: Param.hh:83
const T & val
Definition: Param.hh:82
ParamStreamer(const T &_val, int _precision=0)
Definition: Param.hh:84
#define SDFORMAT_VISIBLE
Use to represent "symbol visible" if supported.
Definition: system_util.hh:25