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>
45#include "sdf/config.hh"
53#pragma warning(disable: 4251)
59 inline namespace SDF_VERSION_NAMESPACE {
89 template<
typename ParamVariant>
96 if (s.
precision == std::numeric_limits<int>::max())
98 if constexpr (std::is_same_v<T, double>
99 || std::is_same_v<T, gz::math::Angle>
100 || std::is_same_v<T, gz::math::Vector2d>
101 || std::is_same_v<T, gz::math::Vector3d>
102 || std::is_same_v<T, gz::math::Quaterniond>
103 || std::is_same_v<T, gz::math::Pose3d>)
105 os << std::setprecision(std::numeric_limits<double>::max_digits10);
107 else if constexpr (std::is_same_v<T, float>
108 || std::is_same_v<T, gz::math::Color>)
110 os << std::setprecision(std::numeric_limits<float>::max_digits10);
122 template<
class... Ts>
126 std::visit([&os, &sv](
auto const &v)
145 public:
Param(
const std::string &_key,
const std::string &_typeName,
146 const std::string &_default,
bool _required,
147 const std::string &_description =
"");
157 public:
Param(
const std::string &_key,
const std::string &_typeName,
158 const std::string &_default,
bool _required,
160 const std::string &_description =
"");
172 public:
Param(
const std::string &_key,
const std::string &_typeName,
173 const std::string &_default,
bool _required,
174 const std::string &_minValue,
const std::string &_maxValue,
175 const std::string &_description =
"");
187 public:
Param(
const std::string &_key,
const std::string &_typeName,
188 const std::string &_default,
bool _required,
189 const std::string &_minValue,
const std::string &_maxValue,
191 const std::string &_description =
"");
286 bool _ignoreParentAttributes);
295 bool _ignoreParentAttributes,
369 public:
const std::string &
GetKey()
const;
374 public:
template<
typename Type>
402 public:
template<
typename T>
403 void SetUpdateFunc(T _updateFunc);
419 public:
template<
typename T>
420 bool Set(
const T &_value);
428 public:
template<
typename T>
429 bool Set(
const T &_value,
435 public:
bool GetAny(std::any &_anyVal)
const;
447 public:
template<
typename T>
448 bool Get(T &_value)
const;
455 public:
template<
typename T>
463 public:
template<
typename T>
464 bool GetDefault(T &_value)
const;
471 public:
template<
typename T>
472 bool GetDefault(T &_value,
504 private: std::unique_ptr<ParamPrivate> dataPtr;
537 public:
typedef std::variant<bool, char, std::string, int, std::uint64_t,
544 gz::math::Quaterniond,
578 public:
void Init(
const std::string &_key,
const std::string &_typeName,
579 const std::string &_default,
bool _required,
581 const std::string &_description);
593 public:
void Init(
const std::string &_key,
const std::string &_typeName,
594 const std::string &_default,
bool _required,
595 const std::string &_minValue,
const std::string &_maxValue,
597 const std::string &_description);
606 const std::string &_typeName,
607 const std::string &_valueStr,
621 const std::string &_typeName,
623 std::string &_valueStr,
628 public:
template<
typename T>
637 if constexpr (std::is_same_v<T, bool>)
639 else if constexpr (std::is_same_v<T, char>)
641 else if constexpr (std::is_same_v<T, std::string>)
643 else if constexpr (std::is_same_v<T, int>)
645 else if constexpr (std::is_same_v<T, std::uint64_t>)
647 else if constexpr (std::is_same_v<T, unsigned int>)
648 return "unsigned int";
649 else if constexpr (std::is_same_v<T, double>)
651 else if constexpr (std::is_same_v<T, float>)
653 else if constexpr (std::is_same_v<T, sdf::Time>)
655 else if constexpr (std::is_same_v<T, gz::math::Angle>)
657 else if constexpr (std::is_same_v<T, gz::math::Color>)
659 else if constexpr (std::is_same_v<T, gz::math::Vector2i>)
661 else if constexpr (std::is_same_v<T, gz::math::Vector2d>)
663 else if constexpr (std::is_same_v<T, gz::math::Vector3d>)
665 else if constexpr (std::is_same_v<T, gz::math::Quaterniond>)
667 else if constexpr (std::is_same_v<T, gz::math::Pose3d>)
677 this->dataPtr->updateFunc = _updateFunc;
685 bool result = this->Set<T>(_value, errors);
697 std::stringstream ss;
698 ss << ParamStreamer<T>{_value, std::numeric_limits<int>::max()};
704 "Unable to set parameter["
705 + this->dataPtr->key +
"]."
706 +
"Type used must have a stream input and output operator,"
707 +
"which allows proper functioning of Param."});
717 bool result = this->Get<T>(_value, errors);
727 T *value = std::get_if<T>(&this->dataPtr->value);
734 std::string typeStr = this->dataPtr->TypeToString<T>();
738 "Unknown parameter type[" + std::string(
typeid(T).name()) +
"]"});
744 bool success = this->dataPtr->ValueFromStringImpl(
745 typeStr, valueStr, pv, _errors);
749 _value = std::get<T>(pv);
763 bool result =
this>GetDefault<T>(_value, errors);
773 std::stringstream ss;
778 std::numeric_limits<int>::max()};
784 "Unable to convert parameter["
785 + this->dataPtr->key +
"] "
787 + this->dataPtr->typeName +
"], to "
788 +
"type[" +
typeid(T).name() +
"]"});
796 template<
typename Type>
799 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:545
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:634
bool set
True if the parameter is set.
Definition Param.hh:518
bool required
True if the parameter is required.
Definition Param.hh:515
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:562
ElementWeakPtr parentElement
Parent element.
Definition Param.hh:527
std::function< std::any()> updateFunc
Update function pointer.
Definition Param.hh:530
std::string defaultStrValue
This parameter's default value that was provided as a string.
Definition Param.hh:559
std::string typeName
Definition Param.hh:521
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:553
ParamVariant value
This parameter's value.
Definition Param.hh:548
std::string key
Key value.
Definition Param.hh:512
std::optional< ParamVariant > maxValue
This parameter's maximum allowed value.
Definition Param.hh:568
std::optional< ParamVariant > minValue
This parameter's minimum allowed value.
Definition Param.hh:565
std::optional< std::string > strValue
This parameter's value that was provided as a string.
Definition Param.hh:556
std::string description
Description of the parameter.
Definition Param.hh:524
A parameter class.
Definition Param.hh:136
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.
bool SetParentElementNoReparse(ElementPtr _parentElement)
Set the parent Element of this Param without reparsing.
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:682
bool Reparse(sdf::Errors &_errors)
Reparse the parameter value.
void SetUpdateFunc(T _updateFunc)
Set the update function.
Definition Param.hh:675
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:496
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:714
bool Reparse()
Reparse the parameter value.
bool IsType() const
Return true if the param is a particular type.
Definition Param.hh:797
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:760
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:92
#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:94
@ 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:80
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