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);
SDF Element class.
Definition: Element.hh:76
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.
std::optional< std::string > GetMaxValueAsString(const PrintConfig &_config=PrintConfig()) const
Get the maximum allowed value as a string.
const std::string & GetTypeName() const
Get the type name value.
const std::string & GetKey() const
Get the key value.
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.
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
friend std::ostream & operator<<(std::ostream &_out, const Param &_p)
Ostream operator.
Definition: Param.hh:483
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.
Param & operator=(const Param &_param)
Copy assignment operator Note that the updateFunc member will not get copied.
ParamPtr Clone() const
Clone the parameter.
Param(const Param &_param)
Copy constructor Note that the updateFunc member does not get copied.
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::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 > GetMaxValueAsString(sdf::Errors &_errors, const PrintConfig &_config=PrintConfig()) const
Get the maximum allowed value as a string.
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.
std::optional< std::string > GetMinValueAsString(sdf::Errors &_errors, const PrintConfig &_config=PrintConfig()) const
Get the minimum allowed value as a string.
bool GetDefault(T &_value) const
Get the default value of the parameter.
Definition: Param.hh:763
bool GetRequired() const
Return whether the parameter is required.
std::optional< std::string > GetMinValueAsString(const PrintConfig &_config=PrintConfig()) const
Get the minimum allowed value as a string.
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
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